From: Ivan Tashkinov Date: Thu, 2 Jul 2020 13:36:54 +0000 (+0300) Subject: Merge remote-tracking branch 'remotes/origin/develop' into 2168-media-preview-proxy X-Git-Url: http://git.squeep.com/?a=commitdiff_plain;h=61180ab6f4b85ab78de2eaf1bc1b974c9e7908af;hp=0e23138b50f1fdd9ea78df31eec1b3caac905e2c;p=akkoma Merge remote-tracking branch 'remotes/origin/develop' into 2168-media-preview-proxy # Conflicts: # config/config.exs # lib/pleroma/web/media_proxy/media_proxy.ex # lib/pleroma/web/media_proxy/media_proxy_controller.ex --- diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e596aa0ec..5c12647a0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: elixir:1.8.1 +image: elixir:1.9.4 variables: &global_variables POSTGRES_DB: pleroma_test @@ -172,8 +172,7 @@ stop_review_app: amd64: stage: release - # TODO: Replace with upstream image when 1.9.0 comes out - image: rinpatch/elixir:1.9.0-rc.0 + image: elixir:1.10.3 only: &release-only - stable@pleroma/pleroma - develop@pleroma/pleroma @@ -210,8 +209,7 @@ amd64-musl: stage: release artifacts: *release-artifacts only: *release-only - # TODO: Replace with upstream image when 1.9.0 comes out - image: rinpatch/elixir:1.9.0-rc.0-alpine + image: elixir:1.10.3-alpine cache: *release-cache variables: *release-variables before_script: &before-release-musl @@ -227,8 +225,7 @@ arm: only: *release-only tags: - arm32 - # TODO: Replace with upstream image when 1.9.0 comes out - image: rinpatch/elixir:1.9.0-rc.0-arm + image: elixir:1.10.3 cache: *release-cache variables: *release-variables before_script: *before-release @@ -240,8 +237,7 @@ arm-musl: only: *release-only tags: - arm32 - # TODO: Replace with upstream image when 1.9.0 comes out - image: rinpatch/elixir:1.9.0-rc.0-arm-alpine + image: elixir:1.10.3-alpine cache: *release-cache variables: *release-variables before_script: *before-release-musl @@ -253,8 +249,7 @@ arm64: only: *release-only tags: - arm - # TODO: Replace with upstream image when 1.9.0 comes out - image: rinpatch/elixir:1.9.0-rc.0-arm64 + image: elixir:1.10.3 cache: *release-cache variables: *release-variables before_script: *before-release @@ -267,7 +262,7 @@ arm64-musl: tags: - arm # TODO: Replace with upstream image when 1.9.0 comes out - image: rinpatch/elixir:1.9.0-rc.0-arm64-alpine + image: elixir:1.10.3-alpine cache: *release-cache variables: *release-variables before_script: *before-release-musl diff --git a/.gitlab/issue_templates/Bug.md b/.gitlab/issue_templates/Bug.md index 66fbc510e..9ce9b6918 100644 --- a/.gitlab/issue_templates/Bug.md +++ b/.gitlab/issue_templates/Bug.md @@ -14,7 +14,7 @@ * Pleroma version (could be found in the "Version" tab of settings in Pleroma-FE): * Elixir version (`elixir -v` for from source installations, N/A for OTP): * Operating system: -* PostgreSQL version (`postgres -V`): +* PostgreSQL version (`psql -V`): ### Bug description diff --git a/CHANGELOG.md b/CHANGELOG.md index 66b160a94..335d29195 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,33 +6,61 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [unreleased] ### Changed +- **Breaking:** Elixir >=1.9 is now required (was >= 1.8) +- In Conversations, return only direct messages as `last_status` +- Using the `only_media` filter on timelines will now exclude reblog media +- MFR policy to set global expiration for all local Create activities +- OGP rich media parser merged with TwitterCard +- Configuration: `:instance, rewrite_policy` moved to `:mrf, policies`, `:instance, :mrf_transparency` moved to `:mrf, :transparency`, `:instance, :mrf_transparency_exclusions` moved to `:mrf, :transparency_exclusions`. Old config namespace is deprecated. +
API Changes + - **Breaking:** Emoji API: changed methods and renamed routes. +- Streaming: Repeats of a user's posts will no longer be pushed to the user's stream. +
+ +
+ Admin API Changes + +- Status visibility stats: now can return stats per instance. + +- Mix task to refresh counter cache (`mix pleroma.refresh_counter_cache`)
### Removed - **Breaking:** removed `with_move` parameter from notifications timeline. ### Added + +- Chats: Added support for federated chats. For details, see the docs. +- ActivityPub: Added support for existing AP ids for instances migrated from Mastodon. - Instance: Add `background_image` to configuration and `/api/v1/instance` - Instance: Extend `/api/v1/instance` with Pleroma-specific information. - NodeInfo: `pleroma:api/v1/notifications:include_types_filter` to the `features` list. - NodeInfo: `pleroma_emoji_reactions` to the `features` list. - Configuration: `:restrict_unauthenticated` setting, restrict access for unauthenticated users to timelines (public and federate), user profiles and statuses. - Configuration: Add `:database_config_whitelist` setting to whitelist settings which can be configured from AdminFE. +- Configuration: `filename_display_max_length` option to set filename truncate limit, if filename display enabled (0 = no limit). - New HTTP adapter [gun](https://github.com/ninenines/gun). Gun adapter requires minimum OTP version of 22.2 otherwise Pleroma won’t start. For hackney OTP update is not required. - Mix task to create trusted OAuth App. +- Mix task to reset MFA for user accounts - Notifications: Added `follow_request` notification type. - Added `:reject_deletes` group to SimplePolicy +- MRF (`EmojiStealPolicy`): New MRF Policy which allows to automatically download emojis from remote instances +- Support pagination in emoji packs API (for packs and for files in pack) +
API Changes +- Mastodon API: Add pleroma.parents_visible field to statuses. - Mastodon API: Extended `/api/v1/instance`. - Mastodon API: Support for `include_types` in `/api/v1/notifications`. - Mastodon API: Added `/api/v1/notifications/:id/dismiss` endpoint. - Mastodon API: Add support for filtering replies in public and home timelines +- Mastodon API: Support for `bot` field in `/api/v1/accounts/update_credentials` - Admin API: endpoints for create/update/delete OAuth Apps. - Admin API: endpoint for status view. +- OTP: Add command to reload emoji packs
### Fixed @@ -41,12 +69,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix follower/blocks import when nicknames starts with @ - Filtering of push notifications on activities from blocked domains - Resolving Peertube accounts with Webfinger +- `blob:` urls not being allowed by connect-src CSP +- Mastodon API: fix `GET /api/v1/notifications` not returning the full result set ## [Unreleased (patch)] ### Fixed - Healthcheck reporting the number of memory currently used, rather than allocated in total -- `InsertSkeletonsForDeletedUsers` failing on some instances +- `InsertSkeletonsForDeletedUsers` failing on some instances ## [2.0.3] - 2020-05-02 @@ -79,6 +109,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). 2. Run database migrations (inside Pleroma directory): - OTP: `./bin/pleroma_ctl migrate` - From Source: `mix ecto.migrate` +3. Reset status visibility counters (inside Pleroma directory): + - OTP: `./bin/pleroma_ctl refresh_counter_cache` + - From Source: `mix pleroma.refresh_counter_cache` ## [2.0.2] - 2020-04-08 diff --git a/README.md b/README.md index 7fc1fd381..6ca3118fb 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,16 @@ Currently Pleroma is not packaged by any OS/Distros, but if you want to package ### Docker While we don’t provide docker files, other people have written very good ones. Take a look at or . +### Compilation Troubleshooting +If you ever encounter compilation issues during the updating of Pleroma, you can try these commands and see if they fix things: + +- `mix deps.clean --all` +- `mix local.rebar` +- `mix local.hex` +- `rm -r _build` + +If you are not developing Pleroma, it is better to use the OTP release, which comes with everything precompiled. + ## Documentation - Latest Released revision: - Latest Git revision: diff --git a/benchmarks/load_testing/activities.ex b/benchmarks/load_testing/activities.ex index ff0d481a8..074ded457 100644 --- a/benchmarks/load_testing/activities.ex +++ b/benchmarks/load_testing/activities.ex @@ -22,8 +22,21 @@ defmodule Pleroma.LoadTesting.Activities do @max_concurrency 10 @visibility ~w(public private direct unlisted) - @types ~w(simple emoji mentions hell_thread attachment tag like reblog simple_thread remote) - @groups ~w(user friends non_friends) + @types [ + :simple, + :emoji, + :mentions, + :hell_thread, + :attachment, + :tag, + :like, + :reblog, + :simple_thread + ] + @groups [:friends_local, :friends_remote, :non_friends_local, :non_friends_local] + @remote_groups [:friends_remote, :non_friends_remote] + @friends_groups [:friends_local, :friends_remote] + @non_friends_groups [:non_friends_local, :non_friends_remote] @spec generate(User.t(), keyword()) :: :ok def generate(user, opts \\ []) do @@ -34,33 +47,24 @@ defmodule Pleroma.LoadTesting.Activities do opts = Keyword.merge(@defaults, opts) - friends = - user - |> Users.get_users(limit: opts[:friends_used], local: :local, friends?: true) - |> Enum.shuffle() + users = Users.prepare_users(user, opts) - non_friends = - user - |> Users.get_users(limit: opts[:non_friends_used], local: :local, friends?: false) - |> Enum.shuffle() + {:ok, _} = Agent.start_link(fn -> users[:non_friends_remote] end, name: :non_friends_remote) task_data = for visibility <- @visibility, type <- @types, - group <- @groups, + group <- [:user | @groups], do: {visibility, type, group} IO.puts("Starting generating #{opts[:iterations]} iterations of activities...") - friends_thread = Enum.take(friends, 5) - non_friends_thread = Enum.take(friends, 5) - public_long_thread = fn -> - generate_long_thread("public", user, friends_thread, non_friends_thread, opts) + generate_long_thread("public", users, opts) end private_long_thread = fn -> - generate_long_thread("private", user, friends_thread, non_friends_thread, opts) + generate_long_thread("private", users, opts) end iterations = opts[:iterations] @@ -73,10 +77,10 @@ defmodule Pleroma.LoadTesting.Activities do i when i == iterations - 2 -> spawn(public_long_thread) spawn(private_long_thread) - generate_activities(user, friends, non_friends, Enum.shuffle(task_data), opts) + generate_activities(users, Enum.shuffle(task_data), opts) _ -> - generate_activities(user, friends, non_friends, Enum.shuffle(task_data), opts) + generate_activities(users, Enum.shuffle(task_data), opts) end ) end) @@ -127,16 +131,16 @@ defmodule Pleroma.LoadTesting.Activities do end) end - defp generate_long_thread(visibility, user, friends, non_friends, _opts) do + defp generate_long_thread(visibility, users, _opts) do group = if visibility == "public", - do: "friends", - else: "user" + do: :friends_local, + else: :user tasks = get_reply_tasks(visibility, group) |> Stream.cycle() |> Enum.take(50) {:ok, activity} = - CommonAPI.post(user, %{ + CommonAPI.post(users[:user], %{ status: "Start of #{visibility} long thread", visibility: visibility }) @@ -150,31 +154,28 @@ defmodule Pleroma.LoadTesting.Activities do Map.put(state, key, activity) end) - acc = {activity.id, ["@" <> user.nickname, "reply to long thread"]} - insert_replies_for_long_thread(tasks, visibility, user, friends, non_friends, acc) + acc = {activity.id, ["@" <> users[:user].nickname, "reply to long thread"]} + insert_replies_for_long_thread(tasks, visibility, users, acc) IO.puts("Generating #{visibility} long thread ended\n") end - defp insert_replies_for_long_thread(tasks, visibility, user, friends, non_friends, acc) do + defp insert_replies_for_long_thread(tasks, visibility, users, acc) do Enum.reduce(tasks, acc, fn - "friend", {id, data} -> - friend = Enum.random(friends) - insert_reply(friend, List.delete(data, "@" <> friend.nickname), id, visibility) - - "non_friend", {id, data} -> - non_friend = Enum.random(non_friends) - insert_reply(non_friend, List.delete(data, "@" <> non_friend.nickname), id, visibility) - - "user", {id, data} -> + :user, {id, data} -> + user = users[:user] insert_reply(user, List.delete(data, "@" <> user.nickname), id, visibility) + + group, {id, data} -> + replier = Enum.random(users[group]) + insert_reply(replier, List.delete(data, "@" <> replier.nickname), id, visibility) end) end - defp generate_activities(user, friends, non_friends, task_data, opts) do + defp generate_activities(users, task_data, opts) do Task.async_stream( task_data, fn {visibility, type, group} -> - insert_activity(type, visibility, group, user, friends, non_friends, opts) + insert_activity(type, visibility, group, users, opts) end, max_concurrency: @max_concurrency, timeout: 30_000 @@ -182,67 +183,104 @@ defmodule Pleroma.LoadTesting.Activities do |> Stream.run() end - defp insert_activity("simple", visibility, group, user, friends, non_friends, _opts) do - {:ok, _activity} = + defp insert_local_activity(visibility, group, users, status) do + {:ok, _} = group - |> get_actor(user, friends, non_friends) - |> CommonAPI.post(%{status: "Simple status", visibility: visibility}) + |> get_actor(users) + |> CommonAPI.post(%{status: status, visibility: visibility}) end - defp insert_activity("emoji", visibility, group, user, friends, non_friends, _opts) do - {:ok, _activity} = - group - |> get_actor(user, friends, non_friends) - |> CommonAPI.post(%{ - status: "Simple status with emoji :firefox:", - visibility: visibility - }) + defp insert_remote_activity(visibility, group, users, status) do + actor = get_actor(group, users) + {act_data, obj_data} = prepare_activity_data(actor, visibility, users[:user]) + {activity_data, object_data} = other_data(actor, status) + + activity_data + |> Map.merge(act_data) + |> Map.put("object", Map.merge(object_data, obj_data)) + |> Pleroma.Web.ActivityPub.ActivityPub.insert(false) end - defp insert_activity("mentions", visibility, group, user, friends, non_friends, _opts) do + defp user_mentions(users) do user_mentions = - get_random_mentions(friends, Enum.random(0..3)) ++ - get_random_mentions(non_friends, Enum.random(0..3)) + Enum.reduce( + @groups, + [], + fn group, acc -> + acc ++ get_random_mentions(users[group], Enum.random(0..2)) + end + ) - user_mentions = - if Enum.random([true, false]), - do: ["@" <> user.nickname | user_mentions], - else: user_mentions + if Enum.random([true, false]), + do: ["@" <> users[:user].nickname | user_mentions], + else: user_mentions + end - {:ok, _activity} = - group - |> get_actor(user, friends, non_friends) - |> CommonAPI.post(%{ - status: Enum.join(user_mentions, ", ") <> " simple status with mentions", - visibility: visibility - }) + defp hell_thread_mentions(users) do + with {:ok, nil} <- Cachex.get(:user_cache, "hell_thread_mentions") do + cached = + @groups + |> Enum.reduce([users[:user]], fn group, acc -> + acc ++ Enum.take(users[group], 5) + end) + |> Enum.map(&"@#{&1.nickname}") + |> Enum.join(", ") + + Cachex.put(:user_cache, "hell_thread_mentions", cached) + cached + else + {:ok, cached} -> cached + end end - defp insert_activity("hell_thread", visibility, group, user, friends, non_friends, _opts) do - mentions = - with {:ok, nil} <- Cachex.get(:user_cache, "hell_thread_mentions") do - cached = - ([user | Enum.take(friends, 10)] ++ Enum.take(non_friends, 10)) - |> Enum.map(&"@#{&1.nickname}") - |> Enum.join(", ") + defp insert_activity(:simple, visibility, group, users, _opts) + when group in @remote_groups do + insert_remote_activity(visibility, group, users, "Remote status") + end - Cachex.put(:user_cache, "hell_thread_mentions", cached) - cached - else - {:ok, cached} -> cached - end + defp insert_activity(:simple, visibility, group, users, _opts) do + insert_local_activity(visibility, group, users, "Simple status") + end - {:ok, _activity} = - group - |> get_actor(user, friends, non_friends) - |> CommonAPI.post(%{ - status: mentions <> " hell thread status", - visibility: visibility - }) + defp insert_activity(:emoji, visibility, group, users, _opts) + when group in @remote_groups do + insert_remote_activity(visibility, group, users, "Remote status with emoji :firefox:") + end + + defp insert_activity(:emoji, visibility, group, users, _opts) do + insert_local_activity(visibility, group, users, "Simple status with emoji :firefox:") + end + + defp insert_activity(:mentions, visibility, group, users, _opts) + when group in @remote_groups do + mentions = user_mentions(users) + + status = Enum.join(mentions, ", ") <> " remote status with mentions" + + insert_remote_activity(visibility, group, users, status) + end + + defp insert_activity(:mentions, visibility, group, users, _opts) do + mentions = user_mentions(users) + + status = Enum.join(mentions, ", ") <> " simple status with mentions" + insert_remote_activity(visibility, group, users, status) + end + + defp insert_activity(:hell_thread, visibility, group, users, _) + when group in @remote_groups do + mentions = hell_thread_mentions(users) + insert_remote_activity(visibility, group, users, mentions <> " remote hell thread status") + end + + defp insert_activity(:hell_thread, visibility, group, users, _opts) do + mentions = hell_thread_mentions(users) + + insert_local_activity(visibility, group, users, mentions <> " hell thread status") end - defp insert_activity("attachment", visibility, group, user, friends, non_friends, _opts) do - actor = get_actor(group, user, friends, non_friends) + defp insert_activity(:attachment, visibility, group, users, _opts) do + actor = get_actor(group, users) obj_data = %{ "actor" => actor.ap_id, @@ -268,67 +306,54 @@ defmodule Pleroma.LoadTesting.Activities do }) end - defp insert_activity("tag", visibility, group, user, friends, non_friends, _opts) do - {:ok, _activity} = - group - |> get_actor(user, friends, non_friends) - |> CommonAPI.post(%{status: "Status with #tag", visibility: visibility}) + defp insert_activity(:tag, visibility, group, users, _opts) do + insert_local_activity(visibility, group, users, "Status with #tag") end - defp insert_activity("like", visibility, group, user, friends, non_friends, opts) do - actor = get_actor(group, user, friends, non_friends) + defp insert_activity(:like, visibility, group, users, opts) do + actor = get_actor(group, users) with activity_id when not is_nil(activity_id) <- get_random_create_activity_id(), {:ok, _activity} <- CommonAPI.favorite(actor, activity_id) do :ok else {:error, _} -> - insert_activity("like", visibility, group, user, friends, non_friends, opts) + insert_activity(:like, visibility, group, users, opts) nil -> Process.sleep(15) - insert_activity("like", visibility, group, user, friends, non_friends, opts) + insert_activity(:like, visibility, group, users, opts) end end - defp insert_activity("reblog", visibility, group, user, friends, non_friends, opts) do - actor = get_actor(group, user, friends, non_friends) + defp insert_activity(:reblog, visibility, group, users, opts) do + actor = get_actor(group, users) with activity_id when not is_nil(activity_id) <- get_random_create_activity_id(), - {:ok, _activity, _object} <- CommonAPI.repeat(activity_id, actor) do + {:ok, _activity} <- CommonAPI.repeat(activity_id, actor) do :ok else {:error, _} -> - insert_activity("reblog", visibility, group, user, friends, non_friends, opts) + insert_activity(:reblog, visibility, group, users, opts) nil -> Process.sleep(15) - insert_activity("reblog", visibility, group, user, friends, non_friends, opts) + insert_activity(:reblog, visibility, group, users, opts) end end - defp insert_activity("simple_thread", visibility, group, user, friends, non_friends, _opts) - when visibility in ["public", "unlisted", "private"] do - actor = get_actor(group, user, friends, non_friends) - tasks = get_reply_tasks(visibility, group) - - {:ok, activity} = CommonAPI.post(user, %{status: "Simple status", visibility: visibility}) - - acc = {activity.id, ["@" <> actor.nickname, "reply to status"]} - insert_replies(tasks, visibility, user, friends, non_friends, acc) - end - - defp insert_activity("simple_thread", "direct", group, user, friends, non_friends, _opts) do - actor = get_actor(group, user, friends, non_friends) + defp insert_activity(:simple_thread, "direct", group, users, _opts) do + actor = get_actor(group, users) tasks = get_reply_tasks("direct", group) list = case group do - "non_friends" -> - Enum.take(non_friends, 3) + :user -> + group = Enum.random(@friends_groups) + Enum.take(users[group], 3) _ -> - Enum.take(friends, 3) + Enum.take(users[group], 3) end data = Enum.map(list, &("@" <> &1.nickname)) @@ -339,40 +364,30 @@ defmodule Pleroma.LoadTesting.Activities do visibility: "direct" }) - acc = {activity.id, ["@" <> user.nickname | data] ++ ["reply to status"]} - insert_direct_replies(tasks, user, list, acc) + acc = {activity.id, ["@" <> users[:user].nickname | data] ++ ["reply to status"]} + insert_direct_replies(tasks, users[:user], list, acc) end - defp insert_activity("remote", _, "user", _, _, _, _), do: :ok - - defp insert_activity("remote", visibility, group, user, _friends, _non_friends, opts) do - remote_friends = - Users.get_users(user, limit: opts[:friends_used], local: :external, friends?: true) - - remote_non_friends = - Users.get_users(user, limit: opts[:non_friends_used], local: :external, friends?: false) - - actor = get_actor(group, user, remote_friends, remote_non_friends) + defp insert_activity(:simple_thread, visibility, group, users, _opts) do + actor = get_actor(group, users) + tasks = get_reply_tasks(visibility, group) - {act_data, obj_data} = prepare_activity_data(actor, visibility, user) - {activity_data, object_data} = other_data(actor) + {:ok, activity} = + CommonAPI.post(users[:user], %{status: "Simple status", visibility: visibility}) - activity_data - |> Map.merge(act_data) - |> Map.put("object", Map.merge(object_data, obj_data)) - |> Pleroma.Web.ActivityPub.ActivityPub.insert(false) + acc = {activity.id, ["@" <> actor.nickname, "reply to status"]} + insert_replies(tasks, visibility, users, acc) end - defp get_actor("user", user, _friends, _non_friends), do: user - defp get_actor("friends", _user, friends, _non_friends), do: Enum.random(friends) - defp get_actor("non_friends", _user, _friends, non_friends), do: Enum.random(non_friends) + defp get_actor(:user, %{user: user}), do: user + defp get_actor(group, users), do: Enum.random(users[group]) - defp other_data(actor) do + defp other_data(actor, content) do %{host: host} = URI.parse(actor.ap_id) datetime = DateTime.utc_now() - context_id = "http://#{host}:4000/contexts/#{UUID.generate()}" - activity_id = "http://#{host}:4000/activities/#{UUID.generate()}" - object_id = "http://#{host}:4000/objects/#{UUID.generate()}" + context_id = "https://#{host}/contexts/#{UUID.generate()}" + activity_id = "https://#{host}/activities/#{UUID.generate()}" + object_id = "https://#{host}/objects/#{UUID.generate()}" activity_data = %{ "actor" => actor.ap_id, @@ -389,7 +404,7 @@ defmodule Pleroma.LoadTesting.Activities do "attributedTo" => actor.ap_id, "bcc" => [], "bto" => [], - "content" => "Remote post", + "content" => content, "context" => context_id, "conversation" => context_id, "emoji" => %{}, @@ -475,51 +490,65 @@ defmodule Pleroma.LoadTesting.Activities do {act_data, obj_data} end - defp get_reply_tasks("public", "user"), do: ~w(friend non_friend user) - defp get_reply_tasks("public", "friends"), do: ~w(non_friend user friend) - defp get_reply_tasks("public", "non_friends"), do: ~w(user friend non_friend) + defp get_reply_tasks("public", :user) do + [:friends_local, :friends_remote, :non_friends_local, :non_friends_remote, :user] + end + + defp get_reply_tasks("public", group) when group in @friends_groups do + [:non_friends_local, :non_friends_remote, :user, :friends_local, :friends_remote] + end - defp get_reply_tasks(visibility, "user") when visibility in ["unlisted", "private"], - do: ~w(friend user friend) + defp get_reply_tasks("public", group) when group in @non_friends_groups do + [:user, :friends_local, :friends_remote, :non_friends_local, :non_friends_remote] + end - defp get_reply_tasks(visibility, "friends") when visibility in ["unlisted", "private"], - do: ~w(user friend user) + defp get_reply_tasks(visibility, :user) when visibility in ["unlisted", "private"] do + [:friends_local, :friends_remote, :user, :friends_local, :friends_remote] + end - defp get_reply_tasks(visibility, "non_friends") when visibility in ["unlisted", "private"], - do: [] + defp get_reply_tasks(visibility, group) + when visibility in ["unlisted", "private"] and group in @friends_groups do + [:user, :friends_remote, :friends_local, :user] + end - defp get_reply_tasks("direct", "user"), do: ~w(friend user friend) - defp get_reply_tasks("direct", "friends"), do: ~w(user friend user) - defp get_reply_tasks("direct", "non_friends"), do: ~w(user non_friend user) + defp get_reply_tasks(visibility, group) + when visibility in ["unlisted", "private"] and + group in @non_friends_groups, + do: [] - defp insert_replies(tasks, visibility, user, friends, non_friends, acc) do - Enum.reduce(tasks, acc, fn - "friend", {id, data} -> - friend = Enum.random(friends) - insert_reply(friend, data, id, visibility) + defp get_reply_tasks("direct", :user), do: [:friends_local, :user, :friends_remote] - "non_friend", {id, data} -> - non_friend = Enum.random(non_friends) - insert_reply(non_friend, data, id, visibility) + defp get_reply_tasks("direct", group) when group in @friends_groups, + do: [:user, group, :user] - "user", {id, data} -> - insert_reply(user, data, id, visibility) + defp get_reply_tasks("direct", group) when group in @non_friends_groups do + [:user, :non_friends_remote, :user, :non_friends_local] + end + + defp insert_replies(tasks, visibility, users, acc) do + Enum.reduce(tasks, acc, fn + :user, {id, data} -> + insert_reply(users[:user], data, id, visibility) + + group, {id, data} -> + replier = Enum.random(users[group]) + insert_reply(replier, data, id, visibility) end) end defp insert_direct_replies(tasks, user, list, acc) do Enum.reduce(tasks, acc, fn - group, {id, data} when group in ["friend", "non_friend"] -> + :user, {id, data} -> + {reply_id, _} = insert_reply(user, List.delete(data, "@" <> user.nickname), id, "direct") + {reply_id, data} + + _, {id, data} -> actor = Enum.random(list) {reply_id, _} = insert_reply(actor, List.delete(data, "@" <> actor.nickname), id, "direct") {reply_id, data} - - "user", {id, data} -> - {reply_id, _} = insert_reply(user, List.delete(data, "@" <> user.nickname), id, "direct") - {reply_id, data} end) end diff --git a/benchmarks/load_testing/fetcher.ex b/benchmarks/load_testing/fetcher.ex index 0de4924bc..15fd06c3d 100644 --- a/benchmarks/load_testing/fetcher.ex +++ b/benchmarks/load_testing/fetcher.ex @@ -36,6 +36,7 @@ defmodule Pleroma.LoadTesting.Fetcher do fetch_home_timeline(user) fetch_direct_timeline(user) fetch_public_timeline(user) + fetch_public_timeline(user, :with_blocks) fetch_public_timeline(user, :local) fetch_public_timeline(user, :tag) fetch_notifications(user) @@ -51,12 +52,12 @@ defmodule Pleroma.LoadTesting.Fetcher do defp opts_for_home_timeline(user) do %{ - "blocking_user" => user, - "count" => "20", - "muting_user" => user, - "type" => ["Create", "Announce"], - "user" => user, - "with_muted" => "true" + blocking_user: user, + count: "20", + muting_user: user, + type: ["Create", "Announce"], + user: user, + with_muted: true } end @@ -69,17 +70,17 @@ defmodule Pleroma.LoadTesting.Fetcher do ActivityPub.fetch_activities(recipients, opts) |> Enum.reverse() |> List.last() second_page_last = - ActivityPub.fetch_activities(recipients, Map.put(opts, "max_id", first_page_last.id)) + ActivityPub.fetch_activities(recipients, Map.put(opts, :max_id, first_page_last.id)) |> Enum.reverse() |> List.last() third_page_last = - ActivityPub.fetch_activities(recipients, Map.put(opts, "max_id", second_page_last.id)) + ActivityPub.fetch_activities(recipients, Map.put(opts, :max_id, second_page_last.id)) |> Enum.reverse() |> List.last() forth_page_last = - ActivityPub.fetch_activities(recipients, Map.put(opts, "max_id", third_page_last.id)) + ActivityPub.fetch_activities(recipients, Map.put(opts, :max_id, third_page_last.id)) |> Enum.reverse() |> List.last() @@ -89,19 +90,19 @@ defmodule Pleroma.LoadTesting.Fetcher do }, inputs: %{ "1 page" => opts, - "2 page" => Map.put(opts, "max_id", first_page_last.id), - "3 page" => Map.put(opts, "max_id", second_page_last.id), - "4 page" => Map.put(opts, "max_id", third_page_last.id), - "5 page" => Map.put(opts, "max_id", forth_page_last.id), - "1 page only media" => Map.put(opts, "only_media", "true"), + "2 page" => Map.put(opts, :max_id, first_page_last.id), + "3 page" => Map.put(opts, :max_id, second_page_last.id), + "4 page" => Map.put(opts, :max_id, third_page_last.id), + "5 page" => Map.put(opts, :max_id, forth_page_last.id), + "1 page only media" => Map.put(opts, :only_media, true), "2 page only media" => - Map.put(opts, "max_id", first_page_last.id) |> Map.put("only_media", "true"), + Map.put(opts, :max_id, first_page_last.id) |> Map.put(:only_media, true), "3 page only media" => - Map.put(opts, "max_id", second_page_last.id) |> Map.put("only_media", "true"), + Map.put(opts, :max_id, second_page_last.id) |> Map.put(:only_media, true), "4 page only media" => - Map.put(opts, "max_id", third_page_last.id) |> Map.put("only_media", "true"), + Map.put(opts, :max_id, third_page_last.id) |> Map.put(:only_media, true), "5 page only media" => - Map.put(opts, "max_id", forth_page_last.id) |> Map.put("only_media", "true") + Map.put(opts, :max_id, forth_page_last.id) |> Map.put(:only_media, true) }, formatters: formatters() ) @@ -109,12 +110,12 @@ defmodule Pleroma.LoadTesting.Fetcher do defp opts_for_direct_timeline(user) do %{ - :visibility => "direct", - "blocking_user" => user, - "count" => "20", - "type" => "Create", - "user" => user, - "with_muted" => "true" + visibility: "direct", + blocking_user: user, + count: "20", + type: "Create", + user: user, + with_muted: true } end @@ -129,7 +130,7 @@ defmodule Pleroma.LoadTesting.Fetcher do |> Pagination.fetch_paginated(opts) |> List.last() - opts2 = Map.put(opts, "max_id", first_page_last.id) + opts2 = Map.put(opts, :max_id, first_page_last.id) second_page_last = recipients @@ -137,7 +138,7 @@ defmodule Pleroma.LoadTesting.Fetcher do |> Pagination.fetch_paginated(opts2) |> List.last() - opts3 = Map.put(opts, "max_id", second_page_last.id) + opts3 = Map.put(opts, :max_id, second_page_last.id) third_page_last = recipients @@ -145,7 +146,7 @@ defmodule Pleroma.LoadTesting.Fetcher do |> Pagination.fetch_paginated(opts3) |> List.last() - opts4 = Map.put(opts, "max_id", third_page_last.id) + opts4 = Map.put(opts, :max_id, third_page_last.id) forth_page_last = recipients @@ -164,7 +165,7 @@ defmodule Pleroma.LoadTesting.Fetcher do "2 page" => opts2, "3 page" => opts3, "4 page" => opts4, - "5 page" => Map.put(opts4, "max_id", forth_page_last.id) + "5 page" => Map.put(opts4, :max_id, forth_page_last.id) }, formatters: formatters() ) @@ -172,34 +173,34 @@ defmodule Pleroma.LoadTesting.Fetcher do defp opts_for_public_timeline(user) do %{ - "type" => ["Create", "Announce"], - "local_only" => false, - "blocking_user" => user, - "muting_user" => user + type: ["Create", "Announce"], + local_only: false, + blocking_user: user, + muting_user: user } end defp opts_for_public_timeline(user, :local) do %{ - "type" => ["Create", "Announce"], - "local_only" => true, - "blocking_user" => user, - "muting_user" => user + type: ["Create", "Announce"], + local_only: true, + blocking_user: user, + muting_user: user } end defp opts_for_public_timeline(user, :tag) do %{ - "blocking_user" => user, - "count" => "20", - "local_only" => nil, - "muting_user" => user, - "tag" => ["tag"], - "tag_all" => [], - "tag_reject" => [], - "type" => "Create", - "user" => user, - "with_muted" => "true" + blocking_user: user, + count: "20", + local_only: nil, + muting_user: user, + tag: ["tag"], + tag_all: [], + tag_reject: [], + type: "Create", + user: user, + with_muted: true } end @@ -222,24 +223,72 @@ defmodule Pleroma.LoadTesting.Fetcher do end defp fetch_public_timeline(user, :only_media) do - opts = opts_for_public_timeline(user) |> Map.put("only_media", "true") + opts = opts_for_public_timeline(user) |> Map.put(:only_media, true) fetch_public_timeline(opts, "public timeline only media") end + defp fetch_public_timeline(user, :with_blocks) do + opts = opts_for_public_timeline(user) + + remote_non_friends = Agent.get(:non_friends_remote, & &1) + + Benchee.run(%{ + "public timeline without blocks" => fn -> + ActivityPub.fetch_public_activities(opts) + end + }) + + Enum.each(remote_non_friends, fn non_friend -> + {:ok, _} = User.block(user, non_friend) + end) + + user = User.get_by_id(user.id) + + opts = Map.put(opts, :blocking_user, user) + + Benchee.run(%{ + "public timeline with user block" => fn -> + ActivityPub.fetch_public_activities(opts) + end + }) + + domains = + Enum.reduce(remote_non_friends, [], fn non_friend, domains -> + {:ok, _user} = User.unblock(user, non_friend) + %{host: host} = URI.parse(non_friend.ap_id) + [host | domains] + end) + + domains = Enum.uniq(domains) + + Enum.each(domains, fn domain -> + {:ok, _} = User.block_domain(user, domain) + end) + + user = User.get_by_id(user.id) + opts = Map.put(opts, :blocking_user, user) + + Benchee.run(%{ + "public timeline with domain block" => fn -> + ActivityPub.fetch_public_activities(opts) + end + }) + end + defp fetch_public_timeline(opts, title) when is_binary(title) do first_page_last = ActivityPub.fetch_public_activities(opts) |> List.last() second_page_last = - ActivityPub.fetch_public_activities(Map.put(opts, "max_id", first_page_last.id)) + ActivityPub.fetch_public_activities(Map.put(opts, :max_id, first_page_last.id)) |> List.last() third_page_last = - ActivityPub.fetch_public_activities(Map.put(opts, "max_id", second_page_last.id)) + ActivityPub.fetch_public_activities(Map.put(opts, :max_id, second_page_last.id)) |> List.last() forth_page_last = - ActivityPub.fetch_public_activities(Map.put(opts, "max_id", third_page_last.id)) + ActivityPub.fetch_public_activities(Map.put(opts, :max_id, third_page_last.id)) |> List.last() Benchee.run( @@ -250,17 +299,17 @@ defmodule Pleroma.LoadTesting.Fetcher do }, inputs: %{ "1 page" => opts, - "2 page" => Map.put(opts, "max_id", first_page_last.id), - "3 page" => Map.put(opts, "max_id", second_page_last.id), - "4 page" => Map.put(opts, "max_id", third_page_last.id), - "5 page" => Map.put(opts, "max_id", forth_page_last.id) + "2 page" => Map.put(opts, :max_id, first_page_last.id), + "3 page" => Map.put(opts, :max_id, second_page_last.id), + "4 page" => Map.put(opts, :max_id, third_page_last.id), + "5 page" => Map.put(opts, :max_id, forth_page_last.id) }, formatters: formatters() ) end defp opts_for_notifications do - %{"count" => "20", "with_muted" => "true"} + %{count: "20", with_muted: true} end defp fetch_notifications(user) do @@ -269,15 +318,15 @@ defmodule Pleroma.LoadTesting.Fetcher do first_page_last = MastodonAPI.get_notifications(user, opts) |> List.last() second_page_last = - MastodonAPI.get_notifications(user, Map.put(opts, "max_id", first_page_last.id)) + MastodonAPI.get_notifications(user, Map.put(opts, :max_id, first_page_last.id)) |> List.last() third_page_last = - MastodonAPI.get_notifications(user, Map.put(opts, "max_id", second_page_last.id)) + MastodonAPI.get_notifications(user, Map.put(opts, :max_id, second_page_last.id)) |> List.last() forth_page_last = - MastodonAPI.get_notifications(user, Map.put(opts, "max_id", third_page_last.id)) + MastodonAPI.get_notifications(user, Map.put(opts, :max_id, third_page_last.id)) |> List.last() Benchee.run( @@ -288,10 +337,10 @@ defmodule Pleroma.LoadTesting.Fetcher do }, inputs: %{ "1 page" => opts, - "2 page" => Map.put(opts, "max_id", first_page_last.id), - "3 page" => Map.put(opts, "max_id", second_page_last.id), - "4 page" => Map.put(opts, "max_id", third_page_last.id), - "5 page" => Map.put(opts, "max_id", forth_page_last.id) + "2 page" => Map.put(opts, :max_id, first_page_last.id), + "3 page" => Map.put(opts, :max_id, second_page_last.id), + "4 page" => Map.put(opts, :max_id, third_page_last.id), + "5 page" => Map.put(opts, :max_id, forth_page_last.id) }, formatters: formatters() ) @@ -301,13 +350,13 @@ defmodule Pleroma.LoadTesting.Fetcher do first_page_last = ActivityPub.fetch_favourites(user) |> List.last() second_page_last = - ActivityPub.fetch_favourites(user, %{"max_id" => first_page_last.id}) |> List.last() + ActivityPub.fetch_favourites(user, %{:max_id => first_page_last.id}) |> List.last() third_page_last = - ActivityPub.fetch_favourites(user, %{"max_id" => second_page_last.id}) |> List.last() + ActivityPub.fetch_favourites(user, %{:max_id => second_page_last.id}) |> List.last() forth_page_last = - ActivityPub.fetch_favourites(user, %{"max_id" => third_page_last.id}) |> List.last() + ActivityPub.fetch_favourites(user, %{:max_id => third_page_last.id}) |> List.last() Benchee.run( %{ @@ -317,10 +366,10 @@ defmodule Pleroma.LoadTesting.Fetcher do }, inputs: %{ "1 page" => %{}, - "2 page" => %{"max_id" => first_page_last.id}, - "3 page" => %{"max_id" => second_page_last.id}, - "4 page" => %{"max_id" => third_page_last.id}, - "5 page" => %{"max_id" => forth_page_last.id} + "2 page" => %{:max_id => first_page_last.id}, + "3 page" => %{:max_id => second_page_last.id}, + "4 page" => %{:max_id => third_page_last.id}, + "5 page" => %{:max_id => forth_page_last.id} }, formatters: formatters() ) @@ -328,8 +377,8 @@ defmodule Pleroma.LoadTesting.Fetcher do defp opts_for_long_thread(user) do %{ - "blocking_user" => user, - "user" => user + blocking_user: user, + user: user } end @@ -339,9 +388,9 @@ defmodule Pleroma.LoadTesting.Fetcher do opts = opts_for_long_thread(user) - private_input = {private.data["context"], Map.put(opts, "exclude_id", private.id)} + private_input = {private.data["context"], Map.put(opts, :exclude_id, private.id)} - public_input = {public.data["context"], Map.put(opts, "exclude_id", public.id)} + public_input = {public.data["context"], Map.put(opts, :exclude_id, public.id)} Benchee.run( %{ @@ -461,13 +510,13 @@ defmodule Pleroma.LoadTesting.Fetcher do public_context = ActivityPub.fetch_activities_for_context( public.data["context"], - Map.put(fetch_opts, "exclude_id", public.id) + Map.put(fetch_opts, :exclude_id, public.id) ) private_context = ActivityPub.fetch_activities_for_context( private.data["context"], - Map.put(fetch_opts, "exclude_id", private.id) + Map.put(fetch_opts, :exclude_id, private.id) ) Benchee.run( @@ -498,14 +547,14 @@ defmodule Pleroma.LoadTesting.Fetcher do end, "Public timeline with reply filtering - following" => fn -> public_params - |> Map.put("reply_visibility", "following") - |> Map.put("reply_filtering_user", user) + |> Map.put(:reply_visibility, "following") + |> Map.put(:reply_filtering_user, user) |> ActivityPub.fetch_public_activities() end, "Public timeline with reply filtering - self" => fn -> public_params - |> Map.put("reply_visibility", "self") - |> Map.put("reply_filtering_user", user) + |> Map.put(:reply_visibility, "self") + |> Map.put(:reply_filtering_user, user) |> ActivityPub.fetch_public_activities() end }, @@ -524,16 +573,16 @@ defmodule Pleroma.LoadTesting.Fetcher do "Home timeline with reply filtering - following" => fn -> private_params = private_params - |> Map.put("reply_filtering_user", user) - |> Map.put("reply_visibility", "following") + |> Map.put(:reply_filtering_user, user) + |> Map.put(:reply_visibility, "following") ActivityPub.fetch_activities(recipients, private_params) end, "Home timeline with reply filtering - self" => fn -> private_params = private_params - |> Map.put("reply_filtering_user", user) - |> Map.put("reply_visibility", "self") + |> Map.put(:reply_filtering_user, user) + |> Map.put(:reply_visibility, "self") ActivityPub.fetch_activities(recipients, private_params) end diff --git a/benchmarks/load_testing/users.ex b/benchmarks/load_testing/users.ex index e4d0b22ff..6cf3958c1 100644 --- a/benchmarks/load_testing/users.ex +++ b/benchmarks/load_testing/users.ex @@ -27,7 +27,7 @@ defmodule Pleroma.LoadTesting.Users do make_friends(main_user, opts[:friends]) - Repo.get(User, main_user.id) + User.get_by_id(main_user.id) end def generate_users(max) do @@ -166,4 +166,24 @@ defmodule Pleroma.LoadTesting.Users do ) |> Stream.run() end + + @spec prepare_users(User.t(), keyword()) :: map() + def prepare_users(user, opts) do + friends_limit = opts[:friends_used] + non_friends_limit = opts[:non_friends_used] + + %{ + user: user, + friends_local: fetch_users(user, friends_limit, :local, true), + friends_remote: fetch_users(user, friends_limit, :external, true), + non_friends_local: fetch_users(user, non_friends_limit, :local, false), + non_friends_remote: fetch_users(user, non_friends_limit, :external, false) + } + end + + defp fetch_users(user, limit, local, friends?) do + user + |> get_users(limit: limit, local: local, friends?: friends?) + |> Enum.shuffle() + end end diff --git a/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex b/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex index 657403202..c051335a5 100644 --- a/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex +++ b/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex @@ -5,7 +5,6 @@ defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do import Ecto.Query alias Pleroma.Repo - alias Pleroma.Web.MastodonAPI.TimelineController def run(_args) do Mix.Pleroma.start_pleroma() @@ -37,7 +36,7 @@ defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do Benchee.run( %{ "Hashtag fetching, any" => fn tags -> - TimelineController.hashtag_fetching( + hashtag_fetching( %{ "any" => tags }, @@ -47,7 +46,7 @@ defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do end, # Will always return zero results because no overlapping hashtags are generated. "Hashtag fetching, all" => fn tags -> - TimelineController.hashtag_fetching( + hashtag_fetching( %{ "all" => tags }, @@ -67,7 +66,7 @@ defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do Benchee.run( %{ "Hashtag fetching" => fn tag -> - TimelineController.hashtag_fetching( + hashtag_fetching( %{ "tag" => tag }, @@ -80,4 +79,35 @@ defmodule Mix.Tasks.Pleroma.Benchmarks.Tags do time: 5 ) end + + defp hashtag_fetching(params, user, local_only) do + tags = + [params["tag"], params["any"]] + |> List.flatten() + |> Enum.uniq() + |> Enum.filter(& &1) + |> Enum.map(&String.downcase(&1)) + + tag_all = + params + |> Map.get("all", []) + |> Enum.map(&String.downcase(&1)) + + tag_reject = + params + |> Map.get("none", []) + |> Enum.map(&String.downcase(&1)) + + _activities = + params + |> Map.put(:type, "Create") + |> Map.put(:local_only, local_only) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + |> Map.put(:tag, tags) + |> Map.put(:tag_all, tag_all) + |> Map.put(:tag_reject, tag_reject) + |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities() + end end diff --git a/config/config.exs b/config/config.exs index d1440b7bf..c8b6c7fad 100644 --- a/config/config.exs +++ b/config/config.exs @@ -71,7 +71,8 @@ config :pleroma, Pleroma.Upload, follow_redirect: true, pool: :upload ] - ] + ], + filename_display_max_length: 30 config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads" @@ -170,7 +171,8 @@ config :mime, :types, %{ "application/ld+json" => ["activity+json"] } -config :tesla, adapter: Tesla.Adapter.Gun +config :tesla, adapter: Tesla.Adapter.Hackney + # Configures http settings, upstream proxy etc. config :pleroma, :http, proxy_url: nil, @@ -182,8 +184,9 @@ config :pleroma, :instance, name: "Pleroma", email: "example@example.com", notify_email: "noreply@example.com", - description: "A Pleroma instance, an alternative fediverse server", + description: "Pleroma: An efficient and flexible fediverse server", background_image: "/images/city.jpg", + instance_thumbnail: "/instance/thumbnail.jpeg", limit: 5_000, chat_limit: 5_000, remote_limit: 100_000, @@ -207,7 +210,6 @@ config :pleroma, :instance, Pleroma.Web.ActivityPub.Publisher ], allow_relay: true, - rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy, public: true, quarantined_instances: [], managed_config: true, @@ -218,8 +220,6 @@ config :pleroma, :instance, "text/markdown", "text/bbcode" ], - mrf_transparency: true, - mrf_transparency_exclusions: [], autofollowed_nicknames: [], max_pinned_statuses: 1, attachment_links: false, @@ -272,20 +272,33 @@ config :pleroma, :markup, config :pleroma, :frontend_configurations, pleroma_fe: %{ - theme: "pleroma-dark", - logo: "/static/logo.png", + alwaysShowSubjectInput: true, background: "/images/city.jpg", - redirectRootNoLogin: "/main/all", - redirectRootLogin: "/main/friends", - showInstanceSpecificPanel: true, - scopeOptionsEnabled: false, - formattingOptionsEnabled: false, collapseMessageWithSubject: false, + disableChat: false, + greentext: false, + hideFilteredStatuses: false, + hideMutedPosts: false, hidePostStats: false, + hideSitename: false, hideUserStats: false, + loginMethod: "password", + logo: "/static/logo.png", + logoMargin: ".1em", + logoMask: true, + minimalScopesMode: false, + noAttachmentLinks: false, + nsfwCensorImage: "", + postContentType: "text/plain", + redirectRootLogin: "/main/friends", + redirectRootNoLogin: "/main/all", scopeCopy: true, + sidebarRight: false, + showFeaturesPanel: true, + showInstanceSpecificPanel: false, subjectLineBehavior: "email", - alwaysShowSubjectInput: true + theme: "pleroma-dark", + webPushNotifications: false }, masto_fe: %{ showInstanceSpecificPanel: true @@ -356,6 +369,8 @@ config :pleroma, :mrf_keyword, config :pleroma, :mrf_subchain, match_actor: %{} +config :pleroma, :mrf_activity_expiration, days: 365 + config :pleroma, :mrf_vocabulary, accept: [], reject: [] @@ -370,7 +385,6 @@ config :pleroma, :rich_media, ignore_tld: ["local", "localdomain", "lan"], parsers: [ Pleroma.Web.RichMedia.Parsers.TwitterCard, - Pleroma.Web.RichMedia.Parsers.OGP, Pleroma.Web.RichMedia.Parsers.OEmbed ], ttl_setters: [Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl] @@ -393,6 +407,13 @@ config :pleroma, :media_proxy, ], whitelist: [] +config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Http, + method: :purge, + headers: [], + options: [] + +config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Script, script_path: nil + # Note: media preview proxy depends on media proxy to be enabled config :pleroma, :media_preview_proxy, enabled: false, @@ -425,6 +446,12 @@ config :pleroma, Pleroma.Web.Metadata, ], unfurl_nsfw: false +config :pleroma, Pleroma.Web.Preload, + providers: [ + Pleroma.Web.Preload.Providers.Instance, + Pleroma.Web.Preload.Providers.StatusNet + ] + config :pleroma, :http_security, enabled: true, sts: false, @@ -681,6 +708,15 @@ config :pleroma, :restrict_unauthenticated, config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false +config :pleroma, :mrf, + policies: Pleroma.Web.ActivityPub.MRF.NoOpPolicy, + transparency: true, + transparency_exclusions: [] + +config :tzdata, :http_client, Pleroma.HTTP.Tzdata + +config :ex_aws, http_client: Pleroma.HTTP.ExAws + config :pleroma, :exexec, root_mode: false, options: %{} diff --git a/config/description.exs b/config/description.exs index 324cae8cf..4ea8a2f50 100644 --- a/config/description.exs +++ b/config/description.exs @@ -40,12 +40,13 @@ config :pleroma, :config_description, [ key: :link_name, type: :boolean, description: - "If enabled, a name parameter will be added to the url of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`." + "If enabled, a name parameter will be added to the URL of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`." }, %{ key: :base_url, + label: "Base URL", type: :string, - description: "Base url for the uploads, needed if you use CDN", + description: "Base URL for the uploads, needed if you use CDN", suggestions: [ "https://cdn-host.com" ] @@ -58,6 +59,7 @@ config :pleroma, :config_description, [ }, %{ key: :proxy_opts, + label: "Proxy Options", type: :keyword, description: "Options for Pleroma.ReverseProxy", suggestions: [ @@ -85,6 +87,7 @@ config :pleroma, :config_description, [ }, %{ key: :http, + label: "HTTP", type: :keyword, description: "HTTP options", children: [ @@ -119,6 +122,11 @@ config :pleroma, :config_description, [ ] } ] + }, + %{ + key: :filename_display_max_length, + type: :integer, + description: "Set max length of a filename to display. 0 = no limit. Default: 30" } ] }, @@ -474,6 +482,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :uri_schemes, + label: "URI Schemes", type: :group, description: "URI schemes related settings", children: [ @@ -646,17 +655,17 @@ config :pleroma, :config_description, [ key: :invites_enabled, type: :boolean, description: - "Enable user invitations for admins (depends on `registrations_open` being disabled)." + "Enable user invitations for admins (depends on `registrations_open` being disabled)" }, %{ key: :account_activation_required, type: :boolean, - description: "Require users to confirm their emails before signing in." + description: "Require users to confirm their emails before signing in" }, %{ key: :federating, type: :boolean, - description: "Enable federation with other instances." + description: "Enable federation with other instances" }, %{ key: :federation_incoming_replies_max_depth, @@ -674,7 +683,7 @@ config :pleroma, :config_description, [ label: "Fed. reachability timeout days", type: :integer, description: - "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it.", + "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it", suggestions: [ 7 ] @@ -684,17 +693,6 @@ config :pleroma, :config_description, [ type: :boolean, description: "Enable Pleroma's Relay, which makes it possible to follow a whole instance" }, - %{ - key: :rewrite_policy, - type: [:module, {:list, :module}], - description: - "A list of enabled MRF policies. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name.", - suggestions: - Generator.list_modules_in_dir( - "lib/pleroma/web/activity_pub/mrf", - "Elixir.Pleroma.Web.ActivityPub.MRF." - ) - }, %{ key: :public, type: :boolean, @@ -737,23 +735,6 @@ config :pleroma, :config_description, [ "text/bbcode" ] }, - %{ - key: :mrf_transparency, - label: "MRF transparency", - type: :boolean, - description: - "Make the content of your Message Rewrite Facility settings public (via nodeinfo)" - }, - %{ - key: :mrf_transparency_exclusions, - label: "MRF transparency exclusions", - type: {:list, :string}, - description: - "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value.", - suggestions: [ - "exclusion.com" - ] - }, %{ key: :extended_nickname_format, type: :boolean, @@ -824,6 +805,7 @@ config :pleroma, :config_description, [ }, %{ key: :safe_dm_mentions, + label: "Safe DM mentions", type: :boolean, description: "If enabled, only mentions at the beginning of a post will be used to address people in direct messages." <> @@ -863,7 +845,7 @@ config :pleroma, :config_description, [ %{ key: :skip_thread_containment, type: :boolean, - description: "Skip filtering out broken threads. Default: enabled" + description: "Skip filtering out broken threads. Default: enabled." }, %{ key: :limit_to_local_content, @@ -927,6 +909,7 @@ config :pleroma, :config_description, [ children: [ %{ key: :totp, + label: "TOTP settings", type: :keyword, description: "TOTP settings", suggestions: [digits: 6, period: 30], @@ -943,7 +926,7 @@ config :pleroma, :config_description, [ type: :integer, suggestions: [30], description: - "a period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds." + "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds." } ] }, @@ -957,7 +940,7 @@ config :pleroma, :config_description, [ key: :number, type: :integer, suggestions: [5], - description: "number of backup codes to generate." + description: "Number of backup codes to generate." }, %{ key: :length, @@ -969,6 +952,13 @@ config :pleroma, :config_description, [ ] } ] + }, + %{ + key: :instance_thumbnail, + type: :string, + description: + "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance.", + suggestions: ["/instance/thumbnail.jpeg"] } ] }, @@ -990,6 +980,7 @@ config :pleroma, :config_description, [ group: :logger, type: :group, key: :ex_syslogger, + label: "ExSyslogger", description: "ExSyslogger-related settings", children: [ %{ @@ -1008,7 +999,7 @@ config :pleroma, :config_description, [ %{ key: :format, type: :string, - description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\".", + description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\"", suggestions: ["$metadata[$level] $message"] }, %{ @@ -1022,6 +1013,7 @@ config :pleroma, :config_description, [ group: :logger, type: :group, key: :console, + label: "Console Logger", description: "Console logger settings", children: [ %{ @@ -1033,7 +1025,7 @@ config :pleroma, :config_description, [ %{ key: :format, type: :string, - description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\".", + description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\"", suggestions: ["$metadata[$level] $message"] }, %{ @@ -1046,6 +1038,7 @@ config :pleroma, :config_description, [ %{ group: :quack, type: :group, + label: "Quack Logger", description: "Quack-related settings", children: [ %{ @@ -1112,11 +1105,12 @@ config :pleroma, :config_description, [ logoMask: true, minimalScopesMode: false, noAttachmentLinks: false, - nsfwCensorImage: "", + nsfwCensorImage: "/static/img/nsfw.74818f9.png", postContentType: "text/plain", redirectRootLogin: "/main/friends", redirectRootNoLogin: "/main/all", scopeCopy: true, + sidebarRight: false, showFeaturesPanel: true, showInstanceSpecificPanel: false, subjectLineBehavior: "email", @@ -1155,19 +1149,19 @@ config :pleroma, :config_description, [ key: :greentext, label: "Greentext", type: :boolean, - description: "Enables green text on lines prefixed with the > character." + description: "Enables green text on lines prefixed with the > character" }, %{ key: :hideFilteredStatuses, label: "Hide Filtered Statuses", type: :boolean, - description: "Hides filtered statuses from timelines." + description: "Hides filtered statuses from timelines" }, %{ key: :hideMutedPosts, label: "Hide Muted Posts", type: :boolean, - description: "Hides muted statuses from timelines." + description: "Hides muted statuses from timelines" }, %{ key: :hidePostStats, @@ -1179,7 +1173,7 @@ config :pleroma, :config_description, [ key: :hideSitename, label: "Hide Sitename", type: :boolean, - description: "Hides instance name from PleromaFE banner." + description: "Hides instance name from PleromaFE banner" }, %{ key: :hideUserStats, @@ -1224,14 +1218,14 @@ config :pleroma, :config_description, [ label: "NSFW Censor Image", type: :string, description: - "URL of the image to use for hiding NSFW media attachments in the timeline.", - suggestions: ["/static/img/nsfw.png"] + "URL of the image to use for hiding NSFW media attachments in the timeline", + suggestions: ["/static/img/nsfw.74818f9.png"] }, %{ key: :postContentType, label: "Post Content Type", type: {:dropdown, :atom}, - description: "Default post formatting option.", + description: "Default post formatting option", suggestions: ["text/plain", "text/html", "text/markdown", "text/bbcode"] }, %{ @@ -1256,12 +1250,18 @@ config :pleroma, :config_description, [ type: :boolean, description: "Copy the scope (private/unlisted/public) in replies to posts by default" }, + %{ + key: :sidebarRight, + label: "Sidebar on Right", + type: :boolean, + description: "Change alignment of sidebar and panels to the right" + }, %{ key: :showFeaturesPanel, label: "Show instance features panel", type: :boolean, description: - "Enables panel displaying functionality of the instance on the About page." + "Enables panel displaying functionality of the instance on the About page" }, %{ key: :showInstanceSpecificPanel, @@ -1319,7 +1319,7 @@ config :pleroma, :config_description, [ key: :mascots, type: {:keyword, :map}, description: - "Keyword of mascots, each element must contain both an url and a mime_type key", + "Keyword of mascots, each element must contain both an URL and a mime_type key", suggestions: [ pleroma_fox_tan: %{ url: "/images/pleroma-fox-tan-smol.png", @@ -1339,6 +1339,12 @@ config :pleroma, :config_description, [ suggestions: [ :pleroma_fox_tan ] + }, + %{ + key: :default_user_avatar, + type: :string, + description: "URL of the default user avatar", + suggestions: ["/images/avi.png"] } ] }, @@ -1347,7 +1353,7 @@ config :pleroma, :config_description, [ key: :manifest, type: :group, description: - "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE", + "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE.", children: [ %{ key: :icons, @@ -1384,7 +1390,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :mrf_simple, - label: "MRF simple", + label: "MRF Simple", type: :group, description: "Message Rewrite Facility", children: [ @@ -1446,10 +1452,25 @@ config :pleroma, :config_description, [ } ] }, + %{ + group: :pleroma, + key: :mrf_activity_expiration, + label: "MRF Activity Expiration Policy", + type: :group, + description: "Adds expiration to all local Create Note activities", + children: [ + %{ + key: :days, + type: :integer, + description: "Default global expiration time for all local Create activities (in days)", + suggestions: [90, 365] + } + ] + }, %{ group: :pleroma, key: :mrf_subchain, - label: "MRF subchain", + label: "MRF Subchain", type: :group, description: "This policy processes messages through an alternate pipeline when a given message matches certain criteria." <> @@ -1472,7 +1493,7 @@ config :pleroma, :config_description, [ key: :mrf_rejectnonpublic, description: "MRF RejectNonPublic settings. RejectNonPublic drops posts with non-public visibility settings.", - label: "MRF reject non public", + label: "MRF Reject Non Public", type: :group, children: [ %{ @@ -1491,7 +1512,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :mrf_hellthread, - label: "MRF hellthread", + label: "MRF Hellthread", type: :group, description: "Block messages with too much mentions", children: [ @@ -1515,7 +1536,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :mrf_keyword, - label: "MRF keyword", + label: "MRF Keyword", type: :group, description: "Reject or Word-Replace messages with a keyword or regex", children: [ @@ -1545,14 +1566,14 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :mrf_mention, - label: "MRF mention", + label: "MRF Mention", type: :group, description: "Block messages which mention a user", children: [ %{ key: :actors, type: {:list, :string}, - description: "A list of actors for which any post mentioning them will be dropped.", + description: "A list of actors for which any post mentioning them will be dropped", suggestions: ["actor1", "actor2"] } ] @@ -1560,7 +1581,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :mrf_vocabulary, - label: "MRF vocabulary", + label: "MRF Vocabulary", type: :group, description: "Filter messages which belong to certain activity vocabularies", children: [ @@ -1568,14 +1589,14 @@ config :pleroma, :config_description, [ key: :accept, type: {:list, :string}, description: - "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted", + "A list of ActivityStreams terms to accept. If empty, all supported messages are accepted.", suggestions: ["Create", "Follow", "Mention", "Announce", "Like"] }, %{ key: :reject, type: {:list, :string}, description: - "A list of ActivityStreams terms to reject. If empty, no messages are rejected", + "A list of ActivityStreams terms to reject. If empty, no messages are rejected.", suggestions: ["Create", "Follow", "Mention", "Announce", "Like"] } ] @@ -1583,14 +1604,12 @@ config :pleroma, :config_description, [ # %{ # group: :pleroma, # key: :mrf_user_allowlist, - # type: :group, + # type: :map, # description: # "The keys in this section are the domain names that the policy should apply to." <> # " Each key should be assigned a list of users that should be allowed through by their ActivityPub ID", - # children: [ - # ["example.org": ["https://example.org/users/admin"]], # suggestions: [ - # ["example.org": ["https://example.org/users/admin"]] + # %{"example.org" => ["https://example.org/users/admin"]} # ] # ] # }, @@ -1607,13 +1626,40 @@ config :pleroma, :config_description, [ }, %{ key: :base_url, + label: "Base URL", type: :string, description: "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts.", suggestions: ["https://example.com"] }, + %{ + key: :invalidation, + type: :keyword, + descpiption: "", + suggestions: [ + enabled: true, + provider: Pleroma.Web.MediaProxy.Invalidation.Script + ], + children: [ + %{ + key: :enabled, + type: :boolean, + description: "Enables invalidate media cache" + }, + %{ + key: :provider, + type: :module, + description: "Module which will be used to cache purge.", + suggestions: [ + Pleroma.Web.MediaProxy.Invalidation.Script, + Pleroma.Web.MediaProxy.Invalidation.Http + ] + } + ] + }, %{ key: :proxy_opts, + label: "Proxy Options", type: :keyword, description: "Options for Pleroma.ReverseProxy", suggestions: [ @@ -1641,6 +1687,7 @@ config :pleroma, :config_description, [ }, %{ key: :http, + label: "HTTP", type: :keyword, description: "HTTP options", children: [ @@ -1684,6 +1731,45 @@ config :pleroma, :config_description, [ } ] }, + %{ + group: :pleroma, + key: Pleroma.Web.MediaProxy.Invalidation.Http, + type: :group, + description: "HTTP invalidate settings", + children: [ + %{ + key: :method, + type: :atom, + description: "HTTP method of request. Default: :purge" + }, + %{ + key: :headers, + type: {:list, :tuple}, + description: "HTTP headers of request.", + suggestions: [{"x-refresh", 1}] + }, + %{ + key: :options, + type: :keyword, + description: "Request options.", + suggestions: [params: %{ts: "xxx"}] + } + ] + }, + %{ + group: :pleroma, + key: Pleroma.Web.MediaProxy.Invalidation.Script, + type: :group, + description: "Script invalidate settings", + children: [ + %{ + key: :script_path, + type: :string, + description: "Path to shell script. Which will run purge cache.", + suggestions: ["./installation/nginx-cache-purge.sh.example"] + } + ] + }, %{ group: :pleroma, key: :gopher, @@ -1697,6 +1783,7 @@ config :pleroma, :config_description, [ }, %{ key: :ip, + label: "IP", type: :tuple, description: "IP address to bind to", suggestions: [{0, 0, 0, 0}] @@ -1710,7 +1797,7 @@ config :pleroma, :config_description, [ %{ key: :dstport, type: :integer, - description: "Port advertised in urls (optional, defaults to port)", + description: "Port advertised in URLs (optional, defaults to port)", suggestions: [9999] } ] @@ -1718,6 +1805,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :activitypub, + label: "ActivityPub", type: :group, description: "ActivityPub-related settings", children: [ @@ -1740,7 +1828,7 @@ config :pleroma, :config_description, [ key: :note_replies_output_limit, type: :integer, description: - "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)." + "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)" }, %{ key: :follow_handshake_timeout, @@ -1753,6 +1841,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :http_security, + label: "HTTP security", type: :group, description: "HTTP security settings", children: [ @@ -1791,7 +1880,7 @@ config :pleroma, :config_description, [ key: :report_uri, label: "Report URI", type: :string, - description: "Adds the specified url to report-uri and report-to group in CSP header", + description: "Adds the specified URL to report-uri and report-to group in CSP header", suggestions: ["https://example.com/report-uri"] } ] @@ -1799,9 +1888,10 @@ config :pleroma, :config_description, [ %{ group: :web_push_encryption, key: :vapid_details, + label: "Vapid Details", type: :group, description: - "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it", + "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it.", children: [ %{ key: :subject, @@ -1868,6 +1958,7 @@ config :pleroma, :config_description, [ }, %{ group: :pleroma, + label: "Pleroma Admin Token", type: :group, description: "Allows to set a token that can be used to authenticate with the admin api without using an actual user by giving it as the `admin_token` parameter", @@ -1875,7 +1966,7 @@ config :pleroma, :config_description, [ %{ key: :admin_token, type: :string, - description: "Token", + description: "Admin token", suggestions: ["We recommend a secure random string or UUID"] } ] @@ -2040,24 +2131,24 @@ config :pleroma, :config_description, [ key: :rich_media, type: :group, description: - "If enabled the instance will parse metadata from attached links to generate link previews.", + "If enabled the instance will parse metadata from attached links to generate link previews", children: [ %{ key: :enabled, type: :boolean, - description: "Enables RichMedia parsing of URLs." + description: "Enables RichMedia parsing of URLs" }, %{ key: :ignore_hosts, type: {:list, :string}, - description: "List of hosts which will be ignored by the metadata parser.", + description: "List of hosts which will be ignored by the metadata parser", suggestions: ["accounts.google.com", "xss.website"] }, %{ key: :ignore_tld, label: "Ignore TLD", type: {:list, :string}, - description: "List TLDs (top-level domains) which will ignore for parse metadata.", + description: "List TLDs (top-level domains) which will ignore for parse metadata", suggestions: ["local", "localdomain", "lan"] }, %{ @@ -2066,9 +2157,7 @@ config :pleroma, :config_description, [ description: "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name.", suggestions: [ - Pleroma.Web.RichMedia.Parsers.MetaTagsParser, Pleroma.Web.RichMedia.Parsers.OEmbed, - Pleroma.Web.RichMedia.Parsers.OGP, Pleroma.Web.RichMedia.Parsers.TwitterCard ] }, @@ -2087,31 +2176,32 @@ config :pleroma, :config_description, [ %{ group: :auto_linker, key: :opts, + label: "Auto Linker", type: :group, description: "Configuration for the auto_linker library", children: [ %{ key: :class, type: [:string, false], - description: "Specify the class to be added to the generated link. Disable to clear", + description: "Specify the class to be added to the generated link. Disable to clear.", suggestions: ["auto-linker", false] }, %{ key: :rel, type: [:string, false], - description: "Override the rel attribute. Disable to clear", + description: "Override the rel attribute. Disable to clear.", suggestions: ["ugc", "noopener noreferrer", false] }, %{ key: :new_window, type: :boolean, - description: "Link urls will open in new window/tab" + description: "Link URLs will open in new window/tab" }, %{ key: :truncate, type: [:integer, false], 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 then the number. Truncated URLs will end in `..`", suggestions: [15, false] }, %{ @@ -2122,7 +2212,7 @@ config :pleroma, :config_description, [ %{ key: :extra, type: :boolean, - description: "Link urls with rarely used schemes (magnet, ipfs, irc, etc.)" + description: "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)" } ] }, @@ -2168,6 +2258,7 @@ config :pleroma, :config_description, [ }, %{ group: :pleroma, + label: "Pleroma Authenticator", type: :group, description: "Authenticator", children: [ @@ -2181,6 +2272,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :ldap, + label: "LDAP", type: :group, description: "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password" <> @@ -2267,6 +2359,7 @@ config :pleroma, :config_description, [ }, %{ key: :uid, + label: "UID", type: :string, description: "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\"", @@ -2282,11 +2375,12 @@ config :pleroma, :config_description, [ children: [ %{ key: :enforce_oauth_admin_scope_usage, + label: "Enforce OAuth admin scope usage", type: :boolean, description: "OAuth admin scope requirement toggle. " <> "If enabled, admin actions explicitly demand admin OAuth scope(s) presence in OAuth token " <> - "(client app must support admin scopes). If disabled and token doesn't have admin scope(s)," <> + "(client app must support admin scopes). If disabled and token doesn't have admin scope(s), " <> "`is_admin` user flag grants access to admin-specific actions." }, %{ @@ -2298,6 +2392,7 @@ config :pleroma, :config_description, [ }, %{ key: :oauth_consumer_template, + label: "OAuth consumer template", type: :string, description: "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to" <> @@ -2306,6 +2401,7 @@ config :pleroma, :config_description, [ }, %{ key: :oauth_consumer_strategies, + label: "OAuth consumer strategies", type: {:list, :string}, description: "The list of enabled OAuth consumer strategies. By default it's set by OAUTH_CONSUMER_STRATEGIES environment variable." <> @@ -2434,7 +2530,7 @@ config :pleroma, :config_description, [ %{ key: :enabled, type: :boolean, - description: "enables new users admin digest email when `true`", + description: "Enables new users admin digest email when `true`", suggestions: [false] } ] @@ -2442,6 +2538,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :oauth2, + label: "OAuth2", type: :group, description: "Configure OAuth 2 provider capabilities", children: [ @@ -2460,7 +2557,7 @@ config :pleroma, :config_description, [ %{ key: :clean_expired_tokens, type: :boolean, - description: "Enable a background job to clean expired oauth tokens. Default: disabled." + description: "Enable a background job to clean expired OAuth tokens. Default: disabled." } ] }, @@ -2544,6 +2641,7 @@ config :pleroma, :config_description, [ }, %{ key: :relation_id_action, + label: "Relation ID action", type: [:tuple, {:list, :tuple}], description: "For actions on relation with a specific user (follow, unfollow)", suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]] @@ -2557,6 +2655,7 @@ config :pleroma, :config_description, [ }, %{ key: :status_id_action, + label: "Status ID action", type: [:tuple, {:list, :tuple}], description: "For fav / unfav or reblog / unreblog actions on the same status by the same user", @@ -2572,6 +2671,7 @@ config :pleroma, :config_description, [ }, %{ group: :esshd, + label: "ESSHD", type: :group, description: "Before enabling this you must add :esshd to mix.exs as one of the extra_applications " <> @@ -2610,8 +2710,9 @@ config :pleroma, :config_description, [ }, %{ group: :mime, + label: "Mime Types", type: :group, - description: "Mime types", + description: "Mime Types settings", children: [ %{ key: :types, @@ -2670,6 +2771,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :http, + label: "HTTP", type: :group, description: "HTTP settings", children: [ @@ -2718,6 +2820,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :markup, + label: "Markup Settings", type: :group, children: [ %{ @@ -2759,7 +2862,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :mrf_normalize_markup, - label: "MRF normalize markup", + label: "MRF Normalize Markup", description: "MRF NormalizeMarkup settings. Scrub configured hypertext markup.", type: :group, children: [ @@ -2815,6 +2918,7 @@ config :pleroma, :config_description, [ }, %{ group: :cors_plug, + label: "CORS plug config", type: :group, children: [ %{ @@ -2887,6 +2991,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :web_cache_ttl, + label: "Web cache TTL", type: :group, description: "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration.", @@ -2909,9 +3014,10 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :static_fe, + label: "Static FE", type: :group, description: - "Render profiles and posts using server-generated HTML that is viewable without using JavaScript.", + "Render profiles and posts using server-generated HTML that is viewable without using JavaScript", children: [ %{ key: :enabled, @@ -2929,18 +3035,18 @@ config :pleroma, :config_description, [ %{ key: :post_title, type: :map, - description: "Configure title rendering.", + description: "Configure title rendering", children: [ %{ key: :max_length, type: :integer, - description: "Maximum number of characters before truncating title.", + description: "Maximum number of characters before truncating title", suggestions: [100] }, %{ key: :omission, type: :string, - description: "Replacement which will be used after truncating string.", + description: "Replacement which will be used after truncating string", suggestions: ["..."] } ] @@ -2950,6 +3056,7 @@ config :pleroma, :config_description, [ %{ group: :pleroma, key: :mrf_object_age, + label: "MRF Object Age", type: :group, description: "Rejects or delists posts based on their age when received.", children: [ @@ -2992,13 +3099,13 @@ config :pleroma, :config_description, [ %{ key: :workers, type: :integer, - description: "Number of workers to send notifications.", + description: "Number of workers to send notifications", suggestions: [3] }, %{ key: :overflow_workers, type: :integer, - description: "Maximum number of workers created if pool is empty.", + description: "Maximum number of workers created if pool is empty", suggestions: [2] } ] @@ -3289,5 +3396,41 @@ config :pleroma, :config_description, [ suggestions: [false] } ] + }, + %{ + group: :pleroma, + key: :mrf, + type: :group, + description: "General MRF settings", + children: [ + %{ + key: :policies, + type: [:module, {:list, :module}], + description: + "A list of MRF policies enabled. Module names are shortened (removed leading `Pleroma.Web.ActivityPub.MRF.` part), but on adding custom module you need to use full name.", + suggestions: + Generator.list_modules_in_dir( + "lib/pleroma/web/activity_pub/mrf", + "Elixir.Pleroma.Web.ActivityPub.MRF." + ) + }, + %{ + key: :transparency, + label: "MRF transparency", + type: :boolean, + description: + "Make the content of your Message Rewrite Facility settings public (via nodeinfo)" + }, + %{ + key: :transparency_exclusions, + label: "MRF transparency exclusions", + type: {:list, :string}, + description: + "Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value.", + suggestions: [ + "exclusion.com" + ] + } + ] } ] diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index c455047cc..baf895d90 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -488,30 +488,52 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret ### Change the user's email, password, display and settings-related fields -- Params: - - `email` - - `password` - - `name` - - `bio` - - `avatar` - - `locked` - - `no_rich_text` - - `default_scope` - - `banner` - - `hide_follows` - - `hide_followers` - - `hide_followers_count` - - `hide_follows_count` - - `hide_favorites` - - `allow_following_move` - - `background` - - `show_role` - - `skip_thread_containment` - - `fields` - - `discoverable` - - `actor_type` - -- Response: none (code `200`) +* Params: + * `email` + * `password` + * `name` + * `bio` + * `avatar` + * `locked` + * `no_rich_text` + * `default_scope` + * `banner` + * `hide_follows` + * `hide_followers` + * `hide_followers_count` + * `hide_follows_count` + * `hide_favorites` + * `allow_following_move` + * `background` + * `show_role` + * `skip_thread_containment` + * `fields` + * `discoverable` + * `actor_type` + +* Responses: + +Status: 200 + +```json +{"status": "success"} +``` + +Status: 400 + +```json +{"errors": + {"actor_type": "is invalid"}, + {"email": "has invalid format"}, + ... + } +``` + +Status: 404 + +```json +{"error": "Not found"} +``` ## `GET /api/pleroma/admin/reports` @@ -531,7 +553,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret ```json { - "totalReports" : 1, + "total" : 1, "reports": [ { "account": { @@ -752,7 +774,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret - 400 Bad Request `"Invalid parameters"` when `status` is missing - On success: `204`, empty response -## `POST /api/pleroma/admin/reports/:report_id/notes/:id` +## `DELETE /api/pleroma/admin/reports/:report_id/notes/:id` ### Delete report note @@ -1096,6 +1118,10 @@ Loads json generated from `config/descriptions.exs`. ### Stats +- Query Params: + - *optional* `instance`: **string** instance hostname (without protocol) to get stats for +- Example: `https://mypleroma.org/api/pleroma/admin/stats?instance=lain.com` + - Response: ```json @@ -1208,4 +1234,66 @@ Loads json generated from `config/descriptions.exs`. - Response: - On success: `204`, empty response - On failure: - - 400 Bad Request `"Invalid parameters"` when `status` is missing \ No newline at end of file + - 400 Bad Request `"Invalid parameters"` when `status` is missing + +## `GET /api/pleroma/admin/media_proxy_caches` + +### Get a list of all banned MediaProxy URLs in Cachex + +- Authentication: required +- Params: +- *optional* `page`: **integer** page number +- *optional* `page_size`: **integer** number of log entries per page (default is `50`) + +- Response: + +``` json +{ + "urls": [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] +} + +``` + +## `POST /api/pleroma/admin/media_proxy_caches/delete` + +### Remove a banned MediaProxy URL from Cachex + +- Authentication: required +- Params: + - `urls` (array) + +- Response: + +``` json +{ + "urls": [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] +} + +``` + +## `POST /api/pleroma/admin/media_proxy_caches/purge` + +### Purge a MediaProxy URL + +- Authentication: required +- Params: + - `urls` (array) + - `ban` (boolean) + +- Response: + +``` json +{ + "urls": [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] +} + +``` diff --git a/docs/API/chats.md b/docs/API/chats.md new file mode 100644 index 000000000..aa6119670 --- /dev/null +++ b/docs/API/chats.md @@ -0,0 +1,248 @@ +# Chats + +Chats are a way to represent an IM-style conversation between two actors. They are not the same as direct messages and they are not `Status`es, even though they have a lot in common. + +## Why Chats? + +There are no 'visibility levels' in ActivityPub, their definition is purely a Mastodon convention. Direct Messaging between users on the fediverse has mostly been modeled by using ActivityPub addressing following Mastodon conventions on normal `Note` objects. In this case, a 'direct message' would be a message that has no followers addressed and also does not address the special public actor, but just the recipients in the `to` field. It would still be a `Note` and is presented with other `Note`s as a `Status` in the API. + +This is an awkward setup for a few reasons: + +- As DMs generally still follow the usual `Status` conventions, it is easy to accidentally pull somebody into a DM thread by mentioning them. (e.g. "I hate @badguy so much") +- It is possible to go from a publicly addressed `Status` to a DM reply, back to public, then to a 'followers only' reply, and so on. This can be become very confusing, as it is unclear which user can see which part of the conversation. +- The standard `Status` format of implicit addressing also leads to rather ugly results if you try to display the messages as a chat, because all the recipients are always mentioned by name in the message. +- As direct messages are posted with the same api call (and usually same frontend component) as public messages, accidentally making a public message private or vice versa can happen easily. Client bugs can also lead to this, accidentally making private messages public. + +As a measure to improve this situation, the `Conversation` concept and related Pleroma extensions were introduced. While it made it possible to work around a few of the issues, many of the problems remained and it didn't see much adoption because it was too complicated to use correctly. + +## Chats explained +For this reasons, Chats are a new and different entity, both in the API as well as in ActivityPub. A quick overview: + +- Chats are meant to represent an instant message conversation between two actors. For now these are only 1-on-1 conversations, but the other actor can be a group in the future. +- Chat messages have the ActivityPub type `ChatMessage`. They are not `Note`s. Servers that don't understand them will just drop them. +- The only addressing allowed in `ChatMessage`s is one single ActivityPub actor in the `to` field. +- There's always only one Chat between two actors. If you start chatting with someone and later start a 'new' Chat, the old Chat will be continued. +- `ChatMessage`s are posted with a different api, making it very hard to accidentally send a message to the wrong person. +- `ChatMessage`s don't show up in the existing timelines. +- Chats can never go from private to public. They are always private between the two actors. + +## Caveats + +- Chats are NOT E2E encrypted (yet). Security is still the same as email. + +## API + +In general, the way to send a `ChatMessage` is to first create a `Chat`, then post a message to that `Chat`. `Group`s will later be supported by making them a sub-type of `Account`. + +This is the overview of using the API. The API is also documented via OpenAPI, so you can view it and play with it by pointing SwaggerUI or a similar OpenAPI tool to `https://yourinstance.tld/api/openapi`. + +### Creating or getting a chat. + +To create or get an existing Chat for a certain recipient (identified by Account ID) +you can call: + +`POST /api/v1/pleroma/chats/by-account-id/:account_id` + +The account id is the normal FlakeId of the user +``` +POST /api/v1/pleroma/chats/by-account-id/someflakeid +``` + +If you already have the id of a chat, you can also use + +``` +GET /api/v1/pleroma/chats/:id +``` + +There will only ever be ONE Chat for you and a given recipient, so this call +will return the same Chat if you already have one with that user. + +Returned data: + +```json +{ + "account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2, + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" +} +``` + +### Marking a chat as read + +To mark a number of messages in a chat up to a certain message as read, you can use + +`POST /api/v1/pleroma/chats/:id/read` + + +Parameters: +- last_read_id: Given this id, all chat messages until this one will be marked as read. Required. + + +Returned data: + +```json +{ + "account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 0, + "updated_at": "2020-04-21T15:11:46.000Z" +} +``` + +### Marking a single chat message as read + +To set the `unread` property of a message to `false` + +`POST /api/v1/pleroma/chats/:id/messages/:message_id/read` + +Returned data: + +The modified chat message + +### Getting a list of Chats + +`GET /api/v1/pleroma/chats` + +This will return a list of chats that you have been involved in, sorted by their +last update (so new chats will be at the top). + +Returned data: + +```json +[ + { + "account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2, + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" + } +] +``` + +The recipient of messages that are sent to this chat is given by their AP ID. +No pagination is implemented for now. + +### Getting the messages for a Chat + +For a given Chat id, you can get the associated messages with + +`GET /api/v1/pleroma/chats/:id/messages` + +This will return all messages, sorted by most recent to least recent. The usual +pagination options are implemented. + +Returned data: + +```json +[ + { + "account_id": "someflakeid", + "chat_id": "1", + "content": "Check this out :firefox:", + "created_at": "2020-04-21T15:11:46.000Z", + "emojis": [ + { + "shortcode": "firefox", + "static_url": "https://dontbulling.me/emoji/Firefox.gif", + "url": "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker": false + } + ], + "id": "13", + "unread": true + }, + { + "account_id": "someflakeid", + "chat_id": "1", + "content": "Whats' up?", + "created_at": "2020-04-21T15:06:45.000Z", + "emojis": [], + "id": "12", + "unread": false + } +] +``` + +### Posting a chat message + +Posting a chat message for given Chat id works like this: + +`POST /api/v1/pleroma/chats/:id/messages` + +Parameters: +- content: The text content of the message. Optional if media is attached. +- media_id: The id of an upload that will be attached to the message. + +Currently, no formatting beyond basic escaping and emoji is implemented. + +Returned data: + +```json +{ + "account_id": "someflakeid", + "chat_id": "1", + "content": "Check this out :firefox:", + "created_at": "2020-04-21T15:11:46.000Z", + "emojis": [ + { + "shortcode": "firefox", + "static_url": "https://dontbulling.me/emoji/Firefox.gif", + "url": "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker": false + } + ], + "id": "13", + "unread": false +} +``` + +### Deleting a chat message + +Deleting a chat message for given Chat id works like this: + +`DELETE /api/v1/pleroma/chats/:chat_id/messages/:message_id` + +Returned data is the deleted message. + +### Notifications + +There's a new `pleroma:chat_mention` notification, which has this form. It is not given out in the notifications endpoint by default, you need to explicitly request it with `include_types[]=pleroma:chat_mention`: + +```json +{ + "id": "someid", + "type": "pleroma:chat_mention", + "account": { ... } // User account of the sender, + "chat_message": { + "chat_id": "1", + "id": "10", + "content": "Hello", + "account_id": "someflakeid", + "unread": false + }, + "created_at": "somedate" +} +``` + +### Streaming + +There is an additional `user:pleroma_chat` stream. Incoming chat messages will make the current chat be sent to this `user` stream. The `event` of an incoming chat message is `pleroma:chat_update`. The payload is the updated chat with the incoming chat message in the `last_message` field. + +### Web Push + +If you want to receive push messages for this type, you'll need to add the `pleroma:chat_mention` type to your alerts in the push subscription. diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index e65fd5da4..13920e5f9 100644 --- a/docs/API/differences_in_mastoapi_responses.md +++ b/docs/API/differences_in_mastoapi_responses.md @@ -6,10 +6,6 @@ A Pleroma instance can be identified by " (compatible; Pleroma Pleroma uses 128-bit ids as opposed to Mastodon's 64 bits. However just like Mastodon's ids they are lexically sortable strings -## Attachment cap - -Some apps operate under the assumption that no more than 4 attachments can be returned or uploaded. Pleroma however does not enforce any limits on attachment count neither when returning the status object nor when posting. - ## Timelines Adding the parameter `with_muted=true` to the timeline queries will also return activities by muted (not by blocked!) users. @@ -31,13 +27,22 @@ Has these additional fields under the `pleroma` object: - `expires_at`: a datetime (iso8601) that states when the post will expire (be deleted automatically), or empty if the post won't expire - `thread_muted`: true if the thread the post belongs to is muted - `emoji_reactions`: A list with emoji / reaction maps. The format is `{name: "☕", count: 1, me: true}`. Contains no information about the reacting users, for that use the `/statuses/:id/reactions` endpoint. +- `parent_visible`: If the parent of this post is visible to the user or not. -## Attachments +## Media Attachments Has these additional fields under the `pleroma` object: - `mime_type`: mime type of the attachment. +### Attachment cap + +Some apps operate under the assumption that no more than 4 attachments can be returned or uploaded. Pleroma however does not enforce any limits on attachment count neither when returning the status object nor when posting. + +### Limitations + +Pleroma does not process remote images and therefore cannot include fields such as `meta` and `blurhash`. It does not support focal points or aspect ratios. The frontend is expected to handle it. + ## Accounts The `id` parameter can also be the `nickname` of the user. This only works in these endpoints, not the deeper nested ones for following etc. @@ -47,11 +52,14 @@ The `id` parameter can also be the `nickname` of the user. This only works in th Has these additional fields under the `pleroma` object: +- `ap_id`: nullable URL string, ActivityPub id of the user +- `background_image`: nullable URL string, background image of the user - `tags`: Lists an array of tags for the user -- `relationship{}`: Includes fields as documented for Mastodon API https://docs.joinmastodon.org/entities/relationship/ +- `relationship` (object): Includes fields as documented for Mastodon API https://docs.joinmastodon.org/entities/relationship/ - `is_moderator`: boolean, nullable, true if user is a moderator - `is_admin`: boolean, nullable, true if user is an admin - `confirmation_pending`: boolean, true if a new user account is waiting on email confirmation to be activated +- `hide_favorites`: boolean, true when the user has hiding favorites enabled - `hide_followers`: boolean, true when the user has follower hiding enabled - `hide_follows`: boolean, true when the user has follow hiding enabled - `hide_followers_count`: boolean, true when the user has follower stat hiding enabled @@ -62,6 +70,7 @@ Has these additional fields under the `pleroma` object: - `allow_following_move`: boolean, true when the user allows automatically follow moved following accounts - `unread_conversation_count`: The count of unread conversations. Only returned to the account owner. - `unread_notifications_count`: The count of unread notifications. Only returned to the account owner. +- `notification_settings`: object, can be absent. See `/api/pleroma/notification_settings` for the parameters/keys returned. ### Source @@ -226,3 +235,47 @@ Has theses additional parameters (which are the same as in Pleroma-API): Has these additional fields under the `pleroma` object: - `unread_count`: contains number unread notifications + +## Streaming + +There is an additional `user:pleroma_chat` stream. Incoming chat messages will make the current chat be sent to this `user` stream. The `event` of an incoming chat message is `pleroma:chat_update`. The payload is the updated chat with the incoming chat message in the `last_message` field. + +## Not implemented + +Pleroma is generally compatible with the Mastodon 2.7.2 API, but some newer features and non-essential features are omitted. These features usually return an HTTP 200 status code, but with an empty response. While they may be added in the future, they are considered low priority. + +### Suggestions + +*Added in Mastodon 2.4.3* + +- `GET /api/v1/suggestions`: Returns an empty array, `[]` + +### Trends + +*Added in Mastodon 3.0.0* + +- `GET /api/v1/trends`: Returns an empty array, `[]` + +### Identity proofs + +*Added in Mastodon 2.8.0* + +- `GET /api/v1/identity_proofs`: Returns an empty array, `[]` + +### Endorsements + +*Added in Mastodon 2.5.0* + +- `GET /api/v1/endorsements`: Returns an empty array, `[]` + +### Profile directory + +*Added in Mastodon 3.0.0* + +- `GET /api/v1/directory`: Returns HTTP 404 + +### Featured tags + +*Added in Mastodon 3.0.0* + +- `GET /api/v1/featured_tags`: Returns HTTP 404 diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index a25456b7d..b7eee5192 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -358,7 +358,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * `recipients`: A list of ids of users that should receive posts to this conversation. This will replace the current list of recipients, so submit the full list. The owner of owner of the conversation will always be part of the set of recipients, though. * Response: JSON, statuses (200 - healthy, 503 unhealthy) -## `GET /api/v1/pleroma/conversations/read` +## `POST /api/v1/pleroma/conversations/read` ### Marks all user's conversations as read. * Method `POST` * Authentication: required @@ -450,18 +450,44 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message. ## `GET /api/pleroma/emoji/packs` + ### Lists local custom emoji packs + * Method `GET` * Authentication: not required -* Params: None -* Response: JSON, "ok" and 200 status and the JSON hashmap of pack name to pack contents +* Params: + * `page`: page number for packs (default 1) + * `page_size`: page size for packs (default 50) +* Response: `packs` key with JSON hashmap of pack name to pack contents and `count` key for count of packs. + +```json +{ + "packs": { + "pack_name": {...}, // pack contents + ... + }, + "count": 0 // packs count +} +``` ## `GET /api/pleroma/emoji/packs/:name` + ### Get pack.json for the pack + * Method `GET` * Authentication: not required -* Params: None -* Response: JSON, pack json with `files` and `pack` keys with 200 status or 404 if the pack does not exist +* Params: + * `page`: page number for files (default 1) + * `page_size`: page size for files (default 30) +* Response: JSON, pack json with `files`, `files_count` and `pack` keys with 200 status or 404 if the pack does not exist. + +```json +{ + "files": {...}, + "files_count": 0, // emoji count in pack + "pack": {...} +} +``` ## `GET /api/pleroma/emoji/packs/:name/archive` ### Requests a local pack archive from the instance @@ -536,7 +562,7 @@ Emoji reactions work a lot like favourites do. They make it possible to react to ``` ## `GET /api/v1/pleroma/statuses/:id/reactions/:emoji` -### Get an object of emoji to account mappings with accounts that reacted to the post for a specific emoji` +### Get an object of emoji to account mappings with accounts that reacted to the post for a specific emoji * Method: `GET` * Authentication: optional * Params: None diff --git a/docs/administration/CLI_tasks/database.md b/docs/administration/CLI_tasks/database.md index ff400c8ed..647f6f274 100644 --- a/docs/administration/CLI_tasks/database.md +++ b/docs/administration/CLI_tasks/database.md @@ -69,3 +69,32 @@ mix pleroma.database update_users_following_followers_counts ```sh tab="From Source" mix pleroma.database fix_likes_collections ``` + +## Vacuum the database + +### Analyze + +Running an `analyze` vacuum job can improve performance by updating statistics used by the query planner. **It is safe to cancel this.** + +```sh tab="OTP" +./bin/pleroma_ctl database vacuum analyze +``` + +```sh tab="From Source" +mix pleroma.database vacuum analyze +``` + +### Full + +Running a `full` vacuum job rebuilds your entire database by reading all of the data and rewriting it into smaller +and more compact files with an optimized layout. This process will take a long time and use additional disk space as +it builds the files side-by-side the existing database files. It can make your database faster and use less disk space, +but should only be run if necessary. **It is safe to cancel this.** + +```sh tab="OTP" +./bin/pleroma_ctl database vacuum full +``` + +```sh tab="From Source" +mix pleroma.database vacuum full +``` \ No newline at end of file diff --git a/docs/administration/CLI_tasks/emoji.md b/docs/administration/CLI_tasks/emoji.md index 3d524a52b..ddcb7e62c 100644 --- a/docs/administration/CLI_tasks/emoji.md +++ b/docs/administration/CLI_tasks/emoji.md @@ -44,3 +44,11 @@ Currently, only .zip archives are recognized as remote pack files and packs are The manifest entry will either be written to a newly created `pack_name.json` file (pack name is asked in questions) or appended to the existing one, *replacing* the old pack with the same name if it was in the file previously. The file list will be written to the file specified previously, *replacing* that file. You _should_ check that the file list doesn't contain anything you don't need in the pack, that is, anything that is not an emoji (the whole pack is downloaded, but only emoji files are extracted). + +## Reload emoji packs + +```sh tab="OTP" +./bin/pleroma_ctl emoji reload +``` + +This command only works with OTP releases. diff --git a/docs/administration/CLI_tasks/user.md b/docs/administration/CLI_tasks/user.md index f535dad82..1e6f4a8b4 100644 --- a/docs/administration/CLI_tasks/user.md +++ b/docs/administration/CLI_tasks/user.md @@ -95,33 +95,33 @@ mix pleroma.user sign_out ``` -## Deactivate or activate a user +## Deactivate or activate a user ```sh tab="OTP" - ./bin/pleroma_ctl user toggle_activated + ./bin/pleroma_ctl user toggle_activated ``` ```sh tab="From Source" -mix pleroma.user toggle_activated +mix pleroma.user toggle_activated ``` -## Unsubscribe local users from a user and deactivate the user +## Deactivate a user and unsubscribes local users from the user ```sh tab="OTP" - ./bin/pleroma_ctl user unsubscribe NICKNAME + ./bin/pleroma_ctl user deactivate NICKNAME ``` ```sh tab="From Source" -mix pleroma.user unsubscribe NICKNAME +mix pleroma.user deactivate NICKNAME ``` -## Unsubscribe local users from an instance and deactivate all accounts on it +## Deactivate all accounts from an instance and unsubscribe local users on it ```sh tab="OTP" - ./bin/pleroma_ctl user unsubscribe_all_from_instance + ./bin/pleroma_ctl user deactivate_all_from_instance ``` ```sh tab="From Source" -mix pleroma.user unsubscribe_all_from_instance +mix pleroma.user deactivate_all_from_instance ``` @@ -135,6 +135,16 @@ mix pleroma.user reset_password ``` +## Disable Multi Factor Authentication (MFA/2FA) for a user +```sh tab="OTP" + ./bin/pleroma_ctl user reset_mfa +``` + +```sh tab="From Source" +mix pleroma.user reset_mfa +``` + + ## Set the value of the given user's settings ```sh tab="OTP" ./bin/pleroma_ctl user set [option ...] @@ -177,4 +187,3 @@ mix pleroma.user untag ```sh tab="From Source" mix pleroma.user toggle_confirmed ``` - diff --git a/docs/ap_extensions.md b/docs/ap_extensions.md new file mode 100644 index 000000000..c4550a1ac --- /dev/null +++ b/docs/ap_extensions.md @@ -0,0 +1,35 @@ +# ChatMessages + +ChatMessages are the messages sent in 1-on-1 chats. They are similar to +`Note`s, but the addresing is done by having a single AP actor in the `to` +field. Addressing multiple actors is not allowed. These messages are always +private, there is no public version of them. They are created with a `Create` +activity. + +Example: + +```json +{ + "actor": "http://2hu.gensokyo/users/raymoo", + "id": "http://2hu.gensokyo/objects/1", + "object": { + "attributedTo": "http://2hu.gensokyo/users/raymoo", + "content": "You expected a cute girl? Too bad.", + "id": "http://2hu.gensokyo/objects/2", + "published": "2020-02-12T14:08:20Z", + "to": [ + "http://2hu.gensokyo/users/marisa" + ], + "type": "ChatMessage" + }, + "published": "2018-02-12T14:08:20Z", + "to": [ + "http://2hu.gensokyo/users/marisa" + ], + "type": "Create" +} +``` + +This setup does not prevent multi-user chats, but these will have to go through +a `Group`, which will be the recipient of the messages and then `Announce` them +to the users in the `Group`. diff --git a/docs/clients.md b/docs/clients.md index 7f98dc7b1..ea751637e 100644 --- a/docs/clients.md +++ b/docs/clients.md @@ -42,6 +42,12 @@ Feel free to contact us to be added to this list! - Platforms: SailfishOS - Features: No Streaming +### Husky +- Source code: +- Contact: [@Husky@enigmatic.observer](https://enigmatic.observer/users/Husky) +- Platforms: Android +- Features: No Streaming, Emoji Reactions, Text Formatting, FE Stickers + ### Nekonium - Homepage: [F-Droid Repository](https://repo.gdgd.jp.net/), [Google Play](https://play.google.com/store/apps/details?id=com.apps.nekonium), [Amazon](https://www.amazon.co.jp/dp/B076FXPRBC/) - Source: diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 9af8ee95a..6759d5e93 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -36,30 +36,15 @@ To add configuration to your config file, you can copy it from the base config. * `federation_incoming_replies_max_depth`: Max. depth of reply-to activities fetching on incoming federation, to prevent out-of-memory situations while fetching very long threads. If set to `nil`, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes. * `federation_reachability_timeout_days`: Timeout (in days) of each external federation target being unreachable prior to pausing federating to it. * `allow_relay`: Enable Pleroma’s Relay, which makes it possible to follow a whole instance. -* `rewrite_policy`: Message Rewrite Policy, either one or a list. Here are the ones available by default: - * `Pleroma.Web.ActivityPub.MRF.NoOpPolicy`: Doesn’t modify activities (default). - * `Pleroma.Web.ActivityPub.MRF.DropPolicy`: Drops all activities. It generally doesn’t makes sense to use in production. - * `Pleroma.Web.ActivityPub.MRF.SimplePolicy`: Restrict the visibility of activities from certains instances (See [`:mrf_simple`](#mrf_simple)). - * `Pleroma.Web.ActivityPub.MRF.TagPolicy`: Applies policies to individual users based on tags, which can be set using pleroma-fe/admin-fe/any other app that supports Pleroma Admin API. For example it allows marking posts from individual users nsfw (sensitive). - * `Pleroma.Web.ActivityPub.MRF.SubchainPolicy`: Selectively runs other MRF policies when messages match (See [`:mrf_subchain`](#mrf_subchain)). - * `Pleroma.Web.ActivityPub.MRF.RejectNonPublic`: Drops posts with non-public visibility settings (See [`:mrf_rejectnonpublic`](#mrf_rejectnonpublic)). - * `Pleroma.Web.ActivityPub.MRF.EnsureRePrepended`: Rewrites posts to ensure that replies to posts with subjects do not have an identical subject and instead begin with re:. - * `Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy`: Rejects posts from likely spambots by rejecting posts from new users that contain links. - * `Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy`: Crawls attachments using their MediaProxy URLs so that the MediaProxy cache is primed. - * `Pleroma.Web.ActivityPub.MRF.MentionPolicy`: Drops posts mentioning configurable users. (See [`:mrf_mention`](#mrf_mention)). - * `Pleroma.Web.ActivityPub.MRF.VocabularyPolicy`: Restricts activities to a configured set of vocabulary. (See [`:mrf_vocabulary`](#mrf_vocabulary)). - * `Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy`: Rejects or delists posts based on their age when received. (See [`:mrf_object_age`](#mrf_object_age)). -* `public`: Makes the client API in authentificated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. +* `public`: Makes the client API in authenticated mode-only except for user-profiles. Useful for disabling the Local Timeline and The Whole Known Network. * `quarantined_instances`: List of ActivityPub instances where private(DMs, followers-only) activities will not be send. * `managed_config`: Whenether the config for pleroma-fe is configured in [:frontend_configurations](#frontend_configurations) or in ``static/config.json``. * `allowed_post_formats`: MIME-type list of formats allowed to be posted (transformed into HTML). -* `mrf_transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo). -* `mrf_transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. * `extended_nickname_format`: Set to `true` to use extended local nicknames format (allows underscores/dashes). This will break federation with older software for theses nicknames. * `max_pinned_statuses`: The maximum number of pinned statuses. `0` will disable the feature. * `autofollowed_nicknames`: Set to nicknames of (local) users that every new user should automatically follow. -* `no_attachment_links`: Set to true to disable automatically adding attachment link text to statuses. +* `attachment_links`: Set to true to enable automatically adding attachment link text to statuses. * `welcome_message`: A message that will be send to a newly registered users as a direct message. * `welcome_user_nickname`: The nickname of the local user that sends the welcome message. * `max_report_comment_size`: The maximum size of the report comment (Default: `1000`). @@ -77,11 +62,30 @@ To add configuration to your config file, you can copy it from the base config. * `external_user_synchronization`: Enabling following/followers counters synchronization for external users. * `cleanup_attachments`: Remove attachments along with statuses. Does not affect duplicate files and attachments without status. Enabling this will increase load to database when deleting statuses on larger instances. +## Message rewrite facility + +### :mrf +* `policies`: Message Rewrite Policy, either one or a list. Here are the ones available by default: + * `Pleroma.Web.ActivityPub.MRF.NoOpPolicy`: Doesn’t modify activities (default). + * `Pleroma.Web.ActivityPub.MRF.DropPolicy`: Drops all activities. It generally doesn’t makes sense to use in production. + * `Pleroma.Web.ActivityPub.MRF.SimplePolicy`: Restrict the visibility of activities from certains instances (See [`:mrf_simple`](#mrf_simple)). + * `Pleroma.Web.ActivityPub.MRF.TagPolicy`: Applies policies to individual users based on tags, which can be set using pleroma-fe/admin-fe/any other app that supports Pleroma Admin API. For example it allows marking posts from individual users nsfw (sensitive). + * `Pleroma.Web.ActivityPub.MRF.SubchainPolicy`: Selectively runs other MRF policies when messages match (See [`:mrf_subchain`](#mrf_subchain)). + * `Pleroma.Web.ActivityPub.MRF.RejectNonPublic`: Drops posts with non-public visibility settings (See [`:mrf_rejectnonpublic`](#mrf_rejectnonpublic)). + * `Pleroma.Web.ActivityPub.MRF.EnsureRePrepended`: Rewrites posts to ensure that replies to posts with subjects do not have an identical subject and instead begin with re:. + * `Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy`: Rejects posts from likely spambots by rejecting posts from new users that contain links. + * `Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy`: Crawls attachments using their MediaProxy URLs so that the MediaProxy cache is primed. + * `Pleroma.Web.ActivityPub.MRF.MentionPolicy`: Drops posts mentioning configurable users. (See [`:mrf_mention`](#mrf_mention)). + * `Pleroma.Web.ActivityPub.MRF.VocabularyPolicy`: Restricts activities to a configured set of vocabulary. (See [`:mrf_vocabulary`](#mrf_vocabulary)). + * `Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy`: Rejects or delists posts based on their age when received. (See [`:mrf_object_age`](#mrf_object_age)). +* `transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo). +* `transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. + ## Federation ### MRF policies !!! note - Configuring MRF policies is not enough for them to take effect. You have to enable them by specifying their module in `rewrite_policy` under [:instance](#instance) section. + Configuring MRF policies is not enough for them to take effect. You have to enable them by specifying their module in `policies` under [:mrf](#mrf) section. #### :mrf_simple * `media_removal`: List of instances to remove media from. @@ -137,8 +141,9 @@ their ActivityPub ID. An example: ```elixir -config :pleroma, :mrf_user_allowlist, - "example.org": ["https://example.org/users/admin"] +config :pleroma, :mrf_user_allowlist, %{ + "example.org" => ["https://example.org/users/admin"] +} ``` #### :mrf_object_age @@ -149,6 +154,15 @@ config :pleroma, :mrf_user_allowlist, * `:strip_followers` removes followers from the ActivityPub recipient list, ensuring they won't be delivered to home timelines * `:reject` rejects the message entirely +#### mrf_steal_emoji +* `hosts`: List of hosts to steal emojis from +* `rejected_shortcodes`: Regex-list of shortcodes to reject +* `size_limit`: File size limit (in bytes), checked before an emoji is saved to the disk + +#### :mrf_activity_expiration + +* `days`: Default global expiration time for all local Create activities (in days) + ### :activitypub * `unfollow_blocked`: Whether blocks result in people getting unfollowed * `outgoing_blocks`: Whether to federate blocks to other instances @@ -257,7 +271,7 @@ This section describe PWA manifest instance-specific values. Currently this opti #### Pleroma.Web.MediaProxy.Invalidation.Script -This strategy allow perform external bash script to purge cache. +This strategy allow perform external shell script to purge cache. Urls of attachments pass to script as arguments. * `script_path`: path to external script. @@ -273,8 +287,8 @@ config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Script, This strategy allow perform custom http request to purge cache. * `method`: http method. default is `purge` -* `headers`: http headers. default is empty -* `options`: request options. default is empty +* `headers`: http headers. +* `options`: request options. Example: ```elixir @@ -493,6 +507,7 @@ the source code is here: https://github.com/koto-bank/kocaptcha. The default end * `base_url`: The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host. * `proxy_remote`: If you're using a remote uploader, Pleroma will proxy media requests instead of redirecting to it. * `proxy_opts`: Proxy options, see `Pleroma.ReverseProxy` documentation. +* `filename_display_max_length`: Set max length of a filename to display. 0 = no limit. Default: 30. !!! warning `strip_exif` has been replaced by `Pleroma.Upload.Filter.Mogrify`. @@ -957,13 +972,13 @@ config :pleroma, :database_config_whitelist, [ Restrict access for unauthenticated users to timelines (public and federate), user profiles and statuses. -* `timelines` - public and federated timelines - * `local` - public timeline +* `timelines`: public and federated timelines + * `local`: public timeline * `federated` -* `profiles` - user profiles +* `profiles`: user profiles * `local` * `remote` -* `activities` - statuses +* `activities`: statuses * `local` * `remote` diff --git a/docs/configuration/howto_theming_your_instance.md b/docs/configuration/howto_theming_your_instance.md index d0daf5b25..cfa00f538 100644 --- a/docs/configuration/howto_theming_your_instance.md +++ b/docs/configuration/howto_theming_your_instance.md @@ -60,7 +60,7 @@ Example of `my-awesome-theme.json` where we add the name "My Awesome Theme" ### Set as default theme -Now we can set the new theme as default in the [Pleroma FE configuration](General-tips-for-customizing-Pleroma-FE.md). +Now we can set the new theme as default in the [Pleroma FE configuration](../../../frontend/CONFIGURATION). Example of adding the new theme in the back-end config files ```elixir diff --git a/docs/configuration/mrf.md b/docs/configuration/mrf.md index d48d0cc99..31c66e098 100644 --- a/docs/configuration/mrf.md +++ b/docs/configuration/mrf.md @@ -34,9 +34,9 @@ config :pleroma, :instance, To use `SimplePolicy`, you must enable it. Do so by adding the following to your `:instance` config object, so that it looks like this: ```elixir -config :pleroma, :instance, +config :pleroma, :mrf, [...] - rewrite_policy: Pleroma.Web.ActivityPub.MRF.SimplePolicy + policies: Pleroma.Web.ActivityPub.MRF.SimplePolicy ``` Once `SimplePolicy` is enabled, you can configure various groups in the `:mrf_simple` config object. These groups are: @@ -58,8 +58,8 @@ Servers should be configured as lists. This example will enable `SimplePolicy`, block media from `illegalporn.biz`, mark media as NSFW from `porn.biz` and `porn.business`, reject messages from `spam.com`, remove messages from `spam.university` from the federated timeline and block reports (flags) from `whiny.whiner`: ```elixir -config :pleroma, :instance, - rewrite_policy: [Pleroma.Web.ActivityPub.MRF.SimplePolicy] +config :pleroma, :mrf, + policies: [Pleroma.Web.ActivityPub.MRF.SimplePolicy] config :pleroma, :mrf_simple, media_removal: ["illegalporn.biz"], @@ -75,7 +75,7 @@ The effects of MRF policies can be very drastic. It is important to use this fun ## Writing your own MRF Policy -As discussed above, the MRF system is a modular system that supports pluggable policies. This means that an admin may write a custom MRF policy in Elixir or any other language that runs on the Erlang VM, by specifying the module name in the `rewrite_policy` config setting. +As discussed above, the MRF system is a modular system that supports pluggable policies. This means that an admin may write a custom MRF policy in Elixir or any other language that runs on the Erlang VM, by specifying the module name in the `policies` config setting. For example, here is a sample policy module which rewrites all messages to "new message content": @@ -125,8 +125,8 @@ end If you save this file as `lib/pleroma/web/activity_pub/mrf/rewrite_policy.ex`, it will be included when you next rebuild Pleroma. You can enable it in the configuration like so: ```elixir -config :pleroma, :instance, - rewrite_policy: [ +config :pleroma, :mrf, + policies: [ Pleroma.Web.ActivityPub.MRF.SimplePolicy, Pleroma.Web.ActivityPub.MRF.RewritePolicy ] diff --git a/docs/configuration/postgresql.md b/docs/configuration/postgresql.md new file mode 100644 index 000000000..6983fb459 --- /dev/null +++ b/docs/configuration/postgresql.md @@ -0,0 +1,31 @@ +# Optimizing your PostgreSQL performance + +Pleroma performance depends to a large extent on good database performance. The default PostgreSQL settings are mostly fine, but often you can get better performance by changing a few settings. + +You can use [PGTune](https://pgtune.leopard.in.ua) to get recommendations for your setup. If you do, set the "Number of Connections" field to 20, as Pleroma will only use 10 concurrent connections anyway. If you don't, it will give you advice that might even hurt your performance. + +We also recommend not using the "Network Storage" option. + +## Example configurations + +Here are some configuration suggestions for PostgreSQL 10+. + +### 1GB RAM, 1 CPU +``` +shared_buffers = 256MB +effective_cache_size = 768MB +maintenance_work_mem = 64MB +work_mem = 13107kB +``` + +### 2GB RAM, 2 CPU +``` +shared_buffers = 512MB +effective_cache_size = 1536MB +maintenance_work_mem = 128MB +work_mem = 26214kB +max_worker_processes = 2 +max_parallel_workers_per_gather = 1 +max_parallel_workers = 2 +``` + diff --git a/docs/configuration/storing_remote_media.md b/docs/configuration/storing_remote_media.md index 7e91fe7d9..c01985d25 100644 --- a/docs/configuration/storing_remote_media.md +++ b/docs/configuration/storing_remote_media.md @@ -33,6 +33,6 @@ as soon as the post is received by your instance. Add to your `prod.secret.exs`: ``` -config :pleroma, :instance, - rewrite_policy: [Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy] +config :pleroma, :mrf, + policies: [Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy] ``` diff --git a/docs/dev.md b/docs/dev.md index f1b4cbf8b..9c749c17c 100644 --- a/docs/dev.md +++ b/docs/dev.md @@ -20,4 +20,4 @@ This document contains notes and guidelines for Pleroma developers. ## Auth-related configuration, OAuth consumer mode etc. -See `Authentication` section of [`docs/configuration/cheatsheet.md`](docs/configuration/cheatsheet.md#authentication). +See `Authentication` section of [the configuration cheatsheet](configuration/cheatsheet.md#authentication). diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..1a90d0a8d --- /dev/null +++ b/docs/index.md @@ -0,0 +1,26 @@ +# Introduction to Pleroma +## What is Pleroma? +Pleroma is a federated social networking platform, compatible with Mastodon and other ActivityPub implementations. It is free software licensed under the AGPLv3. +It actually consists of two components: a backend, named simply Pleroma, and a user-facing frontend, named Pleroma-FE. It also includes the Mastodon frontend, if that's your thing. +It's part of what we call the fediverse, a federated network of instances which speak common protocols and can communicate with each other. +One account on an instance is enough to talk to the entire fediverse! + +## How can I use it? + +Pleroma instances are already widely deployed, a list can be found at and . + +If you don't feel like joining an existing instance, but instead prefer to deploy your own instance, that's easy too! +Installation instructions can be found in the installation section of these docs. + +## I got an account, now what? +Great! Now you can explore the fediverse! Open the login page for your Pleroma instance (e.g. ) and login with your username and password. (If you don't have an account yet, click on Register) + +### Pleroma-FE +The default front-end used by Pleroma is Pleroma-FE. You can find more information on what it is and how to use it in the [Introduction to Pleroma-FE](../frontend). + +### Mastodon interface +If the Pleroma interface isn't your thing, or you're just trying something new but you want to keep using the familiar Mastodon interface, we got that too! +Just add a "/web" after your instance url (e.g. ) and you'll end on the Mastodon web interface, but with a Pleroma backend! MAGIC! +The Mastodon interface is from the Glitch-soc fork. For more information on the Mastodon interface you can check the [Mastodon](https://docs.joinmastodon.org/) and [Glitch-soc](https://glitch-soc.github.io/docs/) documentation. + +Remember, what you see is only the frontend part of Mastodon, the backend is still Pleroma. diff --git a/docs/installation/alpine_linux_en.md b/docs/installation/alpine_linux_en.md index 2a9b8f6ff..c726d559f 100644 --- a/docs/installation/alpine_linux_en.md +++ b/docs/installation/alpine_linux_en.md @@ -225,10 +225,7 @@ sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new + +#### Further reading + +{! backend/installation/further_reading.include !} + +## Questions + +Questions about the installation or didn’t it work as it should be, ask in [#pleroma:matrix.org](https://matrix.heldscal.la/#/room/#freenode_#pleroma:matrix.org) or IRC Channel **#pleroma** on **Freenode**. diff --git a/docs/installation/openbsd_en.md b/docs/installation/openbsd_en.md index e8c5d844c..5dbe24f75 100644 --- a/docs/installation/openbsd_en.md +++ b/docs/installation/openbsd_en.md @@ -242,3 +242,11 @@ If your instance is up and running, you can create your first user with administ ``` LC_ALL=en_US.UTF-8 MIX_ENV=prod mix pleroma.user new --admin ``` + +#### Further reading + +{! backend/installation/further_reading.include !} + +## Questions + +Questions about the installation or didn’t it work as it should be, ask in [#pleroma:matrix.org](https://matrix.heldscal.la/#/room/#freenode_#pleroma:matrix.org) or IRC Channel **#pleroma** on **Freenode**. diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index fb99af699..e4f822d1c 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -63,7 +63,7 @@ apt install postgresql-11-rum ``` #### (Optional) Performance configuration -For optimal performance, you may use [PGTune](https://pgtune.leopard.in.ua), don't forget to restart postgresql after editing the configuration +It is encouraged to check [Optimizing your PostgreSQL performance](../configuration/postgresql.md) document, for tips on PostgreSQL tuning. ```sh tab="Alpine" rc-service postgresql restart @@ -270,10 +270,7 @@ This will create an account withe the username of 'joeuser' with the email addre ## Further reading -* [Backup your instance](../administration/backup.md) -* [Hardening your instance](../configuration/hardening.md) -* [How to activate mediaproxy](../configuration/howto_mediaproxy.md) -* [Updating your instance](../administration/updating.md) +{! backend/installation/further_reading.include !} ## Questions diff --git a/docs/introduction.md b/docs/introduction.md deleted file mode 100644 index a915c143c..000000000 --- a/docs/introduction.md +++ /dev/null @@ -1,65 +0,0 @@ -# Introduction to Pleroma -## What is Pleroma? -Pleroma is a federated social networking platform, compatible with GNU social, Mastodon and other OStatus and ActivityPub implementations. It is free software licensed under the AGPLv3. -It actually consists of two components: a backend, named simply Pleroma, and a user-facing frontend, named Pleroma-FE. It also includes the Mastodon frontend, if that's your thing. -It's part of what we call the fediverse, a federated network of instances which speak common protocols and can communicate with each other. -One account on an instance is enough to talk to the entire fediverse! - -## How can I use it? - -Pleroma instances are already widely deployed, a list can be found at . Information on all existing fediverse instances can be found at . - -If you don't feel like joining an existing instance, but instead prefer to deploy your own instance, that's easy too! -Installation instructions can be found in the installation section of these docs. - -## I got an account, now what? -Great! Now you can explore the fediverse! Open the login page for your Pleroma instance (e.g. ) and login with your username and password. (If you don't have an account yet, click on Register) - -At this point you will have two columns in front of you. - -### Left column - -- first block: here you can see your avatar, your nickname and statistics (Statuses, Following, Followers). Clicking your profile pic will open your profile. -Under that you have a text form which allows you to post new statuses. The number on the bottom of the text form is a character counter, every instance can have a different character limit (the default is 5000). -If you want to mention someone, type @ + name of the person. A drop-down menu will help you in finding the right person. -Under the text form there are also several visibility options and there is the option to use rich text. -Under that the icon on the left is for uploading media files and attach them to your post. There is also an emoji-picker and an option to post a poll. -To post your status, simply press Submit. -On the top right you will also see a wrench icon. This opens your personal settings. - -- second block: Here you can switch between the different timelines: - - Timeline: all the people that you follow - - Interactions: here you can switch between different timelines where there was interaction with your account. There is Mentions, Repeats and Favorites, and New follows - - Direct Messages: these are the Direct Messages sent to you - - Public Timeline: all the statutes from the local instance - - The Whole Known Network: all public posts the instance knows about, both local and remote! - - About: This isn't a Timeline but shows relevant info about the instance. You can find a list of the moderators and admins, Terms of Service, MRF policies and enabled features. -- Optional third block: This is the Instance panel that can be activated, but is deactivated by default. It's fully customisable and by default has links to the pleroma-fe and Mastodon-fe. -- fourth block: This is the Notifications block, here you will get notified whenever somebody mentions you, follows you, repeats or favorites one of your statuses. - -### Right column -This is where the interesting stuff happens! -Depending on the timeline you will see different statuses, but each status has a standard structure: - -- Profile pic, name and link to profile. An optional left-arrow if it's a reply to another status (hovering will reveal the reply-to status). Clicking on the profile pic will uncollapse the user's profile. -- A `+` button on the right allows you to Expand/Collapse an entire discussion thread. It also updates in realtime! -- An arrow icon allows you to open the status on the instance where it's originating from. -- The text of the status, including mentions and attachements. If you click on a mention, it will automatically open the profile page of that person. -- Three buttons (left to right): Reply, Repeat, Favorite. There is also a forth button, this is a dropdown menu for simple moderation like muting the conversation or, if you have moderation rights, delete the status from the server. - -### Top right - -- The magnifier icon opens the search screen where you can search for statuses, people and hashtags. It's also possible to import statusses from remote servers by pasting the url to the post in the search field. -- The gear icon gives you general settings -- If you have admin rights, you'll see an icon that opens the admin interface -- The last icon is to log out - -### Bottom right -On the bottom right you have a chatbox. Here you can communicate with people on the same instance in realtime. It is local-only, for now, but there are plans to make it extendable to the entire fediverse! - -### Mastodon interface -If the Pleroma interface isn't your thing, or you're just trying something new but you want to keep using the familiar Mastodon interface, we got that too! -Just add a "/web" after your instance url (e.g. ) and you'll end on the Mastodon web interface, but with a Pleroma backend! MAGIC! -The Mastodon interface is from the Glitch-soc fork. For more information on the Mastodon interface you can check the [Mastodon](https://docs.joinmastodon.org/) and [Glitch-soc](https://glitch-soc.github.io/docs/) documentation. - -Remember, what you see is only the frontend part of Mastodon, the backend is still Pleroma. diff --git a/elixir_buildpack.config b/elixir_buildpack.config index c23b08fb8..946408c12 100644 --- a/elixir_buildpack.config +++ b/elixir_buildpack.config @@ -1,2 +1,2 @@ -elixir_version=1.8.2 -erlang_version=21.3.7 +elixir_version=1.9.4 +erlang_version=22.3.4.1 diff --git a/installation/nginx-cache-purge.sh.example b/installation/nginx-cache-purge.sh.example index b2915321c..5f6cbb128 100755 --- a/installation/nginx-cache-purge.sh.example +++ b/installation/nginx-cache-purge.sh.example @@ -13,7 +13,7 @@ CACHE_DIRECTORY="/tmp/pleroma-media-cache" ## $3 - (optional) the number of parallel processes to run for grep. get_cache_files() { local max_parallel=${3-16} - find $2 -maxdepth 2 -type d | xargs -P $max_parallel -n 1 grep -E Rl "^KEY:.*$1" | sort -u + find $2 -maxdepth 2 -type d | xargs -P $max_parallel -n 1 grep -E -Rl "^KEY:.*$1" | sort -u } ## Removes an item from the given cache zone. @@ -37,4 +37,4 @@ purge() { } -purge $1 +purge $@ diff --git a/installation/pleroma.nginx b/installation/pleroma.nginx index 688be3e71..d301ca615 100644 --- a/installation/pleroma.nginx +++ b/installation/pleroma.nginx @@ -37,18 +37,17 @@ server { listen 443 ssl http2; listen [::]:443 ssl http2; - ssl_session_timeout 5m; + ssl_session_timeout 1d; + ssl_session_cache shared:MozSSL:10m; # about 40000 sessions + ssl_session_tickets off; ssl_trusted_certificate /etc/letsencrypt/live/example.tld/chain.pem; ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem; - # Add TLSv1.0 to support older devices - ssl_protocols TLSv1.2; - # Uncomment line below if you want to support older devices (Before Android 4.4.2, IE 8, etc.) - # ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES"; + ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4"; - ssl_prefer_server_ciphers on; + ssl_prefer_server_ciphers off; # In case of an old server with an OpenSSL version of 1.0.2 or below, # leave only prime256v1 or comment out the following line. ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1; diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 5c9ef6904..d5129d410 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -52,6 +52,7 @@ defmodule Mix.Tasks.Pleroma.Config do defp do_migrate_to_db(config_file) do if File.exists?(config_file) do + shell_info("Migrating settings from file: #{Path.expand(config_file)}") Ecto.Adapters.SQL.query!(Repo, "TRUNCATE config;") Ecto.Adapters.SQL.query!(Repo, "ALTER SEQUENCE config_id_seq RESTART;") @@ -72,8 +73,7 @@ defmodule Mix.Tasks.Pleroma.Config do group |> Pleroma.Config.Loader.filter_group(settings) |> Enum.each(fn {key, value} -> - key = inspect(key) - {:ok, _} = ConfigDB.update_or_create(%{group: inspect(group), key: key, value: value}) + {:ok, _} = ConfigDB.update_or_create(%{group: group, key: key, value: value}) shell_info("Settings for key #{key} migrated.") end) @@ -131,12 +131,9 @@ defmodule Mix.Tasks.Pleroma.Config do end defp write(config, file) do - value = - config.value - |> ConfigDB.from_binary() - |> inspect(limit: :infinity) + value = inspect(config.value, limit: :infinity) - IO.write(file, "config #{config.group}, #{config.key}, #{value}\r\n\r\n") + IO.write(file, "config #{inspect(config.group)}, #{inspect(config.key)}, #{value}\r\n\r\n") config end diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 778de162f..82e2abdcb 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -4,6 +4,7 @@ defmodule Mix.Tasks.Pleroma.Database do alias Pleroma.Conversation + alias Pleroma.Maintenance alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User @@ -34,13 +35,7 @@ defmodule Mix.Tasks.Pleroma.Database do ) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL") - - Repo.query!( - "vacuum full;", - [], - timeout: :infinity - ) + Maintenance.vacuum("full") end end @@ -94,13 +89,7 @@ defmodule Mix.Tasks.Pleroma.Database do |> Repo.delete_all(timeout: :infinity) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL") - - Repo.query!( - "vacuum full;", - [], - timeout: :infinity - ) + Maintenance.vacuum("full") end end @@ -135,4 +124,10 @@ defmodule Mix.Tasks.Pleroma.Database do end) |> Stream.run() end + + def run(["vacuum", args]) do + start_pleroma() + + Maintenance.vacuum(args) + end end diff --git a/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index cdffa88b2..f4eaeac98 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -15,7 +15,7 @@ defmodule Mix.Tasks.Pleroma.Emoji do {options, [], []} = parse_global_opts(args) url_or_path = options[:manifest] || default_manifest() - manifest = fetch_manifest(url_or_path) + manifest = fetch_and_decode(url_or_path) Enum.each(manifest, fn {name, info} -> to_print = [ @@ -42,12 +42,12 @@ defmodule Mix.Tasks.Pleroma.Emoji do url_or_path = options[:manifest] || default_manifest() - manifest = fetch_manifest(url_or_path) + manifest = fetch_and_decode(url_or_path) for pack_name <- pack_names do if Map.has_key?(manifest, pack_name) do pack = manifest[pack_name] - src_url = pack["src"] + src = pack["src"] IO.puts( IO.ANSI.format([ @@ -57,11 +57,11 @@ defmodule Mix.Tasks.Pleroma.Emoji do :normal, " from ", :underline, - src_url + src ]) ) - binary_archive = Tesla.get!(client(), src_url).body + {:ok, binary_archive} = fetch(src) archive_sha = :crypto.hash(:sha256, binary_archive) |> Base.encode16() sha_status_text = ["SHA256 of ", :bright, pack_name, :normal, " source file is ", :bright] @@ -74,8 +74,8 @@ defmodule Mix.Tasks.Pleroma.Emoji do raise "Bad SHA256 for #{pack_name}" end - # The url specified in files should be in the same directory - files_url = + # The location specified in files should be in the same directory + files_loc = url_or_path |> Path.dirname() |> Path.join(pack["files"]) @@ -88,11 +88,11 @@ defmodule Mix.Tasks.Pleroma.Emoji do :normal, " from ", :underline, - files_url + files_loc ]) ) - files = Tesla.get!(client(), files_url).body |> Jason.decode!() + files = fetch_and_decode(files_loc) IO.puts(IO.ANSI.format(["Unpacking ", :bright, pack_name])) @@ -237,16 +237,26 @@ defmodule Mix.Tasks.Pleroma.Emoji do end end - defp fetch_manifest(from) do - Jason.decode!( - if String.starts_with?(from, "http") do - Tesla.get!(client(), from).body - else - File.read!(from) - end - ) + def run(["reload"]) do + start_pleroma() + Pleroma.Emoji.reload() + IO.puts("Emoji packs have been reloaded.") end + defp fetch_and_decode(from) do + with {:ok, json} <- fetch(from) do + Jason.decode!(json) + end + end + + defp fetch("http" <> _ = from) do + with {:ok, %{body: body}} <- Tesla.get(client(), from) do + {:ok, body} + end + end + + defp fetch(path), do: File.read(path) + defp parse_global_opts(args) do OptionParser.parse( args, diff --git a/lib/mix/tasks/pleroma/instance.ex b/lib/mix/tasks/pleroma/instance.ex index bc842a59f..86409738a 100644 --- a/lib/mix/tasks/pleroma/instance.ex +++ b/lib/mix/tasks/pleroma/instance.ex @@ -147,6 +147,7 @@ defmodule Mix.Tasks.Pleroma.Instance do "What directory should media uploads go in (when using the local uploader)?", Pleroma.Config.get([Pleroma.Uploaders.Local, :uploads]) ) + |> Path.expand() static_dir = get_option( @@ -155,6 +156,7 @@ defmodule Mix.Tasks.Pleroma.Instance do "What directory should custom public files be read from (custom emojis, frontend bundle overrides, robots.txt, etc.)?", Pleroma.Config.get([:instance, :static_dir]) ) + |> Path.expand() Config.put([:instance, :static_dir], static_dir) @@ -204,7 +206,7 @@ defmodule Mix.Tasks.Pleroma.Instance do shell_info("Writing the postgres script to #{psql_path}.") File.write(psql_path, result_psql) - write_robots_txt(indexable, template_dir) + write_robots_txt(static_dir, indexable, template_dir) shell_info( "\n All files successfully written! Refer to the installation instructions for your platform for next steps." @@ -224,15 +226,13 @@ defmodule Mix.Tasks.Pleroma.Instance do end end - defp write_robots_txt(indexable, template_dir) do + defp write_robots_txt(static_dir, indexable, template_dir) do robots_txt = EEx.eval_file( template_dir <> "/robots_txt.eex", indexable: indexable ) - static_dir = Pleroma.Config.get([:instance, :static_dir], "instance/static/") - unless File.exists?(static_dir) do File.mkdir_p!(static_dir) end diff --git a/lib/mix/tasks/pleroma/refresh_counter_cache.ex b/lib/mix/tasks/pleroma/refresh_counter_cache.ex index 15b4dbfa6..efcbaa3b1 100644 --- a/lib/mix/tasks/pleroma/refresh_counter_cache.ex +++ b/lib/mix/tasks/pleroma/refresh_counter_cache.ex @@ -17,30 +17,53 @@ defmodule Mix.Tasks.Pleroma.RefreshCounterCache do def run([]) do Mix.Pleroma.start_pleroma() - ["public", "unlisted", "private", "direct"] - |> Enum.each(fn visibility -> - count = status_visibility_count_query(visibility) - name = "status_visibility_#{visibility}" - CounterCache.set(name, count) - Mix.Pleroma.shell_info("Set #{name} to #{count}") + instances = + Activity + |> distinct([a], true) + |> select([a], fragment("split_part(?, '/', 3)", a.actor)) + |> Repo.all() + + instances + |> Enum.with_index(1) + |> Enum.each(fn {instance, i} -> + counters = instance_counters(instance) + CounterCache.set(instance, counters) + + Mix.Pleroma.shell_info( + "[#{i}/#{length(instances)}] Setting #{instance} counters: #{inspect(counters)}" + ) end) Mix.Pleroma.shell_info("Done") end - defp status_visibility_count_query(visibility) do + defp instance_counters(instance) do + counters = %{"public" => 0, "unlisted" => 0, "private" => 0, "direct" => 0} + Activity - |> where( + |> where([a], fragment("(? ->> 'type'::text) = 'Create'", a.data)) + |> where([a], fragment("split_part(?, '/', 3) = ?", a.actor, ^instance)) + |> select( + [a], + {fragment( + "activity_visibility(?, ?, ?)", + a.actor, + a.recipients, + a.data + ), count(a.id)} + ) + |> group_by( [a], fragment( - "activity_visibility(?, ?, ?) = ?", + "activity_visibility(?, ?, ?)", a.actor, a.recipients, - a.data, - ^visibility + a.data ) ) - |> where([a], fragment("(? ->> 'type'::text) = 'Create'", a.data)) - |> Repo.aggregate(:count, :id, timeout: :timer.minutes(30)) + |> Repo.all(timeout: :timer.minutes(30)) + |> Enum.reduce(counters, fn {visibility, count}, acc -> + Map.put(acc, visibility, count) + end) end end diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index da140ac86..bca7e87bf 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -144,28 +144,30 @@ defmodule Mix.Tasks.Pleroma.User do end end - def run(["unsubscribe", nickname]) do + def run(["reset_mfa", nickname]) do + start_pleroma() + + with %User{local: true} = user <- User.get_cached_by_nickname(nickname), + {:ok, _token} <- Pleroma.MFA.disable(user) do + shell_info("Multi-Factor Authentication disabled for #{user.nickname}") + else + _ -> + shell_error("No local user #{nickname}") + end + end + + def run(["deactivate", nickname]) do start_pleroma() with %User{} = user <- User.get_cached_by_nickname(nickname) do shell_info("Deactivating #{user.nickname}") User.deactivate(user) - - user - |> User.get_friends() - |> Enum.each(fn friend -> - user = User.get_cached_by_id(user.id) - - shell_info("Unsubscribing #{friend.nickname} from #{user.nickname}") - User.unfollow(user, friend) - end) - :timer.sleep(500) user = User.get_cached_by_id(user.id) - if Enum.empty?(User.get_friends(user)) do - shell_info("Successfully unsubscribed all followers from #{user.nickname}") + if Enum.empty?(Enum.filter(User.get_friends(user), & &1.local)) do + shell_info("Successfully unsubscribed all local followers from #{user.nickname}") end else _ -> @@ -173,7 +175,7 @@ defmodule Mix.Tasks.Pleroma.User do end end - def run(["unsubscribe_all_from_instance", instance]) do + def run(["deactivate_all_from_instance", instance]) do start_pleroma() Pleroma.User.Query.build(%{nickname: "@#{instance}"}) @@ -181,7 +183,7 @@ defmodule Mix.Tasks.Pleroma.User do |> Stream.each(fn users -> users |> Enum.each(fn user -> - run(["unsubscribe", user.nickname]) + run(["deactivate", user.nickname]) end) end) |> Stream.run() diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 6213d0eb7..c3cea8d2a 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -24,16 +24,6 @@ defmodule Pleroma.Activity do @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true} - # https://github.com/tootsuite/mastodon/blob/master/app/models/notification.rb#L19 - @mastodon_notification_types %{ - "Create" => "mention", - "Follow" => ["follow", "follow_request"], - "Announce" => "reblog", - "Like" => "favourite", - "Move" => "move", - "EmojiReact" => "pleroma:emoji_reaction" - } - schema "activities" do field(:data, :map) field(:local, :boolean, default: true) @@ -41,6 +31,10 @@ defmodule Pleroma.Activity do field(:recipients, {:array, :string}, default: []) field(:thread_muted?, :boolean, virtual: true) + # A field that can be used if you need to join some kind of other + # id to order / paginate this field by + field(:pagination_id, :string, virtual: true) + # This is a fake relation, # do not use outside of with_preloaded_user_actor/with_joined_user_actor has_one(:user_actor, User, on_delete: :nothing, foreign_key: :id) @@ -300,32 +294,6 @@ defmodule Pleroma.Activity do def follow_accepted?(_), do: false - @spec mastodon_notification_type(Activity.t()) :: String.t() | nil - - for {ap_type, type} <- @mastodon_notification_types, not is_list(type) do - def mastodon_notification_type(%Activity{data: %{"type" => unquote(ap_type)}}), - do: unquote(type) - end - - def mastodon_notification_type(%Activity{data: %{"type" => "Follow"}} = activity) do - if follow_accepted?(activity) do - "follow" - else - "follow_request" - end - end - - def mastodon_notification_type(%Activity{}), do: nil - - @spec from_mastodon_notification_type(String.t()) :: String.t() | nil - @doc "Converts Mastodon notification type to AR activity type" - def from_mastodon_notification_type(type) do - with {k, _v} <- - Enum.find(@mastodon_notification_types, fn {_k, v} -> type in List.wrap(v) end) do - k - end - end - def all_by_actor_and_id(actor, status_ids \\ []) def all_by_actor_and_id(_actor, []), do: [] diff --git a/lib/pleroma/activity/queries.ex b/lib/pleroma/activity/queries.ex index a34c20343..c99aae44b 100644 --- a/lib/pleroma/activity/queries.ex +++ b/lib/pleroma/activity/queries.ex @@ -24,10 +24,7 @@ defmodule Pleroma.Activity.Queries do @spec by_actor(query, String.t()) :: query def by_actor(query \\ Activity, actor) do - from( - activity in query, - where: fragment("(?)->>'actor' = ?", activity.data, ^actor) - ) + from(a in query, where: a.actor == ^actor) end @spec by_author(query, User.t()) :: query diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index 9d3d92b38..9615af122 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -39,7 +39,7 @@ defmodule Pleroma.Application do Pleroma.HTML.compile_scrubbers() Config.DeprecationWarnings.warn() Pleroma.Plugs.HTTPSecurityPlug.warn_if_disabled() - Pleroma.Repo.check_migrations_applied!() + Pleroma.ApplicationRequirements.verify!() setup_instrumenters() load_custom_modules() @@ -148,7 +148,8 @@ defmodule Pleroma.Application do build_cachex("idempotency", expiration: idempotency_expiration(), limit: 2500), build_cachex("web_resp", limit: 2500), build_cachex("emoji_packs", expiration: emoji_packs_expiration(), limit: 10), - build_cachex("failed_proxy_url", limit: 2500) + build_cachex("failed_proxy_url", limit: 2500), + build_cachex("banned_urls", default_ttl: :timer.hours(24 * 30), limit: 5_000) ] end diff --git a/lib/pleroma/application_requirements.ex b/lib/pleroma/application_requirements.ex new file mode 100644 index 000000000..88575a498 --- /dev/null +++ b/lib/pleroma/application_requirements.ex @@ -0,0 +1,107 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.ApplicationRequirements do + @moduledoc """ + The module represents the collection of validations to runs before start server. + """ + + defmodule VerifyError, do: defexception([:message]) + + import Ecto.Query + + require Logger + + @spec verify!() :: :ok | VerifyError.t() + def verify! do + :ok + |> check_migrations_applied!() + |> check_rum!() + |> handle_result() + end + + defp handle_result(:ok), do: :ok + defp handle_result({:error, message}), do: raise(VerifyError, message: message) + + # Checks for pending migrations. + # + def check_migrations_applied!(:ok) do + unless Pleroma.Config.get( + [:i_am_aware_this_may_cause_data_loss, :disable_migration_check], + false + ) do + {_, res, _} = + Ecto.Migrator.with_repo(Pleroma.Repo, fn repo -> + down_migrations = + Ecto.Migrator.migrations(repo) + |> Enum.reject(fn + {:up, _, _} -> true + {:down, _, _} -> false + end) + + if length(down_migrations) > 0 do + down_migrations_text = + Enum.map(down_migrations, fn {:down, id, name} -> "- #{name} (#{id})\n" end) + + Logger.error( + "The following migrations were not applied:\n#{down_migrations_text}If you want to start Pleroma anyway, set\nconfig :pleroma, :i_am_aware_this_may_cause_data_loss, disable_migration_check: true" + ) + + {:error, "Unapplied Migrations detected"} + else + :ok + end + end) + + res + else + :ok + end + end + + def check_migrations_applied!(result), do: result + + # Checks for settings of RUM indexes. + # + defp check_rum!(:ok) do + {_, res, _} = + Ecto.Migrator.with_repo(Pleroma.Repo, fn repo -> + migrate = + from(o in "columns", + where: o.table_name == "objects", + where: o.column_name == "fts_content" + ) + |> repo.exists?(prefix: "information_schema") + + setting = Pleroma.Config.get([:database, :rum_enabled], false) + + do_check_rum!(setting, migrate) + end) + + res + end + + defp check_rum!(result), do: result + + defp do_check_rum!(setting, migrate) do + case {setting, migrate} do + {true, false} -> + Logger.error( + "Use `RUM` index is enabled, but were not applied migrations for it.\nIf you want to start Pleroma anyway, set\nconfig :pleroma, :database, rum_enabled: false\nOtherwise apply the following migrations:\n`mix ecto.migrate --migrations-path priv/repo/optional_migrations/rum_indexing/`" + ) + + {:error, "Unapplied RUM Migrations detected"} + + {false, true} -> + Logger.error( + "Detected applied migrations to use `RUM` index, but `RUM` isn't enable in settings.\nIf you want to use `RUM`, set\nconfig :pleroma, :database, rum_enabled: true\nOtherwise roll `RUM` migrations back.\n`mix ecto.rollback --migrations-path priv/repo/optional_migrations/rum_indexing/`" + ) + + {:error, "RUM Migrations detected"} + + _ -> + :ok + end + end +end diff --git a/lib/pleroma/bbs/handler.ex b/lib/pleroma/bbs/handler.ex index 12d64c2fe..cd523cf7d 100644 --- a/lib/pleroma/bbs/handler.ex +++ b/lib/pleroma/bbs/handler.ex @@ -92,10 +92,10 @@ defmodule Pleroma.BBS.Handler do params = %{} - |> Map.put("type", ["Create"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) + |> Map.put(:type, ["Create"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) activities = [user.ap_id | Pleroma.User.following(user)] diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex new file mode 100644 index 000000000..24a86371e --- /dev/null +++ b/lib/pleroma/chat.ex @@ -0,0 +1,72 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Chat do + use Ecto.Schema + + import Ecto.Changeset + + alias Pleroma.Repo + alias Pleroma.User + + @moduledoc """ + Chat keeps a reference to ChatMessage conversations between a user and an recipient. The recipient can be a user (for now) or a group (not implemented yet). + + It is a helper only, to make it easy to display a list of chats with other people, ordered by last bump. The actual messages are retrieved by querying the recipients of the ChatMessages. + """ + + @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true} + + schema "chats" do + belongs_to(:user, User, type: FlakeId.Ecto.CompatType) + field(:recipient, :string) + + timestamps() + end + + def changeset(struct, params) do + struct + |> cast(params, [:user_id, :recipient]) + |> validate_change(:recipient, fn + :recipient, recipient -> + case User.get_cached_by_ap_id(recipient) do + nil -> [recipient: "must be an existing user"] + _ -> [] + end + end) + |> validate_required([:user_id, :recipient]) + |> unique_constraint(:user_id, name: :chats_user_id_recipient_index) + end + + def get_by_id(id) do + __MODULE__ + |> Repo.get(id) + end + + def get(user_id, recipient) do + __MODULE__ + |> Repo.get_by(user_id: user_id, recipient: recipient) + end + + def get_or_create(user_id, recipient) do + %__MODULE__{} + |> changeset(%{user_id: user_id, recipient: recipient}) + |> Repo.insert( + # Need to set something, otherwise we get nothing back at all + on_conflict: [set: [recipient: recipient]], + returning: true, + conflict_target: [:user_id, :recipient] + ) + end + + def bump_or_create(user_id, recipient) do + %__MODULE__{} + |> changeset(%{user_id: user_id, recipient: recipient}) + |> Repo.insert( + on_conflict: [set: [updated_at: NaiveDateTime.utc_now()]], + returning: true, + conflict_target: [:user_id, :recipient] + ) + end +end diff --git a/lib/pleroma/chat/message_reference.ex b/lib/pleroma/chat/message_reference.ex new file mode 100644 index 000000000..131ae0186 --- /dev/null +++ b/lib/pleroma/chat/message_reference.ex @@ -0,0 +1,117 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Chat.MessageReference do + @moduledoc """ + A reference that builds a relation between an AP chat message that a user can see and whether it has been seen + by them, or should be displayed to them. Used to build the chat view that is presented to the user. + """ + + use Ecto.Schema + + alias Pleroma.Chat + alias Pleroma.Object + alias Pleroma.Repo + + import Ecto.Changeset + import Ecto.Query + + @primary_key {:id, FlakeId.Ecto.Type, autogenerate: true} + + schema "chat_message_references" do + belongs_to(:object, Object) + belongs_to(:chat, Chat, type: FlakeId.Ecto.CompatType) + + field(:unread, :boolean, default: true) + + timestamps() + end + + def changeset(struct, params) do + struct + |> cast(params, [:object_id, :chat_id, :unread]) + |> validate_required([:object_id, :chat_id, :unread]) + end + + def get_by_id(id) do + __MODULE__ + |> Repo.get(id) + |> Repo.preload(:object) + end + + def delete(cm_ref) do + cm_ref + |> Repo.delete() + end + + def delete_for_object(%{id: object_id}) do + from(cr in __MODULE__, + where: cr.object_id == ^object_id + ) + |> Repo.delete_all() + end + + def for_chat_and_object(%{id: chat_id}, %{id: object_id}) do + __MODULE__ + |> Repo.get_by(chat_id: chat_id, object_id: object_id) + |> Repo.preload(:object) + end + + def for_chat_query(chat) do + from(cr in __MODULE__, + where: cr.chat_id == ^chat.id, + order_by: [desc: :id], + preload: [:object] + ) + end + + def last_message_for_chat(chat) do + chat + |> for_chat_query() + |> limit(1) + |> Repo.one() + end + + def create(chat, object, unread) do + params = %{ + chat_id: chat.id, + object_id: object.id, + unread: unread + } + + %__MODULE__{} + |> changeset(params) + |> Repo.insert() + end + + def unread_count_for_chat(chat) do + chat + |> for_chat_query() + |> where([cmr], cmr.unread == true) + |> Repo.aggregate(:count) + end + + def mark_as_read(cm_ref) do + cm_ref + |> changeset(%{unread: false}) + |> Repo.update() + end + + def set_all_seen_for_chat(chat, last_read_id \\ nil) do + query = + chat + |> for_chat_query() + |> exclude(:order_by) + |> exclude(:preload) + |> where([cmr], cmr.unread == true) + + if last_read_id do + query + |> where([cmr], cmr.id <= ^last_read_id) + else + query + end + |> Repo.update_all(set: [unread: false]) + end +end diff --git a/lib/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index 2b43d4c36..1a89d8895 100644 --- a/lib/pleroma/config/config_db.ex +++ b/lib/pleroma/config/config_db.ex @@ -6,7 +6,7 @@ defmodule Pleroma.ConfigDB do use Ecto.Schema import Ecto.Changeset - import Ecto.Query + import Ecto.Query, only: [select: 3] import Pleroma.Web.Gettext alias __MODULE__ @@ -14,16 +14,6 @@ defmodule Pleroma.ConfigDB do @type t :: %__MODULE__{} - @full_key_update [ - {:pleroma, :ecto_repos}, - {:quack, :meta}, - {:mime, :types}, - {:cors_plug, [:max_age, :methods, :expose, :headers]}, - {:auto_linker, :opts}, - {:swarm, :node_blacklist}, - {:logger, :backends} - ] - @full_subkey_update [ {:pleroma, :assets, :mascots}, {:pleroma, :emoji, :groups}, @@ -32,14 +22,10 @@ defmodule Pleroma.ConfigDB do {:pleroma, :mrf_keyword, :replace} ] - @regex ~r/^~r(?'delimiter'[\/|"'([{<]{1})(?'pattern'.+)[\/|"')\]}>]{1}(?'modifier'[uismxfU]*)/u - - @delimiters ["/", "|", "\"", "'", {"(", ")"}, {"[", "]"}, {"{", "}"}, {"<", ">"}] - schema "config" do - field(:key, :string) - field(:group, :string) - field(:value, :binary) + field(:key, Pleroma.EctoType.Config.Atom) + field(:group, Pleroma.EctoType.Config.Atom) + field(:value, Pleroma.EctoType.Config.BinaryValue) field(:db, {:array, :string}, virtual: true, default: []) timestamps() @@ -51,10 +37,6 @@ defmodule Pleroma.ConfigDB do |> select([c], {c.group, c.key, c.value}) |> Repo.all() |> Enum.reduce([], fn {group, key, value}, acc -> - group = ConfigDB.from_string(group) - key = ConfigDB.from_string(key) - value = from_binary(value) - Keyword.update(acc, group, [{key, value}], &Keyword.merge(&1, [{key, value}])) end) end @@ -64,50 +46,41 @@ defmodule Pleroma.ConfigDB do @spec changeset(ConfigDB.t(), map()) :: Changeset.t() def changeset(config, params \\ %{}) do - params = Map.put(params, :value, transform(params[:value])) - config |> cast(params, [:key, :group, :value]) |> validate_required([:key, :group, :value]) |> unique_constraint(:key, name: :config_group_key_index) end - @spec create(map()) :: {:ok, ConfigDB.t()} | {:error, Changeset.t()} - def create(params) do + defp create(params) do %ConfigDB{} |> changeset(params) |> Repo.insert() end - @spec update(ConfigDB.t(), map()) :: {:ok, ConfigDB.t()} | {:error, Changeset.t()} - def update(%ConfigDB{} = config, %{value: value}) do + defp update(%ConfigDB{} = config, %{value: value}) do config |> changeset(%{value: value}) |> Repo.update() end - @spec get_db_keys(ConfigDB.t()) :: [String.t()] - def get_db_keys(%ConfigDB{} = config) do - config.value - |> ConfigDB.from_binary() - |> get_db_keys(config.key) - end - @spec get_db_keys(keyword(), any()) :: [String.t()] def get_db_keys(value, key) do - if Keyword.keyword?(value) do - value |> Keyword.keys() |> Enum.map(&convert(&1)) - else - [convert(key)] - end + keys = + if Keyword.keyword?(value) do + Keyword.keys(value) + else + [key] + end + + Enum.map(keys, &to_json_types(&1)) end @spec merge_group(atom(), atom(), keyword(), keyword()) :: keyword() def merge_group(group, key, old_value, new_value) do - new_keys = to_map_set(new_value) + new_keys = to_mapset(new_value) - intersect_keys = - old_value |> to_map_set() |> MapSet.intersection(new_keys) |> MapSet.to_list() + intersect_keys = old_value |> to_mapset() |> MapSet.intersection(new_keys) |> MapSet.to_list() merged_value = ConfigDB.merge(old_value, new_value) @@ -120,12 +93,10 @@ defmodule Pleroma.ConfigDB do [] end) |> List.flatten() - |> Enum.reduce(merged_value, fn subkey, acc -> - Keyword.put(acc, subkey, new_value[subkey]) - end) + |> Enum.reduce(merged_value, &Keyword.put(&2, &1, new_value[&1])) end - defp to_map_set(keyword) do + defp to_mapset(keyword) do keyword |> Keyword.keys() |> MapSet.new() @@ -159,57 +130,55 @@ defmodule Pleroma.ConfigDB do @spec update_or_create(map()) :: {:ok, ConfigDB.t()} | {:error, Changeset.t()} def update_or_create(params) do + params = Map.put(params, :value, to_elixir_types(params[:value])) search_opts = Map.take(params, [:group, :key]) with %ConfigDB{} = config <- ConfigDB.get_by_params(search_opts), - {:partial_update, true, config} <- - {:partial_update, can_be_partially_updated?(config), config}, - old_value <- from_binary(config.value), - transformed_value <- do_transform(params[:value]), - {:can_be_merged, true, config} <- {:can_be_merged, is_list(transformed_value), config}, - new_value <- - merge_group( - ConfigDB.from_string(config.group), - ConfigDB.from_string(config.key), - old_value, - transformed_value - ) do - ConfigDB.update(config, %{value: new_value}) + {_, true, config} <- {:partial_update, can_be_partially_updated?(config), config}, + {_, true, config} <- + {:can_be_merged, is_list(params[:value]) and is_list(config.value), config} do + new_value = merge_group(config.group, config.key, config.value, params[:value]) + update(config, %{value: new_value}) else {reason, false, config} when reason in [:partial_update, :can_be_merged] -> - ConfigDB.update(config, params) + update(config, params) nil -> - ConfigDB.create(params) + create(params) end end defp can_be_partially_updated?(%ConfigDB{} = config), do: not only_full_update?(config) - defp only_full_update?(%ConfigDB{} = config) do - config_group = ConfigDB.from_string(config.group) - config_key = ConfigDB.from_string(config.key) - - Enum.any?(@full_key_update, fn - {group, key} when is_list(key) -> - config_group == group and config_key in key - - {group, key} -> - config_group == group and config_key == key + defp only_full_update?(%ConfigDB{group: group, key: key}) do + full_key_update = [ + {:pleroma, :ecto_repos}, + {:quack, :meta}, + {:mime, :types}, + {:cors_plug, [:max_age, :methods, :expose, :headers]}, + {:auto_linker, :opts}, + {:swarm, :node_blacklist}, + {:logger, :backends} + ] + + Enum.any?(full_key_update, fn + {s_group, s_key} -> + group == s_group and ((is_list(s_key) and key in s_key) or key == s_key) end) end - @spec delete(map()) :: {:ok, ConfigDB.t()} | {:error, Changeset.t()} + @spec delete(ConfigDB.t() | map()) :: {:ok, ConfigDB.t()} | {:error, Changeset.t()} + def delete(%ConfigDB{} = config), do: Repo.delete(config) + def delete(params) do search_opts = Map.delete(params, :subkeys) with %ConfigDB{} = config <- ConfigDB.get_by_params(search_opts), {config, sub_keys} when is_list(sub_keys) <- {config, params[:subkeys]}, - old_value <- from_binary(config.value), - keys <- Enum.map(sub_keys, &do_transform_string(&1)), - {:partial_remove, config, new_value} when new_value != [] <- - {:partial_remove, config, Keyword.drop(old_value, keys)} do - ConfigDB.update(config, %{value: new_value}) + keys <- Enum.map(sub_keys, &string_to_elixir_types(&1)), + {_, config, new_value} when new_value != [] <- + {:partial_remove, config, Keyword.drop(config.value, keys)} do + update(config, %{value: new_value}) else {:partial_remove, config, []} -> Repo.delete(config) @@ -225,37 +194,32 @@ defmodule Pleroma.ConfigDB do end end - @spec from_binary(binary()) :: term() - def from_binary(binary), do: :erlang.binary_to_term(binary) - - @spec from_binary_with_convert(binary()) :: any() - def from_binary_with_convert(binary) do - binary - |> from_binary() - |> do_convert() + @spec to_json_types(term()) :: map() | list() | boolean() | String.t() + def to_json_types(entity) when is_list(entity) do + Enum.map(entity, &to_json_types/1) end - @spec from_string(String.t()) :: atom() | no_return() - def from_string(string), do: do_transform_string(string) + def to_json_types(%Regex{} = entity), do: inspect(entity) - @spec convert(any()) :: any() - def convert(entity), do: do_convert(entity) - - defp do_convert(entity) when is_list(entity) do - for v <- entity, into: [], do: do_convert(v) + def to_json_types(entity) when is_map(entity) do + Map.new(entity, fn {k, v} -> {to_json_types(k), to_json_types(v)} end) end - defp do_convert(%Regex{} = entity), do: inspect(entity) + def to_json_types({:args, args}) when is_list(args) do + arguments = + Enum.map(args, fn + arg when is_tuple(arg) -> inspect(arg) + arg -> to_json_types(arg) + end) - defp do_convert(entity) when is_map(entity) do - for {k, v} <- entity, into: %{}, do: {do_convert(k), do_convert(v)} + %{"tuple" => [":args", arguments]} end - defp do_convert({:proxy_url, {type, :localhost, port}}) do - %{"tuple" => [":proxy_url", %{"tuple" => [do_convert(type), "localhost", port]}]} + def to_json_types({:proxy_url, {type, :localhost, port}}) do + %{"tuple" => [":proxy_url", %{"tuple" => [to_json_types(type), "localhost", port]}]} end - defp do_convert({:proxy_url, {type, host, port}}) when is_tuple(host) do + def to_json_types({:proxy_url, {type, host, port}}) when is_tuple(host) do ip = host |> :inet_parse.ntoa() @@ -264,66 +228,64 @@ defmodule Pleroma.ConfigDB do %{ "tuple" => [ ":proxy_url", - %{"tuple" => [do_convert(type), ip, port]} + %{"tuple" => [to_json_types(type), ip, port]} ] } end - defp do_convert({:proxy_url, {type, host, port}}) do + def to_json_types({:proxy_url, {type, host, port}}) do %{ "tuple" => [ ":proxy_url", - %{"tuple" => [do_convert(type), to_string(host), port]} + %{"tuple" => [to_json_types(type), to_string(host), port]} ] } end - defp do_convert({:partial_chain, entity}), do: %{"tuple" => [":partial_chain", inspect(entity)]} + def to_json_types({:partial_chain, entity}), + do: %{"tuple" => [":partial_chain", inspect(entity)]} - defp do_convert(entity) when is_tuple(entity) do + def to_json_types(entity) when is_tuple(entity) do value = entity |> Tuple.to_list() - |> do_convert() + |> to_json_types() %{"tuple" => value} end - defp do_convert(entity) when is_boolean(entity) or is_number(entity) or is_nil(entity) do + def to_json_types(entity) when is_binary(entity), do: entity + + def to_json_types(entity) when is_boolean(entity) or is_number(entity) or is_nil(entity) do entity end - defp do_convert(entity) - when is_atom(entity) and entity in [:"tlsv1.1", :"tlsv1.2", :"tlsv1.3"] do + def to_json_types(entity) when entity in [:"tlsv1.1", :"tlsv1.2", :"tlsv1.3"] do ":#{entity}" end - defp do_convert(entity) when is_atom(entity), do: inspect(entity) + def to_json_types(entity) when is_atom(entity), do: inspect(entity) - defp do_convert(entity) when is_binary(entity), do: entity + @spec to_elixir_types(boolean() | String.t() | map() | list()) :: term() + def to_elixir_types(%{"tuple" => [":args", args]}) when is_list(args) do + arguments = + Enum.map(args, fn arg -> + if String.contains?(arg, ["{", "}"]) do + {elem, []} = Code.eval_string(arg) + elem + else + to_elixir_types(arg) + end + end) - @spec transform(any()) :: binary() | no_return() - def transform(entity) when is_binary(entity) or is_map(entity) or is_list(entity) do - entity - |> do_transform() - |> to_binary() + {:args, arguments} end - def transform(entity), do: to_binary(entity) - - @spec transform_with_out_binary(any()) :: any() - def transform_with_out_binary(entity), do: do_transform(entity) - - @spec to_binary(any()) :: binary() - def to_binary(entity), do: :erlang.term_to_binary(entity) - - defp do_transform(%Regex{} = entity), do: entity - - defp do_transform(%{"tuple" => [":proxy_url", %{"tuple" => [type, host, port]}]}) do - {:proxy_url, {do_transform_string(type), parse_host(host), port}} + def to_elixir_types(%{"tuple" => [":proxy_url", %{"tuple" => [type, host, port]}]}) do + {:proxy_url, {string_to_elixir_types(type), parse_host(host), port}} end - defp do_transform(%{"tuple" => [":partial_chain", entity]}) do + def to_elixir_types(%{"tuple" => [":partial_chain", entity]}) do {partial_chain, []} = entity |> String.replace(~r/[^\w|^{:,[|^,|^[|^\]^}|^\/|^\.|^"]^\s/, "") @@ -332,25 +294,51 @@ defmodule Pleroma.ConfigDB do {:partial_chain, partial_chain} end - defp do_transform(%{"tuple" => entity}) do - Enum.reduce(entity, {}, fn val, acc -> Tuple.append(acc, do_transform(val)) end) + def to_elixir_types(%{"tuple" => entity}) do + Enum.reduce(entity, {}, &Tuple.append(&2, to_elixir_types(&1))) end - defp do_transform(entity) when is_map(entity) do - for {k, v} <- entity, into: %{}, do: {do_transform(k), do_transform(v)} + def to_elixir_types(entity) when is_map(entity) do + Map.new(entity, fn {k, v} -> {to_elixir_types(k), to_elixir_types(v)} end) end - defp do_transform(entity) when is_list(entity) do - for v <- entity, into: [], do: do_transform(v) + def to_elixir_types(entity) when is_list(entity) do + Enum.map(entity, &to_elixir_types/1) end - defp do_transform(entity) when is_binary(entity) do + def to_elixir_types(entity) when is_binary(entity) do entity |> String.trim() - |> do_transform_string() + |> string_to_elixir_types() end - defp do_transform(entity), do: entity + def to_elixir_types(entity), do: entity + + @spec string_to_elixir_types(String.t()) :: + atom() | Regex.t() | module() | String.t() | no_return() + def string_to_elixir_types("~r" <> _pattern = regex) do + pattern = + ~r/^~r(?'delimiter'[\/|"'([{<]{1})(?'pattern'.+)[\/|"')\]}>]{1}(?'modifier'[uismxfU]*)/u + + delimiters = ["/", "|", "\"", "'", {"(", ")"}, {"[", "]"}, {"{", "}"}, {"<", ">"}] + + with %{"modifier" => modifier, "pattern" => pattern, "delimiter" => regex_delimiter} <- + Regex.named_captures(pattern, regex), + {:ok, {leading, closing}} <- find_valid_delimiter(delimiters, pattern, regex_delimiter), + {result, _} <- Code.eval_string("~r#{leading}#{pattern}#{closing}#{modifier}") do + result + end + end + + def string_to_elixir_types(":" <> atom), do: String.to_atom(atom) + + def string_to_elixir_types(value) do + if module_name?(value) do + String.to_existing_atom("Elixir." <> value) + else + value + end + end defp parse_host("localhost"), do: :localhost @@ -387,27 +375,8 @@ defmodule Pleroma.ConfigDB do end end - defp do_transform_string("~r" <> _pattern = regex) do - with %{"modifier" => modifier, "pattern" => pattern, "delimiter" => regex_delimiter} <- - Regex.named_captures(@regex, regex), - {:ok, {leading, closing}} <- find_valid_delimiter(@delimiters, pattern, regex_delimiter), - {result, _} <- Code.eval_string("~r#{leading}#{pattern}#{closing}#{modifier}") do - result - end - end - - defp do_transform_string(":" <> atom), do: String.to_atom(atom) - - defp do_transform_string(value) do - if is_module_name?(value) do - String.to_existing_atom("Elixir." <> value) - else - value - end - end - - @spec is_module_name?(String.t()) :: boolean() - def is_module_name?(string) do + @spec module_name?(String.t()) :: boolean() + def module_name?(string) do Regex.match?(~r/^(Pleroma|Phoenix|Tesla|Quack|Ueberauth|Swoosh)\./, string) or string in ["Oban", "Ueberauth", "ExSyslogger"] end diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex index c39a8984b..0a6c724fb 100644 --- a/lib/pleroma/config/deprecation_warnings.ex +++ b/lib/pleroma/config/deprecation_warnings.ex @@ -3,10 +3,25 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Config.DeprecationWarnings do + alias Pleroma.Config + require Logger + alias Pleroma.Config + + @type config_namespace() :: [atom()] + @type config_map() :: {config_namespace(), config_namespace(), String.t()} + + @mrf_config_map [ + {[:instance, :rewrite_policy], [:mrf, :policies], + "\n* `config :pleroma, :instance, rewrite_policy` is now `config :pleroma, :mrf, policies`"}, + {[:instance, :mrf_transparency], [:mrf, :transparency], + "\n* `config :pleroma, :instance, mrf_transparency` is now `config :pleroma, :mrf, transparency`"}, + {[:instance, :mrf_transparency_exclusions], [:mrf, :transparency_exclusions], + "\n* `config :pleroma, :instance, mrf_transparency_exclusions` is now `config :pleroma, :mrf, transparency_exclusions`"} + ] def check_hellthread_threshold do - if Pleroma.Config.get([:mrf_hellthread, :threshold]) do + if Config.get([:mrf_hellthread, :threshold]) do Logger.warn(""" !!!DEPRECATION WARNING!!! You are using the old configuration mechanism for the hellthread filter. Please check config.md. @@ -14,7 +29,59 @@ defmodule Pleroma.Config.DeprecationWarnings do end end + def mrf_user_allowlist do + config = Config.get(:mrf_user_allowlist) + + if config && Enum.any?(config, fn {k, _} -> is_atom(k) end) do + rewritten = + Enum.reduce(Config.get(:mrf_user_allowlist), Map.new(), fn {k, v}, acc -> + Map.put(acc, to_string(k), v) + end) + + Config.put(:mrf_user_allowlist, rewritten) + + Logger.error(""" + !!!DEPRECATION WARNING!!! + As of Pleroma 2.0.7, the `mrf_user_allowlist` setting changed of format. + Pleroma 2.1 will remove support for the old format. Please change your configuration to match this: + + config :pleroma, :mrf_user_allowlist, #{inspect(rewritten, pretty: true)} + """) + end + end + def warn do check_hellthread_threshold() + mrf_user_allowlist() + check_old_mrf_config() + end + + def check_old_mrf_config do + warning_preface = """ + !!!DEPRECATION WARNING!!! + Your config is using old namespaces for MRF configuration. They should work for now, but you are advised to change to new namespaces to prevent possible issues later: + """ + + move_namespace_and_warn(@mrf_config_map, warning_preface) + end + + @spec move_namespace_and_warn([config_map()], String.t()) :: :ok + def move_namespace_and_warn(config_map, warning_preface) do + warning = + Enum.reduce(config_map, "", fn + {old, new, err_msg}, acc -> + old_config = Config.get(old) + + if old_config do + Config.put(new, old_config) + acc <> err_msg + else + acc + end + end) + + if warning != "" do + Logger.warn(warning_preface <> warning) + end end end diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex index c02b70e96..eb86b8ff4 100644 --- a/lib/pleroma/config/transfer_task.ex +++ b/lib/pleroma/config/transfer_task.ex @@ -28,10 +28,6 @@ defmodule Pleroma.Config.TransferTask do {:pleroma, Pleroma.Captcha, [:seconds_valid]}, {:pleroma, Pleroma.Upload, [:proxy_remote]}, {:pleroma, :instance, [:upload_limit]}, - {:pleroma, :email_notifications, [:digest]}, - {:pleroma, :oauth2, [:clean_expired_tokens]}, - {:pleroma, Pleroma.ActivityExpiration, [:enabled]}, - {:pleroma, Pleroma.ScheduledActivity, [:enabled]}, {:pleroma, :gopher, [:enabled]} ] @@ -48,7 +44,7 @@ defmodule Pleroma.Config.TransferTask do {logger, other} = (Repo.all(ConfigDB) ++ deleted_settings) - |> Enum.map(&transform_and_merge/1) + |> Enum.map(&merge_with_default/1) |> Enum.split_with(fn {group, _, _, _} -> group in [:logger, :quack] end) logger @@ -92,11 +88,7 @@ defmodule Pleroma.Config.TransferTask do end end - defp transform_and_merge(%{group: group, key: key, value: value} = setting) do - group = ConfigDB.from_string(group) - key = ConfigDB.from_string(key) - value = ConfigDB.from_binary(value) - + defp merge_with_default(%{group: group, key: key, value: value} = setting) do default = Config.Holder.default_config(group, key) merged = diff --git a/lib/pleroma/constants.ex b/lib/pleroma/constants.ex index 06174f624..13eeaa96b 100644 --- a/lib/pleroma/constants.ex +++ b/lib/pleroma/constants.ex @@ -24,6 +24,6 @@ defmodule Pleroma.Constants do const(static_only_files, do: - ~w(index.html robots.txt static static-fe finmoji emoji packs sounds images instance sw.js sw-pleroma.js favicon.png schemas doc) + ~w(index.html robots.txt static static-fe finmoji emoji packs sounds images instance sw.js sw-pleroma.js favicon.png schemas doc embed.js embed.css) ) end diff --git a/lib/pleroma/conversation.ex b/lib/pleroma/conversation.ex index 37d455cfc..e76eb0087 100644 --- a/lib/pleroma/conversation.ex +++ b/lib/pleroma/conversation.ex @@ -63,7 +63,7 @@ defmodule Pleroma.Conversation do ap_id when is_binary(ap_id) and byte_size(ap_id) > 0 <- object.data["context"] do {:ok, conversation} = create_for_ap_id(ap_id) - users = User.get_users_from_set(activity.recipients, false) + users = User.get_users_from_set(activity.recipients, local_only: false) participations = Enum.map(users, fn user -> diff --git a/lib/pleroma/conversation/participation.ex b/lib/pleroma/conversation/participation.ex index 51bb1bda9..8bc3e85d6 100644 --- a/lib/pleroma/conversation/participation.ex +++ b/lib/pleroma/conversation/participation.ex @@ -162,10 +162,13 @@ defmodule Pleroma.Conversation.Participation do for_user(user, params) |> Enum.map(fn participation -> activity_id = - ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{ - "user" => user, - "blocking_user" => user - }) + ActivityPub.fetch_latest_direct_activity_id_for_context( + participation.conversation.ap_id, + %{ + user: user, + blocking_user: user + } + ) %{ participation diff --git a/lib/pleroma/counter_cache.ex b/lib/pleroma/counter_cache.ex index 4d348a413..ebd1f603d 100644 --- a/lib/pleroma/counter_cache.ex +++ b/lib/pleroma/counter_cache.ex @@ -10,32 +10,70 @@ defmodule Pleroma.CounterCache do import Ecto.Query schema "counter_cache" do - field(:name, :string) - field(:count, :integer) + field(:instance, :string) + field(:public, :integer) + field(:unlisted, :integer) + field(:private, :integer) + field(:direct, :integer) end def changeset(struct, params) do struct - |> cast(params, [:name, :count]) - |> validate_required([:name]) - |> unique_constraint(:name) + |> cast(params, [:instance, :public, :unlisted, :private, :direct]) + |> validate_required([:instance]) + |> unique_constraint(:instance) end - def get_as_map(names) when is_list(names) do + def get_by_instance(instance) do CounterCache - |> where([cc], cc.name in ^names) - |> Repo.all() - |> Enum.group_by(& &1.name, & &1.count) - |> Map.new(fn {k, v} -> {k, hd(v)} end) + |> select([c], %{ + "public" => c.public, + "unlisted" => c.unlisted, + "private" => c.private, + "direct" => c.direct + }) + |> where([c], c.instance == ^instance) + |> Repo.one() + |> case do + nil -> %{"public" => 0, "unlisted" => 0, "private" => 0, "direct" => 0} + val -> val + end end - def set(name, count) do + def get_sum do + CounterCache + |> select([c], %{ + "public" => type(sum(c.public), :integer), + "unlisted" => type(sum(c.unlisted), :integer), + "private" => type(sum(c.private), :integer), + "direct" => type(sum(c.direct), :integer) + }) + |> Repo.one() + end + + def set(instance, values) do + params = + Enum.reduce( + ["public", "private", "unlisted", "direct"], + %{"instance" => instance}, + fn param, acc -> + Map.put_new(acc, param, Map.get(values, param, 0)) + end + ) + %CounterCache{} - |> changeset(%{"name" => name, "count" => count}) + |> changeset(params) |> Repo.insert( - on_conflict: [set: [count: count]], + on_conflict: [ + set: [ + public: params["public"], + private: params["private"], + unlisted: params["unlisted"], + direct: params["direct"] + ] + ], returning: true, - conflict_target: :name + conflict_target: :instance ) end end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/date_time.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/date_time.ex similarity index 77% rename from lib/pleroma/web/activity_pub/object_validators/types/date_time.ex rename to lib/pleroma/ecto_type/activity_pub/object_validators/date_time.ex index 4f412fcde..d852c0abd 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/date_time.ex +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/date_time.ex @@ -1,4 +1,8 @@ -defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime do +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.DateTime do @moduledoc """ The AP standard defines the date fields in AP as xsd:DateTime. Elixir's DateTime can't parse this, but it can parse the related iso8601. This diff --git a/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/object_id.ex similarity index 69% rename from lib/pleroma/web/activity_pub/object_validators/types/object_id.ex rename to lib/pleroma/ecto_type/activity_pub/object_validators/object_id.ex index f71f76370..8034235b0 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/object_id.ex +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/object_id.ex @@ -1,4 +1,8 @@ -defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID do +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.ObjectID do use Ecto.Type def type, do: :string diff --git a/lib/pleroma/ecto_type/activity_pub/object_validators/recipients.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/recipients.ex new file mode 100644 index 000000000..205527a96 --- /dev/null +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/recipients.ex @@ -0,0 +1,40 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.Recipients do + use Ecto.Type + + alias Pleroma.EctoType.ActivityPub.ObjectValidators.ObjectID + + def type, do: {:array, ObjectID} + + def cast(object) when is_binary(object) do + cast([object]) + end + + def cast(data) when is_list(data) do + data + |> Enum.reduce_while({:ok, []}, fn element, {:ok, list} -> + case ObjectID.cast(element) do + {:ok, id} -> + {:cont, {:ok, [id | list]}} + + _ -> + {:halt, :error} + end + end) + end + + def cast(_) do + :error + end + + def dump(data) do + {:ok, data} + end + + def load(data) do + {:ok, data} + end +end diff --git a/lib/pleroma/ecto_type/activity_pub/object_validators/safe_text.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/safe_text.ex new file mode 100644 index 000000000..7f0405c7b --- /dev/null +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/safe_text.ex @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.SafeText do + use Ecto.Type + + alias Pleroma.HTML + + def type, do: :string + + def cast(str) when is_binary(str) do + {:ok, HTML.filter_tags(str)} + end + + def cast(_), do: :error + + def dump(data) do + {:ok, data} + end + + def load(data) do + {:ok, data} + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/uri.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/uri.ex similarity index 63% rename from lib/pleroma/web/activity_pub/object_validators/types/uri.ex rename to lib/pleroma/ecto_type/activity_pub/object_validators/uri.ex index 24845bcc0..2054c26be 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/uri.ex +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/uri.ex @@ -1,4 +1,8 @@ -defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Uri do +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.Uri do use Ecto.Type def type, do: :string diff --git a/lib/pleroma/ecto_type/config/atom.ex b/lib/pleroma/ecto_type/config/atom.ex new file mode 100644 index 000000000..df565d432 --- /dev/null +++ b/lib/pleroma/ecto_type/config/atom.ex @@ -0,0 +1,26 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.Config.Atom do + use Ecto.Type + + def type, do: :atom + + def cast(key) when is_atom(key) do + {:ok, key} + end + + def cast(key) when is_binary(key) do + {:ok, Pleroma.ConfigDB.string_to_elixir_types(key)} + end + + def cast(_), do: :error + + def load(key) do + {:ok, Pleroma.ConfigDB.string_to_elixir_types(key)} + end + + def dump(key) when is_atom(key), do: {:ok, inspect(key)} + def dump(_), do: :error +end diff --git a/lib/pleroma/ecto_type/config/binary_value.ex b/lib/pleroma/ecto_type/config/binary_value.ex new file mode 100644 index 000000000..bbd2608c5 --- /dev/null +++ b/lib/pleroma/ecto_type/config/binary_value.ex @@ -0,0 +1,27 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.Config.BinaryValue do + use Ecto.Type + + def type, do: :term + + def cast(value) when is_binary(value) do + if String.valid?(value) do + {:ok, value} + else + {:ok, :erlang.binary_to_term(value)} + end + end + + def cast(value), do: {:ok, value} + + def load(value) when is_binary(value) do + {:ok, :erlang.binary_to_term(value)} + end + + def dump(value) do + {:ok, :erlang.term_to_binary(value)} + end +end diff --git a/lib/pleroma/emails/new_users_digest_email.ex b/lib/pleroma/emails/new_users_digest_email.ex index 7d16b807f..348cbac9c 100644 --- a/lib/pleroma/emails/new_users_digest_email.ex +++ b/lib/pleroma/emails/new_users_digest_email.ex @@ -14,8 +14,10 @@ defmodule Pleroma.Emails.NewUsersDigestEmail do styling = Pleroma.Config.get([Pleroma.Emails.UserEmail, :styling]) logo_url = - Pleroma.Web.Endpoint.url() <> - Pleroma.Config.get([:frontend_configurations, :pleroma_fe, :logo]) + Pleroma.Helpers.UriHelper.maybe_add_base( + Pleroma.Config.get([:frontend_configurations, :pleroma_fe, :logo]), + Pleroma.Web.Endpoint.url() + ) new() |> to({to.name, to.email}) diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index eb7d598c6..d076ae312 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -1,6 +1,7 @@ defmodule Pleroma.Emoji.Pack do - @derive {Jason.Encoder, only: [:files, :pack]} + @derive {Jason.Encoder, only: [:files, :pack, :files_count]} defstruct files: %{}, + files_count: 0, pack_file: nil, path: nil, pack: %{}, @@ -8,6 +9,7 @@ defmodule Pleroma.Emoji.Pack do @type t() :: %__MODULE__{ files: %{String.t() => Path.t()}, + files_count: non_neg_integer(), pack_file: Path.t(), path: Path.t(), pack: map(), @@ -16,7 +18,7 @@ defmodule Pleroma.Emoji.Pack do alias Pleroma.Emoji - @spec create(String.t()) :: :ok | {:error, File.posix()} | {:error, :empty_values} + @spec create(String.t()) :: {:ok, t()} | {:error, File.posix()} | {:error, :empty_values} def create(name) do with :ok <- validate_not_empty([name]), dir <- Path.join(emoji_path(), name), @@ -26,10 +28,28 @@ defmodule Pleroma.Emoji.Pack do end end - @spec show(String.t()) :: {:ok, t()} | {:error, atom()} - def show(name) do + defp paginate(entities, 1, page_size), do: Enum.take(entities, page_size) + + defp paginate(entities, page, page_size) do + entities + |> Enum.chunk_every(page_size) + |> Enum.at(page - 1) + end + + @spec show(keyword()) :: {:ok, t()} | {:error, atom()} + def show(opts) do + name = opts[:name] + with :ok <- validate_not_empty([name]), {:ok, pack} <- load_pack(name) do + shortcodes = + pack.files + |> Map.keys() + |> Enum.sort() + |> paginate(opts[:page], opts[:page_size]) + + pack = Map.put(pack, :files, Map.take(pack.files, shortcodes)) + {:ok, validate_pack(pack)} end end @@ -120,10 +140,10 @@ defmodule Pleroma.Emoji.Pack do end end - @spec list_local() :: {:ok, map()} - def list_local do + @spec list_local(keyword()) :: {:ok, map(), non_neg_integer()} + def list_local(opts) do with {:ok, results} <- list_packs_dir() do - packs = + all_packs = results |> Enum.map(fn name -> case load_pack(name) do @@ -132,9 +152,13 @@ defmodule Pleroma.Emoji.Pack do end end) |> Enum.reject(&is_nil/1) + + packs = + all_packs + |> paginate(opts[:page], opts[:page_size]) |> Map.new(fn pack -> {pack.name, validate_pack(pack)} end) - {:ok, packs} + {:ok, packs, length(all_packs)} end end @@ -146,7 +170,7 @@ defmodule Pleroma.Emoji.Pack do end end - @spec download(String.t(), String.t(), String.t()) :: :ok | {:error, atom()} + @spec download(String.t(), String.t(), String.t()) :: {:ok, t()} | {:error, atom()} def download(name, url, as) do uri = url |> String.trim() |> URI.parse() @@ -197,7 +221,12 @@ defmodule Pleroma.Emoji.Pack do |> Map.put(:path, Path.dirname(pack_file)) |> Map.put(:name, name) - {:ok, pack} + files_count = + pack.files + |> Map.keys() + |> length() + + {:ok, Map.put(pack, :files_count, files_count)} else {:error, :not_found} end @@ -296,7 +325,9 @@ defmodule Pleroma.Emoji.Pack do # Otherwise, they'd have to download it from external-src pack.pack["share-files"] && Enum.all?(pack.files, fn {_, file} -> - File.exists?(Path.join(pack.path, file)) + pack.path + |> Path.join(file) + |> File.exists?() end) end @@ -440,7 +471,7 @@ defmodule Pleroma.Emoji.Pack do # with the API so it should be sufficient with {:create_dir, :ok} <- {:create_dir, File.mkdir_p(emoji_path)}, {:ls, {:ok, results}} <- {:ls, File.ls(emoji_path)} do - {:ok, results} + {:ok, Enum.sort(results)} else {:create_dir, {:error, e}} -> {:error, :create_dir, e} {:ls, {:error, e}} -> {:error, :ls, e} @@ -499,7 +530,7 @@ defmodule Pleroma.Emoji.Pack do if Base.decode16!(sha) == :crypto.hash(:sha256, archive) do {:ok, archive} else - {:error, :imvalid_checksum} + {:error, :invalid_checksum} end end end diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 3a3082e72..c2020d30a 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -124,6 +124,7 @@ defmodule Pleroma.FollowingRelationship do |> join(:inner, [r], f in assoc(r, :follower)) |> where([r], r.state == ^:follow_pending) |> where([r], r.following_id == ^id) + |> where([r, f], f.deactivated != true) |> select([r, f], f) |> Repo.all() end @@ -141,6 +142,12 @@ defmodule Pleroma.FollowingRelationship do |> where([r], r.state == ^:follow_accept) end + def outgoing_pending_follow_requests_query(%User{} = follower) do + __MODULE__ + |> where([r], r.follower_id == ^follower.id) + |> where([r], r.state == ^:follow_pending) + end + def following(%User{} = user) do following = following_query(user) diff --git a/lib/pleroma/helpers/uri_helper.ex b/lib/pleroma/helpers/uri_helper.ex index 256252ddb..6d205a636 100644 --- a/lib/pleroma/helpers/uri_helper.ex +++ b/lib/pleroma/helpers/uri_helper.ex @@ -17,11 +17,6 @@ defmodule Pleroma.Helpers.UriHelper do |> URI.to_string() end - def append_param_if_present(%{} = params, param_name, param_value) do - if param_value do - Map.put(params, param_name, param_value) - else - params - end - end + def maybe_add_base("/" <> uri, base), do: Path.join([base, uri]) + def maybe_add_base(uri, _base), do: uri end diff --git a/lib/pleroma/html.ex b/lib/pleroma/html.ex index d78c5f202..dc1b9b840 100644 --- a/lib/pleroma/html.ex +++ b/lib/pleroma/html.ex @@ -109,7 +109,7 @@ defmodule Pleroma.HTML do result = content |> Floki.parse_fragment!() - |> Floki.filter_out("a.mention,a.hashtag,a[rel~=\"tag\"]") + |> Floki.filter_out("a.mention,a.hashtag,a.attachment,a[rel~=\"tag\"]") |> Floki.attribute("a", "href") |> Enum.at(0) diff --git a/lib/pleroma/http/adapter_helper/hackney.ex b/lib/pleroma/http/adapter_helper/hackney.ex index dcb4cac71..3972a03a9 100644 --- a/lib/pleroma/http/adapter_helper/hackney.ex +++ b/lib/pleroma/http/adapter_helper/hackney.ex @@ -22,22 +22,7 @@ defmodule Pleroma.HTTP.AdapterHelper.Hackney do |> Pleroma.HTTP.AdapterHelper.maybe_add_proxy(proxy) end - defp add_scheme_opts(opts, %URI{scheme: "http"}), do: opts - - defp add_scheme_opts(opts, %URI{scheme: "https", host: host}) do - ssl_opts = [ - ssl_options: [ - # Workaround for remote server certificate chain issues - partial_chain: &:hackney_connect.partial_chain/1, - - # We don't support TLS v1.3 yet - versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"], - server_name_indication: to_charlist(host) - ] - ] - - Keyword.merge(opts, ssl_opts) - end + defp add_scheme_opts(opts, _), do: opts def after_request(_), do: :ok end diff --git a/lib/pleroma/http/ex_aws.ex b/lib/pleroma/http/ex_aws.ex new file mode 100644 index 000000000..e53e64077 --- /dev/null +++ b/lib/pleroma/http/ex_aws.ex @@ -0,0 +1,22 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.ExAws do + @moduledoc false + + @behaviour ExAws.Request.HttpClient + + alias Pleroma.HTTP + + @impl true + def request(method, url, body \\ "", headers \\ [], http_opts \\ []) do + case HTTP.request(method, url, body, headers, http_opts) do + {:ok, env} -> + {:ok, %{status_code: env.status, headers: env.headers, body: env.body}} + + {:error, reason} -> + {:error, %{reason: reason}} + end + end +end diff --git a/lib/pleroma/http/http.ex b/lib/pleroma/http/http.ex index 583b56484..66ca75367 100644 --- a/lib/pleroma/http/http.ex +++ b/lib/pleroma/http/http.ex @@ -16,6 +16,7 @@ defmodule Pleroma.HTTP do require Logger @type t :: __MODULE__ + @type method() :: :get | :post | :put | :delete | :head @doc """ Performs GET request. @@ -28,6 +29,9 @@ defmodule Pleroma.HTTP do def get(nil, _, _), do: nil def get(url, headers, options), do: request(:get, url, "", headers, options) + @spec head(Request.url(), Request.headers(), keyword()) :: {:ok, Env.t()} | {:error, any()} + def head(url, headers \\ [], options \\ []), do: request(:head, url, "", headers, options) + @doc """ Performs POST request. @@ -42,7 +46,7 @@ defmodule Pleroma.HTTP do Builds and performs http request. # Arguments: - `method` - :get, :post, :put, :delete + `method` - :get, :post, :put, :delete, :head `url` - full url `body` - request body `headers` - a keyworld list of headers, e.g. `[{"content-type", "text/plain"}]` @@ -52,7 +56,7 @@ defmodule Pleroma.HTTP do `{:ok, %Tesla.Env{}}` or `{:error, error}` """ - @spec request(atom(), Request.url(), String.t(), Request.headers(), keyword()) :: + @spec request(method(), Request.url(), String.t(), Request.headers(), keyword()) :: {:ok, Env.t()} | {:error, any()} def request(method, url, body, headers, options) when is_binary(url) do uri = URI.parse(url) diff --git a/lib/pleroma/http/tzdata.ex b/lib/pleroma/http/tzdata.ex new file mode 100644 index 000000000..34bb253a7 --- /dev/null +++ b/lib/pleroma/http/tzdata.ex @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.Tzdata do + @moduledoc false + + @behaviour Tzdata.HTTPClient + + alias Pleroma.HTTP + + @impl true + def get(url, headers, options) do + with {:ok, %Tesla.Env{} = env} <- HTTP.get(url, headers, options) do + {:ok, {env.status, env.headers, env.body}} + end + end + + @impl true + def head(url, headers, options) do + with {:ok, %Tesla.Env{} = env} <- HTTP.head(url, headers, options) do + {:ok, {env.status, env.headers}} + end + end +end diff --git a/lib/pleroma/maintenance.ex b/lib/pleroma/maintenance.ex new file mode 100644 index 000000000..326c17825 --- /dev/null +++ b/lib/pleroma/maintenance.ex @@ -0,0 +1,37 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Maintenance do + alias Pleroma.Repo + require Logger + + def vacuum(args) do + case args do + "analyze" -> + Logger.info("Runnning VACUUM ANALYZE.") + + Repo.query!( + "vacuum analyze;", + [], + timeout: :infinity + ) + + "full" -> + Logger.info("Runnning VACUUM FULL.") + + Logger.warn( + "Re-packing your entire database may take a while and will consume extra disk space during the process." + ) + + Repo.query!( + "vacuum full;", + [], + timeout: :infinity + ) + + _ -> + Logger.error("Error: invalid vacuum argument.") + end + end +end diff --git a/lib/pleroma/maps.ex b/lib/pleroma/maps.ex new file mode 100644 index 000000000..ab2e32e2f --- /dev/null +++ b/lib/pleroma/maps.ex @@ -0,0 +1,15 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Maps do + def put_if_present(map, key, value, value_function \\ &{:ok, &1}) when is_map(map) do + with false <- is_nil(key), + false <- is_nil(value), + {:ok, new_value} <- value_function.(value) do + Map.put(map, key, new_value) + else + _ -> map + end + end +end diff --git a/lib/pleroma/migration_helper/notification_backfill.ex b/lib/pleroma/migration_helper/notification_backfill.ex new file mode 100644 index 000000000..b3770307a --- /dev/null +++ b/lib/pleroma/migration_helper/notification_backfill.ex @@ -0,0 +1,85 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MigrationHelper.NotificationBackfill do + alias Pleroma.Notification + alias Pleroma.Object + alias Pleroma.Repo + alias Pleroma.User + + import Ecto.Query + + def fill_in_notification_types do + query = + from(n in Pleroma.Notification, + where: is_nil(n.type), + preload: :activity + ) + + query + |> Repo.chunk_stream(100) + |> Enum.each(fn notification -> + type = + notification.activity + |> type_from_activity() + + notification + |> Notification.changeset(%{type: type}) + |> Repo.update() + end) + end + + # This is copied over from Notifications to keep this stable. + defp type_from_activity(%{data: %{"type" => type}} = activity) do + case type do + "Follow" -> + accepted_function = fn activity -> + with %User{} = follower <- User.get_by_ap_id(activity.data["actor"]), + %User{} = followed <- User.get_by_ap_id(activity.data["object"]) do + Pleroma.FollowingRelationship.following?(follower, followed) + end + end + + if accepted_function.(activity) do + "follow" + else + "follow_request" + end + + "Announce" -> + "reblog" + + "Like" -> + "favourite" + + "Move" -> + "move" + + "EmojiReact" -> + "pleroma:emoji_reaction" + + # Compatibility with old reactions + "EmojiReaction" -> + "pleroma:emoji_reaction" + + "Create" -> + activity + |> type_from_activity_object() + + t -> + raise "No notification type for activity type #{t}" + end + end + + defp type_from_activity_object(%{data: %{"type" => "Create", "object" => %{}}}), do: "mention" + + defp type_from_activity_object(%{data: %{"type" => "Create"}} = activity) do + object = Object.get_by_ap_id(activity.data["object"]) + + case object && object.data["type"] do + "ChatMessage" -> "pleroma:chat_mention" + _ -> "mention" + end + end +end diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 8aa9ed2d4..2ef1a80c5 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -30,12 +30,29 @@ defmodule Pleroma.Notification do schema "notifications" do field(:seen, :boolean, default: false) + # This is an enum type in the database. If you add a new notification type, + # remember to add a migration to add it to the `notifications_type` enum + # as well. + field(:type, :string) belongs_to(:user, User, type: FlakeId.Ecto.CompatType) belongs_to(:activity, Activity, type: FlakeId.Ecto.CompatType) timestamps() end + def update_notification_type(user, activity) do + with %__MODULE__{} = notification <- + Repo.get_by(__MODULE__, user_id: user.id, activity_id: activity.id) do + type = + activity + |> type_from_activity() + + notification + |> changeset(%{type: type}) + |> Repo.update() + end + end + @spec unread_notifications_count(User.t()) :: integer() def unread_notifications_count(%User{id: user_id}) do from(q in __MODULE__, @@ -44,9 +61,21 @@ defmodule Pleroma.Notification do |> Repo.aggregate(:count, :id) end + @notification_types ~w{ + favourite + follow + follow_request + mention + move + pleroma:chat_mention + pleroma:emoji_reaction + reblog + } + def changeset(%Notification{} = notification, attrs) do notification - |> cast(attrs, [:seen]) + |> cast(attrs, [:seen, :type]) + |> validate_inclusion(:type, @notification_types) end @spec last_read_query(User.t()) :: Ecto.Queryable.t() @@ -92,8 +121,9 @@ defmodule Pleroma.Notification do |> join(:left, [n, a], object in Object, on: fragment( - "(?->>'id') = COALESCE((? -> 'object'::text) ->> 'id'::text)", + "(?->>'id') = COALESCE(?->'object'->>'id', ?->>'object')", object.data, + a.data, a.data ) ) @@ -136,8 +166,16 @@ defmodule Pleroma.Notification do query |> join(:left, [n, a], mutated_activity in Pleroma.Activity, on: - fragment("?->>'context'", a.data) == - fragment("?->>'context'", mutated_activity.data) and + fragment( + "COALESCE((?->'object')->>'id', ?->>'object')", + a.data, + a.data + ) == + fragment( + "COALESCE((?->'object')->>'id', ?->>'object')", + mutated_activity.data, + mutated_activity.data + ) and fragment("(?->>'type' = 'Like' or ?->>'type' = 'Announce')", a.data, a.data) and fragment("?->>'type'", mutated_activity.data) == "Create", as: :mutated_activity @@ -224,18 +262,8 @@ defmodule Pleroma.Notification do |> Marker.multi_set_last_read_id(user, "notifications") |> Repo.transaction() - Notification + for_user_query(user) |> where([n], n.id in ^notification_ids) - |> join(:inner, [n], activity in assoc(n, :activity)) - |> join(:left, [n, a], object in Object, - on: - fragment( - "(?->>'id') = COALESCE((? -> 'object'::text) ->> 'id'::text)", - object.data, - a.data - ) - ) - |> preload([n, a, o], activity: {a, object: o}) |> Repo.all() end @@ -309,42 +337,96 @@ defmodule Pleroma.Notification do end end - def create_notifications(%Activity{data: %{"to" => _, "type" => "Create"}} = activity) do - object = Object.normalize(activity) + def create_notifications(activity, options \\ []) + + def create_notifications(%Activity{data: %{"to" => _, "type" => "Create"}} = activity, options) do + object = Object.normalize(activity, false) if object && object.data["type"] == "Answer" do {:ok, []} else - do_create_notifications(activity) + do_create_notifications(activity, options) end end - def create_notifications(%Activity{data: %{"type" => type}} = activity) + def create_notifications(%Activity{data: %{"type" => type}} = activity, options) when type in ["Follow", "Like", "Announce", "Move", "EmojiReact"] do - do_create_notifications(activity) + do_create_notifications(activity, options) end - def create_notifications(_), do: {:ok, []} + def create_notifications(_, _), do: {:ok, []} + + defp do_create_notifications(%Activity{} = activity, options) do + do_send = Keyword.get(options, :do_send, true) - defp do_create_notifications(%Activity{} = activity) do {enabled_receivers, disabled_receivers} = get_notified_from_activity(activity) potential_receivers = enabled_receivers ++ disabled_receivers notifications = Enum.map(potential_receivers, fn user -> - do_send = user in enabled_receivers + do_send = do_send && user in enabled_receivers create_notification(activity, user, do_send) end) + |> Enum.reject(&is_nil/1) {:ok, notifications} end + defp type_from_activity(%{data: %{"type" => type}} = activity) do + case type do + "Follow" -> + if Activity.follow_accepted?(activity) do + "follow" + else + "follow_request" + end + + "Announce" -> + "reblog" + + "Like" -> + "favourite" + + "Move" -> + "move" + + "EmojiReact" -> + "pleroma:emoji_reaction" + + # Compatibility with old reactions + "EmojiReaction" -> + "pleroma:emoji_reaction" + + "Create" -> + activity + |> type_from_activity_object() + + t -> + raise "No notification type for activity type #{t}" + end + end + + defp type_from_activity_object(%{data: %{"type" => "Create", "object" => %{}}}), do: "mention" + + defp type_from_activity_object(%{data: %{"type" => "Create"}} = activity) do + object = Object.get_by_ap_id(activity.data["object"]) + + case object && object.data["type"] do + "ChatMessage" -> "pleroma:chat_mention" + _ -> "mention" + end + end + # TODO move to sql, too. def create_notification(%Activity{} = activity, %User{} = user, do_send \\ true) do unless skip?(activity, user) do {:ok, %{notification: notification}} = Multi.new() - |> Multi.insert(:notification, %Notification{user_id: user.id, activity: activity}) + |> Multi.insert(:notification, %Notification{ + user_id: user.id, + activity: activity, + type: type_from_activity(activity) + }) |> Marker.multi_set_last_read_id(user, "notifications") |> Repo.transaction() @@ -370,7 +452,8 @@ defmodule Pleroma.Notification do when type in ["Create", "Like", "Announce", "Follow", "Move", "EmojiReact"] do potential_receiver_ap_ids = get_potential_receiver_ap_ids(activity) - potential_receivers = User.get_users_from_set(potential_receiver_ap_ids, local_only) + potential_receivers = + User.get_users_from_set(potential_receiver_ap_ids, local_only: local_only) notification_enabled_ap_ids = potential_receiver_ap_ids @@ -467,6 +550,7 @@ defmodule Pleroma.Notification do def skip?(%Activity{} = activity, %User{} = user) do [ :self, + :invisible, :followers, :follows, :non_followers, @@ -483,6 +567,12 @@ defmodule Pleroma.Notification do activity.data["actor"] == user.ap_id end + def skip?(:invisible, %Activity{} = activity, _) do + actor = activity.data["actor"] + user = User.get_cached_by_ap_id(actor) + User.invisible?(user) + end + def skip?( :followers, %Activity{} = activity, @@ -535,4 +625,12 @@ defmodule Pleroma.Notification do end def skip?(_, _, _), do: false + + def for_user_and_activity(user, activity) do + from(n in __MODULE__, + where: n.user_id == ^user.id, + where: n.activity_id == ^activity.id + ) + |> Repo.one() + end end diff --git a/lib/pleroma/object/fetcher.ex b/lib/pleroma/object/fetcher.ex index 263ded5dd..3e2949ee2 100644 --- a/lib/pleroma/object/fetcher.ex +++ b/lib/pleroma/object/fetcher.ex @@ -83,8 +83,8 @@ defmodule Pleroma.Object.Fetcher do {:transmogrifier, {:error, {:reject, nil}}} -> {:reject, nil} - {:transmogrifier, _} -> - {:error, "Transmogrifier failure."} + {:transmogrifier, _} = e -> + {:error, e} {:object, data, nil} -> reinject_object(%Object{}, data) diff --git a/lib/pleroma/pagination.ex b/lib/pleroma/pagination.ex index d43a96cd2..9a3795769 100644 --- a/lib/pleroma/pagination.ex +++ b/lib/pleroma/pagination.ex @@ -23,12 +23,12 @@ defmodule Pleroma.Pagination do @spec fetch_paginated(Ecto.Query.t(), map(), type(), atom() | nil) :: [Ecto.Schema.t()] def fetch_paginated(query, params, type \\ :keyset, table_binding \\ nil) - def fetch_paginated(query, %{"total" => true} = params, :keyset, table_binding) do + def fetch_paginated(query, %{total: true} = params, :keyset, table_binding) do total = Repo.aggregate(query, :count, :id) %{ total: total, - items: fetch_paginated(query, Map.drop(params, ["total"]), :keyset, table_binding) + items: fetch_paginated(query, Map.drop(params, [:total]), :keyset, table_binding) } end @@ -41,7 +41,7 @@ defmodule Pleroma.Pagination do |> enforce_order(options) end - def fetch_paginated(query, %{"total" => true} = params, :offset, table_binding) do + def fetch_paginated(query, %{total: true} = params, :offset, table_binding) do total = query |> Ecto.Query.exclude(:left_join) @@ -49,7 +49,7 @@ defmodule Pleroma.Pagination do %{ total: total, - items: fetch_paginated(query, Map.drop(params, ["total"]), :offset, table_binding) + items: fetch_paginated(query, Map.drop(params, [:total]), :offset, table_binding) } end @@ -64,6 +64,12 @@ defmodule Pleroma.Pagination do @spec paginate(Ecto.Query.t(), map(), type(), atom() | nil) :: [Ecto.Schema.t()] def paginate(query, options, method \\ :keyset, table_binding \\ nil) + def paginate(list, options, _method, _table_binding) when is_list(list) do + offset = options[:offset] || 0 + limit = options[:limit] || 0 + Enum.slice(list, offset, limit) + end + def paginate(query, options, :keyset, table_binding) do query |> restrict(:min_id, options, table_binding) @@ -90,12 +96,6 @@ defmodule Pleroma.Pagination do skip_order: :boolean } - params = - Enum.reduce(params, %{}, fn - {key, _value}, acc when is_atom(key) -> Map.drop(acc, [key]) - {key, value}, acc -> Map.put(acc, key, value) - end) - changeset = cast({%{}, param_types}, params, Map.keys(param_types)) changeset.changes end diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 6462797b6..1420a9611 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -31,7 +31,7 @@ defmodule Pleroma.Plugs.HTTPSecurityPlug do {"x-content-type-options", "nosniff"}, {"referrer-policy", referrer_policy}, {"x-download-options", "noopen"}, - {"content-security-policy", csp_string() <> ";"} + {"content-security-policy", csp_string()} ] if report_uri do @@ -43,23 +43,46 @@ defmodule Pleroma.Plugs.HTTPSecurityPlug do ] } - headers ++ [{"reply-to", Jason.encode!(report_group)}] + [{"reply-to", Jason.encode!(report_group)} | headers] else headers end end + static_csp_rules = [ + "default-src 'none'", + "base-uri 'self'", + "frame-ancestors 'none'", + "style-src 'self' 'unsafe-inline'", + "font-src 'self'", + "manifest-src 'self'" + ] + + @csp_start [Enum.join(static_csp_rules, ";") <> ";"] + defp csp_string do scheme = Config.get([Pleroma.Web.Endpoint, :url])[:scheme] static_url = Pleroma.Web.Endpoint.static_url() websocket_url = Pleroma.Web.Endpoint.websocket_url() report_uri = Config.get([:http_security, :report_uri]) - connect_src = "connect-src 'self' #{static_url} #{websocket_url}" + img_src = "img-src 'self' data: blob:" + media_src = "media-src 'self'" + + {img_src, media_src} = + if Config.get([:media_proxy, :enabled]) && + !Config.get([:media_proxy, :proxy_opts, :redirect_on_failure]) do + sources = get_proxy_and_attachment_sources() + {[img_src, sources], [media_src, sources]} + else + {[img_src, " https:"], [media_src, " https:"]} + end + + connect_src = ["connect-src 'self' blob: ", static_url, ?\s, websocket_url] connect_src = if Pleroma.Config.get(:env) == :dev do - connect_src <> " http://localhost:3035/" + [connect_src, " http://localhost:3035/"] else connect_src end @@ -71,26 +94,50 @@ defmodule Pleroma.Plugs.HTTPSecurityPlug do "script-src 'self'" end - main_part = [ - "default-src 'none'", - "base-uri 'self'", - "frame-ancestors 'none'", - "img-src 'self' data: blob: https:", - "media-src 'self' https:", - "style-src 'self' 'unsafe-inline'", - "font-src 'self'", - "manifest-src 'self'", - connect_src, - script_src - ] + report = if report_uri, do: ["report-uri ", report_uri, ";report-to csp-endpoint"] + insecure = if scheme == "https", do: "upgrade-insecure-requests" + + @csp_start + |> add_csp_param(img_src) + |> add_csp_param(media_src) + |> add_csp_param(connect_src) + |> add_csp_param(script_src) + |> add_csp_param(insecure) + |> add_csp_param(report) + |> :erlang.iolist_to_binary() + end - report = if report_uri, do: ["report-uri #{report_uri}; report-to csp-endpoint"], else: [] + defp get_proxy_and_attachment_sources do + media_proxy_whitelist = + Enum.reduce(Config.get([:media_proxy, :whitelist]), [], fn host, acc -> + add_source(acc, host) + end) + + media_proxy_base_url = + if Config.get([:media_proxy, :base_url]), + do: URI.parse(Config.get([:media_proxy, :base_url])).host + + upload_base_url = + if Config.get([Pleroma.Upload, :base_url]), + do: URI.parse(Config.get([Pleroma.Upload, :base_url])).host + + s3_endpoint = + if Config.get([Pleroma.Upload, :uploader]) == Pleroma.Uploaders.S3, + do: URI.parse(Config.get([Pleroma.Uploaders.S3, :public_endpoint])).host + + [] + |> add_source(media_proxy_base_url) + |> add_source(upload_base_url) + |> add_source(s3_endpoint) + |> add_source(media_proxy_whitelist) + end - insecure = if scheme == "https", do: ["upgrade-insecure-requests"], else: [] + defp add_source(iodata, nil), do: iodata + defp add_source(iodata, source), do: [[?\s, source] | iodata] - (main_part ++ report ++ insecure) - |> Enum.join("; ") - end + defp add_csp_param(csp_iodata, nil), do: csp_iodata + + defp add_csp_param(csp_iodata, param), do: [[param, ?;] | csp_iodata] def warn_if_disabled do unless Config.get([:http_security, :enabled]) do diff --git a/lib/pleroma/plugs/uploaded_media.ex b/lib/pleroma/plugs/uploaded_media.ex index 94147e0c4..40984cfc0 100644 --- a/lib/pleroma/plugs/uploaded_media.ex +++ b/lib/pleroma/plugs/uploaded_media.ex @@ -10,6 +10,8 @@ defmodule Pleroma.Plugs.UploadedMedia do import Pleroma.Web.Gettext require Logger + alias Pleroma.Web.MediaProxy + @behaviour Plug # no slashes @path "media" @@ -35,8 +37,7 @@ defmodule Pleroma.Plugs.UploadedMedia do %{query_params: %{"name" => name}} = conn -> name = String.replace(name, "\"", "\\\"") - conn - |> put_resp_header("content-disposition", "filename=\"#{name}\"") + put_resp_header(conn, "content-disposition", "filename=\"#{name}\"") conn -> conn @@ -47,7 +48,8 @@ defmodule Pleroma.Plugs.UploadedMedia do with uploader <- Keyword.fetch!(config, :uploader), proxy_remote = Keyword.get(config, :proxy_remote, false), - {:ok, get_method} <- uploader.get_file(file) do + {:ok, get_method} <- uploader.get_file(file), + false <- media_is_banned(conn, get_method) do get_media(conn, get_method, proxy_remote, opts) else _ -> @@ -59,6 +61,14 @@ defmodule Pleroma.Plugs.UploadedMedia do def call(conn, _opts), do: conn + defp media_is_banned(%{request_path: path} = _conn, {:static_dir, _}) do + MediaProxy.in_banned_urls(Pleroma.Web.base_url() <> path) + end + + defp media_is_banned(_, {:url, url}), do: MediaProxy.in_banned_urls(url) + + defp media_is_banned(_, _), do: false + defp get_media(conn, {:static_dir, directory}, _, opts) do static_opts = Map.get(opts, :static_plug_opts) diff --git a/lib/pleroma/repo.ex b/lib/pleroma/repo.ex index f62138466..f317e4d58 100644 --- a/lib/pleroma/repo.ex +++ b/lib/pleroma/repo.ex @@ -8,11 +8,10 @@ defmodule Pleroma.Repo do adapter: Ecto.Adapters.Postgres, migration_timestamps: [type: :naive_datetime_usec] + import Ecto.Query require Logger - defmodule Instrumenter do - use Prometheus.EctoInstrumenter - end + defmodule Instrumenter, do: use(Prometheus.EctoInstrumenter) @doc """ Dynamically loads the repository url from the @@ -50,36 +49,30 @@ defmodule Pleroma.Repo do end end - def check_migrations_applied!() do - unless Pleroma.Config.get( - [:i_am_aware_this_may_cause_data_loss, :disable_migration_check], - false - ) do - Ecto.Migrator.with_repo(__MODULE__, fn repo -> - down_migrations = - Ecto.Migrator.migrations(repo) - |> Enum.reject(fn - {:up, _, _} -> true - {:down, _, _} -> false - end) - - if length(down_migrations) > 0 do - down_migrations_text = - Enum.map(down_migrations, fn {:down, id, name} -> "- #{name} (#{id})\n" end) - - Logger.error( - "The following migrations were not applied:\n#{down_migrations_text}If you want to start Pleroma anyway, set\nconfig :pleroma, :i_am_aware_this_may_cause_data_loss, disable_migration_check: true" - ) + def chunk_stream(query, chunk_size) do + # We don't actually need start and end funcitons of resource streaming, + # but it seems to be the only way to not fetch records one-by-one and + # have individual records be the elements of the stream, instead of + # lists of records + Stream.resource( + fn -> 0 end, + fn + last_id -> + query + |> order_by(asc: :id) + |> where([r], r.id > ^last_id) + |> limit(^chunk_size) + |> all() + |> case do + [] -> + {:halt, last_id} - raise Pleroma.Repo.UnappliedMigrationsError - end - end) - else - :ok - end + records -> + last_id = List.last(records).id + {records, last_id} + end + end, + fn _ -> :ok end + ) end end - -defmodule Pleroma.Repo.UnappliedMigrationsError do - defexception message: "Unapplied Migrations detected" -end diff --git a/lib/pleroma/signature.ex b/lib/pleroma/signature.ex index d01728361..3aa6909d2 100644 --- a/lib/pleroma/signature.ex +++ b/lib/pleroma/signature.ex @@ -5,10 +5,10 @@ defmodule Pleroma.Signature do @behaviour HTTPSignatures.Adapter + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Keys alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.ActivityPub.ObjectValidators.Types def key_id_to_actor_id(key_id) do uri = @@ -24,7 +24,7 @@ defmodule Pleroma.Signature do maybe_ap_id = URI.to_string(uri) - case Types.ObjectID.cast(maybe_ap_id) do + case ObjectValidators.ObjectID.cast(maybe_ap_id) do {:ok, ap_id} -> {:ok, ap_id} diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex index 6b3a8a41f..9a03f01db 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -97,20 +97,11 @@ defmodule Pleroma.Stats do } end - def get_status_visibility_count do - counter_cache = - CounterCache.get_as_map([ - "status_visibility_public", - "status_visibility_private", - "status_visibility_unlisted", - "status_visibility_direct" - ]) - - %{ - public: counter_cache["status_visibility_public"] || 0, - unlisted: counter_cache["status_visibility_unlisted"] || 0, - private: counter_cache["status_visibility_private"] || 0, - direct: counter_cache["status_visibility_direct"] || 0 - } + def get_status_visibility_count(instance \\ nil) do + if is_nil(instance) do + CounterCache.get_sum() + else + CounterCache.get_by_instance(instance) + end end end diff --git a/lib/pleroma/upload.ex b/lib/pleroma/upload.ex index 1be1a3a5b..797555bff 100644 --- a/lib/pleroma/upload.ex +++ b/lib/pleroma/upload.ex @@ -67,6 +67,7 @@ defmodule Pleroma.Upload do {:ok, %{ "type" => opts.activity_type, + "mediaType" => upload.content_type, "url" => [ %{ "type" => "Link", diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index e8013bf40..8a54546d6 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -14,6 +14,7 @@ defmodule Pleroma.User do alias Pleroma.Config alias Pleroma.Conversation.Participation alias Pleroma.Delivery + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Emoji alias Pleroma.FollowingRelationship alias Pleroma.Formatter @@ -30,7 +31,6 @@ defmodule Pleroma.User do alias Pleroma.Web alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Builder - alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI @@ -79,6 +79,7 @@ defmodule Pleroma.User do schema "users" do field(:bio, :string) + field(:raw_bio, :string) field(:email, :string) field(:name, :string) field(:nickname, :string) @@ -114,8 +115,8 @@ defmodule Pleroma.User do field(:is_moderator, :boolean, default: false) field(:is_admin, :boolean, default: false) field(:show_role, :boolean, default: true) - field(:settings, :map, default: nil) - field(:uri, Types.Uri, default: nil) + field(:mastofe_settings, :map, default: nil) + field(:uri, ObjectValidators.Uri, default: nil) field(:hide_followers_count, :boolean, default: false) field(:hide_follows_count, :boolean, default: false) field(:hide_followers, :boolean, default: false) @@ -262,37 +263,60 @@ defmodule Pleroma.User do def account_status(%User{password_reset_pending: true}), do: :password_reset_pending def account_status(%User{confirmation_pending: true}) do - case Config.get([:instance, :account_activation_required]) do - true -> :confirmation_pending - _ -> :active + if Config.get([:instance, :account_activation_required]) do + :confirmation_pending + else + :active end end def account_status(%User{}), do: :active - @spec visible_for?(User.t(), User.t() | nil) :: boolean() - def visible_for?(user, for_user \\ nil) + @spec visible_for(User.t(), User.t() | nil) :: + :visible + | :invisible + | :restricted_unauthenticated + | :deactivated + | :confirmation_pending + def visible_for(user, for_user \\ nil) - def visible_for?(%User{invisible: true}, _), do: false + def visible_for(%User{invisible: true}, _), do: :invisible - def visible_for?(%User{id: user_id}, %User{id: user_id}), do: true + def visible_for(%User{id: user_id}, %User{id: user_id}), do: :visible - def visible_for?(%User{local: local} = user, nil) do - cfg_key = - if local, - do: :local, - else: :remote + def visible_for(%User{} = user, nil) do + if restrict_unauthenticated?(user) do + :restrict_unauthenticated + else + visible_account_status(user) + end + end - if Config.get([:restrict_unauthenticated, :profiles, cfg_key]), - do: false, - else: account_status(user) == :active + def visible_for(%User{} = user, for_user) do + if superuser?(for_user) do + :visible + else + visible_account_status(user) + end end - def visible_for?(%User{} = user, for_user) do - account_status(user) == :active || superuser?(for_user) + def visible_for(_, _), do: :invisible + + defp restrict_unauthenticated?(%User{local: local}) do + config_key = if local, do: :local, else: :remote + + Config.get([:restrict_unauthenticated, :profiles, config_key], false) end - def visible_for?(_, _), do: false + defp visible_account_status(user) do + status = account_status(user) + + if status in [:active, :password_reset_pending] do + :visible + else + status + end + end @spec superuser?(User.t()) :: boolean() def superuser?(%User{local: true, is_admin: true}), do: true @@ -305,8 +329,13 @@ defmodule Pleroma.User do def avatar_url(user, options \\ []) do case user.avatar do - %{"url" => [%{"href" => href} | _]} -> href - _ -> !options[:no_default] && "#{Web.base_url()}/images/avi.png" + %{"url" => [%{"href" => href} | _]} -> + href + + _ -> + unless options[:no_default] do + Config.get([:assets, :default_user_avatar], "#{Web.base_url()}/images/avi.png") + end end end @@ -427,6 +456,7 @@ defmodule Pleroma.User do params, [ :bio, + :raw_bio, :name, :emoji, :avatar, @@ -458,6 +488,7 @@ defmodule Pleroma.User do |> validate_format(:nickname, local_nickname_regex()) |> validate_length(:bio, max: bio_limit) |> validate_length(:name, min: 1, max: name_limit) + |> validate_inclusion(:actor_type, ["Person", "Service"]) |> put_fields() |> put_emoji() |> put_change_if_present(:bio, &{:ok, parse_bio(&1, struct)}) @@ -533,9 +564,10 @@ defmodule Pleroma.User do |> delete_change(:also_known_as) |> unique_constraint(:email) |> validate_format(:email, @email_regex) + |> validate_inclusion(:actor_type, ["Person", "Service"]) end - @spec update_as_admin(%User{}, map) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} + @spec update_as_admin(User.t(), map()) :: {:ok, User.t()} | {:error, Changeset.t()} def update_as_admin(user, params) do params = Map.put(params, "password_confirmation", params["password"]) changeset = update_as_admin_changeset(user, params) @@ -556,7 +588,7 @@ defmodule Pleroma.User do |> put_change(:password_reset_pending, false) end - @spec reset_password(User.t(), map) :: {:ok, User.t()} | {:error, Ecto.Changeset.t()} + @spec reset_password(User.t(), map()) :: {:ok, User.t()} | {:error, Changeset.t()} def reset_password(%User{} = user, params) do reset_password(user, user, params) end @@ -601,7 +633,16 @@ defmodule Pleroma.User do struct |> confirmation_changeset(need_confirmation: need_confirmation?) - |> cast(params, [:bio, :email, :name, :nickname, :password, :password_confirmation, :emoji]) + |> cast(params, [ + :bio, + :raw_bio, + :email, + :name, + :nickname, + :password, + :password_confirmation, + :emoji + ]) |> validate_required([:name, :nickname, :password, :password_confirmation]) |> validate_confirmation(:password) |> unique_constraint(:email) @@ -741,7 +782,6 @@ defmodule Pleroma.User do follower |> update_following_count() - |> set_cache() end end @@ -749,7 +789,19 @@ defmodule Pleroma.User do {:error, "Not subscribed!"} end + @spec unfollow(User.t(), User.t()) :: {:ok, User.t(), Activity.t()} | {:error, String.t()} def unfollow(%User{} = follower, %User{} = followed) do + case do_unfollow(follower, followed) do + {:ok, follower, followed} -> + {:ok, follower, Utils.fetch_latest_follow(follower, followed)} + + error -> + error + end + end + + @spec do_unfollow(User.t(), User.t()) :: {:ok, User.t(), User.t()} | {:error, String.t()} + defp do_unfollow(%User{} = follower, %User{} = followed) do case get_follow_state(follower, followed) do state when state in [:follow_pending, :follow_accept] -> FollowingRelationship.unfollow(follower, followed) @@ -758,9 +810,8 @@ defmodule Pleroma.User do {:ok, follower} = follower |> update_following_count() - |> set_cache() - {:ok, follower, Utils.fetch_latest_follow(follower, followed)} + {:ok, follower, followed} nil -> {:error, "Not subscribed!"} @@ -1110,35 +1161,25 @@ defmodule Pleroma.User do ]) end + @spec update_follower_count(User.t()) :: {:ok, User.t()} def update_follower_count(%User{} = user) do if user.local or !Pleroma.Config.get([:instance, :external_user_synchronization]) do - follower_count_query = - User.Query.build(%{followers: user, deactivated: false}) - |> select([u], %{count: count(u.id)}) - - User - |> where(id: ^user.id) - |> join(:inner, [u], s in subquery(follower_count_query)) - |> update([u, s], - set: [follower_count: s.count] - ) - |> select([u], u) - |> Repo.update_all([]) - |> case do - {1, [user]} -> set_cache(user) - _ -> {:error, user} - end + follower_count = FollowingRelationship.follower_count(user) + + user + |> follow_information_changeset(%{follower_count: follower_count}) + |> update_and_set_cache else {:ok, maybe_fetch_follow_information(user)} end end - @spec update_following_count(User.t()) :: User.t() + @spec update_following_count(User.t()) :: {:ok, User.t()} def update_following_count(%User{local: false} = user) do if Pleroma.Config.get([:instance, :external_user_synchronization]) do - maybe_fetch_follow_information(user) + {:ok, maybe_fetch_follow_information(user)} else - user + {:ok, user} end end @@ -1147,7 +1188,7 @@ defmodule Pleroma.User do user |> follow_information_changeset(%{following_count: following_count}) - |> Repo.update!() + |> update_and_set_cache() end def set_unread_conversation_count(%User{local: true} = user) do @@ -1191,8 +1232,9 @@ defmodule Pleroma.User do def increment_unread_conversation_count(_, user), do: {:ok, user} - @spec get_users_from_set([String.t()], boolean()) :: [User.t()] - def get_users_from_set(ap_ids, local_only \\ true) do + @spec get_users_from_set([String.t()], keyword()) :: [User.t()] + def get_users_from_set(ap_ids, opts \\ []) do + local_only = Keyword.get(opts, :local_only, true) criteria = %{ap_id: ap_ids, deactivated: false} criteria = if local_only, do: Map.put(criteria, :local, true), else: criteria @@ -1267,7 +1309,8 @@ defmodule Pleroma.User do unsubscribe(blocked, blocker) - if following?(blocked, blocker), do: unfollow(blocked, blocker) + unfollowing_blocked = Config.get([:activitypub, :unfollow_blocked], true) + if unfollowing_blocked && following?(blocked, blocker), do: unfollow(blocked, blocker) {:ok, blocker} = update_follower_count(blocker) {:ok, blocker, _} = Participation.mark_all_as_read(blocker, blocked) @@ -1402,15 +1445,13 @@ defmodule Pleroma.User do user |> get_followers() |> Enum.filter(& &1.local) - |> Enum.each(fn follower -> - follower |> update_following_count() |> set_cache() - end) + |> Enum.each(&set_cache(update_following_count(&1))) # Only update local user counts, remote will be update during the next pull. user |> get_friends() |> Enum.filter(& &1.local) - |> Enum.each(&update_follower_count/1) + |> Enum.each(&do_unfollow(user, &1)) {:ok, user} end @@ -1471,6 +1512,9 @@ defmodule Pleroma.User do end) delete_user_activities(user) + delete_notifications_from_user_activities(user) + + delete_outgoing_pending_follow_requests(user) delete_or_deactivate(user) end @@ -1484,8 +1528,7 @@ defmodule Pleroma.User do blocked_identifiers, fn blocked_identifier -> with {:ok, %User{} = blocked} <- get_or_fetch(blocked_identifier), - {:ok, _user_block} <- block(blocker, blocked), - {:ok, _} <- ActivityPub.block(blocker, blocked) do + {:ok, _block} <- CommonAPI.block(blocker, blocked) do blocked else err -> @@ -1557,6 +1600,13 @@ defmodule Pleroma.User do }) end + def delete_notifications_from_user_activities(%User{ap_id: ap_id}) do + Notification + |> join(:inner, [n], activity in assoc(n, :activity)) + |> where([n, a], fragment("? = ?", a.actor, ^ap_id)) + |> Repo.delete_all() + end + def delete_user_activities(%User{ap_id: ap_id} = user) do ap_id |> Activity.Queries.by_actor() @@ -1594,6 +1644,12 @@ defmodule Pleroma.User do defp delete_activity(_activity, _user), do: "Doing nothing" + defp delete_outgoing_pending_follow_requests(user) do + user + |> FollowingRelationship.outgoing_pending_follow_requests_query() + |> Repo.delete_all() + end + def html_filter_policy(%User{no_rich_text: true}) do Pleroma.HTML.Scrubber.TwitterText end @@ -1603,12 +1659,19 @@ defmodule Pleroma.User do def fetch_by_ap_id(ap_id), do: ActivityPub.make_user_from_ap_id(ap_id) def get_or_fetch_by_ap_id(ap_id) do - user = get_cached_by_ap_id(ap_id) + cached_user = get_cached_by_ap_id(ap_id) - if !is_nil(user) and !needs_update?(user) do - {:ok, user} - else - fetch_by_ap_id(ap_id) + maybe_fetched_user = needs_update?(cached_user) && fetch_by_ap_id(ap_id) + + case {cached_user, maybe_fetched_user} do + {_, {:ok, %User{} = user}} -> + {:ok, user} + + {%User{} = user, _} -> + {:ok, user} + + _ -> + {:error, :not_found} end end @@ -2055,8 +2118,8 @@ defmodule Pleroma.User do def mastodon_settings_update(user, settings) do user - |> cast(%{settings: settings}, [:settings]) - |> validate_required([:settings]) + |> cast(%{mastofe_settings: settings}, [:mastofe_settings]) + |> validate_required([:mastofe_settings]) |> update_and_set_cache() end diff --git a/lib/pleroma/user/query.ex b/lib/pleroma/user/query.ex index 293bbc082..66ffe9090 100644 --- a/lib/pleroma/user/query.ex +++ b/lib/pleroma/user/query.ex @@ -45,7 +45,7 @@ defmodule Pleroma.User.Query do is_admin: boolean(), is_moderator: boolean(), super_users: boolean(), - exclude_service_users: boolean(), + invisible: boolean(), followers: User.t(), friends: User.t(), recipients_from_activity: [String.t()], @@ -89,8 +89,8 @@ defmodule Pleroma.User.Query do where(query, [u], ilike(field(u, ^key), ^"%#{value}%")) end - defp compose_query({:exclude_service_users, _}, query) do - where(query, [u], not like(u.ap_id, "%/relay") and not like(u.ap_id, "%/internal/fetch")) + defp compose_query({:invisible, bool}, query) when is_boolean(bool) do + where(query, [u], u.invisible == ^bool) end defp compose_query({key, value}, query) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index d752f4f04..94117202c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -5,10 +5,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do alias Pleroma.Activity alias Pleroma.Activity.Ir.Topics + alias Pleroma.ActivityExpiration alias Pleroma.Config alias Pleroma.Constants alias Pleroma.Conversation alias Pleroma.Conversation.Participation + alias Pleroma.Maps alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Object.Containment @@ -19,7 +21,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do alias Pleroma.User alias Pleroma.Web.ActivityPub.MRF alias Pleroma.Web.ActivityPub.Transmogrifier - alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.Streamer alias Pleroma.Web.WebFinger alias Pleroma.Workers.BackgroundWorker @@ -31,25 +32,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do require Logger require Pleroma.Constants - # For Announce activities, we filter the recipients based on following status for any actors - # that match actual users. See issue #164 for more information about why this is necessary. - defp get_recipients(%{"type" => "Announce"} = data) do - to = Map.get(data, "to", []) - cc = Map.get(data, "cc", []) - bcc = Map.get(data, "bcc", []) - actor = User.get_cached_by_ap_id(data["actor"]) - - recipients = - Enum.filter(Enum.concat([to, cc, bcc]), fn recipient -> - case User.get_cached_by_ap_id(recipient) do - nil -> true - user -> User.following?(user, actor) - end - end) - - {recipients, to, cc} - end - defp get_recipients(%{"type" => "Create"} = data) do to = Map.get(data, "to", []) cc = Map.get(data, "cc", []) @@ -67,16 +49,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do {recipients, to, cc} end - defp check_actor_is_active(actor) do - if not is_nil(actor) do - with user <- User.get_cached_by_ap_id(actor), - false <- user.deactivated do - true - else - _e -> false - end - else - true + defp check_actor_is_active(nil), do: true + + defp check_actor_is_active(actor) when is_binary(actor) do + case User.get_cached_by_ap_id(actor) do + %User{deactivated: deactivated} -> not deactivated + _ -> false end end @@ -87,7 +65,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp check_remote_limit(_), do: true - def increase_note_count_if_public(actor, object) do + defp increase_note_count_if_public(actor, object) do if is_public?(object), do: User.increase_note_count(actor), else: {:ok, actor} end @@ -95,38 +73,35 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do if is_public?(object), do: User.decrease_note_count(actor), else: {:ok, actor} end - def increase_replies_count_if_reply(%{ - "object" => %{"inReplyTo" => reply_ap_id} = object, - "type" => "Create" - }) do + defp increase_replies_count_if_reply(%{ + "object" => %{"inReplyTo" => reply_ap_id} = object, + "type" => "Create" + }) do if is_public?(object) do Object.increase_replies_count(reply_ap_id) end end - def increase_replies_count_if_reply(_create_data), do: :noop + defp increase_replies_count_if_reply(_create_data), do: :noop - def decrease_replies_count_if_reply(%Object{ - data: %{"inReplyTo" => reply_ap_id} = object - }) do - if is_public?(object) do - Object.decrease_replies_count(reply_ap_id) - end - end - - def decrease_replies_count_if_reply(_object), do: :noop - - def increase_poll_votes_if_vote(%{ - "object" => %{"inReplyTo" => reply_ap_id, "name" => name}, - "type" => "Create", - "actor" => actor - }) do + defp increase_poll_votes_if_vote(%{ + "object" => %{"inReplyTo" => reply_ap_id, "name" => name}, + "type" => "Create", + "actor" => actor + }) do Object.increase_vote_count(reply_ap_id, name, actor) end - def increase_poll_votes_if_vote(_create_data), do: :noop + defp increase_poll_votes_if_vote(_create_data), do: :noop + @object_types ["ChatMessage"] @spec persist(map(), keyword()) :: {:ok, Activity.t() | Object.t()} + def persist(%{"type" => type} = object, meta) when type in @object_types do + with {:ok, object} <- Object.create(object) do + {:ok, object, meta} + end + end + def persist(object, meta) do with local <- Keyword.fetch!(meta, :local), {recipients, _, _} <- get_recipients(object), @@ -153,20 +128,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do {:containment, :ok} <- {:containment, Containment.contain_child(map)}, {:ok, map, object} <- insert_full_object(map) do {:ok, activity} = - Repo.insert(%Activity{ + %Activity{ data: map, local: local, actor: map["actor"], recipients: recipients - }) + } + |> Repo.insert() + |> maybe_create_activity_expiration() # Splice in the child object if we have one. - activity = - if not is_nil(object) do - Map.put(activity, :object, object) - else - activity - end + activity = Maps.put_if_present(activity, :object, object) BackgroundWorker.enqueue("fetch_data_for_activity", %{"activity_id" => activity.id}) @@ -201,10 +173,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do stream_out_participations(participations) end + defp maybe_create_activity_expiration({:ok, %{data: %{"expires_at" => expires_at}} = activity}) do + with {:ok, _} <- ActivityExpiration.create(activity, expires_at) do + {:ok, activity} + end + end + + defp maybe_create_activity_expiration(result), do: result + defp create_or_bump_conversation(activity, actor) do with {:ok, conversation} <- Conversation.create_or_bump_for(activity), - %User{} = user <- User.get_cached_by_ap_id(actor), - Participation.mark_as_read(user, conversation) do + %User{} = user <- User.get_cached_by_ap_id(actor) do + Participation.mark_as_read(user, conversation) {:ok, conversation} end end @@ -226,13 +206,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end def stream_out_participations(%Object{data: %{"context" => context}}, user) do - with %Conversation{} = conversation <- Conversation.get_for_ap_id(context), - conversation = Repo.preload(conversation, :participations), - last_activity_id = - fetch_latest_activity_id_for_context(conversation.ap_id, %{ - "user" => user, - "blocking_user" => user - }) do + with %Conversation{} = conversation <- Conversation.get_for_ap_id(context) do + conversation = Repo.preload(conversation, :participations) + + last_activity_id = + fetch_latest_direct_activity_id_for_context(conversation.ap_id, %{ + user: user, + blocking_user: user + }) + if last_activity_id do stream_out_participations(conversation.participations) end @@ -266,12 +248,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do published = params[:published] quick_insert? = Config.get([:env]) == :benchmark - with create_data <- - make_create_data( - %{to: to, actor: actor, published: published, context: context, object: object}, - additional - ), - {:ok, activity} <- insert(create_data, local, fake), + create_data = + make_create_data( + %{to: to, actor: actor, published: published, context: context, object: object}, + additional + ) + + with {:ok, activity} <- insert(create_data, local, fake), {:fake, false, activity} <- {:fake, fake, activity}, _ <- increase_replies_count_if_reply(create_data), _ <- increase_poll_votes_if_vote(create_data), @@ -299,12 +282,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do local = !(params[:local] == false) published = params[:published] - with listen_data <- - make_listen_data( - %{to: to, actor: actor, published: published, context: context, object: object}, - additional - ), - {:ok, activity} <- insert(listen_data, local), + listen_data = + make_listen_data( + %{to: to, actor: actor, published: published, context: context, object: object}, + additional + ) + + with {:ok, activity} <- insert(listen_data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} @@ -322,83 +306,36 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end @spec accept_or_reject(String.t(), map()) :: {:ok, Activity.t()} | {:error, any()} - def accept_or_reject(type, %{to: to, actor: actor, object: object} = params) do + defp accept_or_reject(type, %{to: to, actor: actor, object: object} = params) do local = Map.get(params, :local, true) activity_id = Map.get(params, :activity_id, nil) - with data <- - %{"to" => to, "type" => type, "actor" => actor.ap_id, "object" => object} - |> Utils.maybe_put("id", activity_id), - {:ok, activity} <- insert(data, local), - _ <- notify_and_stream(activity), - :ok <- maybe_federate(activity) do - {:ok, activity} - end - end + data = + %{"to" => to, "type" => type, "actor" => actor.ap_id, "object" => object} + |> Maps.put_if_present("id", activity_id) - @spec update(map()) :: {:ok, Activity.t()} | {:error, any()} - def update(%{to: to, cc: cc, actor: actor, object: object} = params) do - local = !(params[:local] == false) - activity_id = params[:activity_id] - - with data <- %{ - "to" => to, - "cc" => cc, - "type" => "Update", - "actor" => actor, - "object" => object - }, - data <- Utils.maybe_put(data, "id", activity_id), - {:ok, activity} <- insert(data, local), + with {:ok, activity} <- insert(data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} end end - @spec announce(User.t(), Object.t(), String.t() | nil, boolean(), boolean()) :: - {:ok, Activity.t(), Object.t()} | {:error, any()} - def announce( - %User{ap_id: _} = user, - %Object{data: %{"id" => _}} = object, - activity_id \\ nil, - local \\ true, - public \\ true - ) do - with {:ok, result} <- - Repo.transaction(fn -> do_announce(user, object, activity_id, local, public) end) do - result - end - end - - defp do_announce(user, object, activity_id, local, public) do - with true <- is_announceable?(object, user, public), - object <- Object.get_by_id(object.id), - announce_data <- make_announce_data(user, object, activity_id, public), - {:ok, activity} <- insert(announce_data, local), - {:ok, object} <- add_announce_to_object(activity, object), - _ <- notify_and_stream(activity), - :ok <- maybe_federate(activity) do - {:ok, activity, object} - else - false -> {:error, false} - {:error, error} -> Repo.rollback(error) - end - end - - @spec follow(User.t(), User.t(), String.t() | nil, boolean()) :: + @spec follow(User.t(), User.t(), String.t() | nil, boolean(), keyword()) :: {:ok, Activity.t()} | {:error, any()} - def follow(follower, followed, activity_id \\ nil, local \\ true) do + def follow(follower, followed, activity_id \\ nil, local \\ true, opts \\ []) do with {:ok, result} <- - Repo.transaction(fn -> do_follow(follower, followed, activity_id, local) end) do + Repo.transaction(fn -> do_follow(follower, followed, activity_id, local, opts) end) do result end end - defp do_follow(follower, followed, activity_id, local) do - with data <- make_follow_data(follower, followed, activity_id), - {:ok, activity} <- insert(data, local), - _ <- notify_and_stream(activity), + defp do_follow(follower, followed, activity_id, local, opts) do + skip_notify_and_stream = Keyword.get(opts, :skip_notify_and_stream, false) + data = make_follow_data(follower, followed, activity_id) + + with {:ok, activity} <- insert(data, local), + _ <- skip_notify_and_stream || notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} else @@ -429,33 +366,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end end - @spec block(User.t(), User.t(), String.t() | nil, boolean()) :: - {:ok, Activity.t()} | {:error, any()} - def block(blocker, blocked, activity_id \\ nil, local \\ true) do - with {:ok, result} <- - Repo.transaction(fn -> do_block(blocker, blocked, activity_id, local) end) do - result - end - end - - defp do_block(blocker, blocked, activity_id, local) do - unfollow_blocked = Config.get([:activitypub, :unfollow_blocked]) - - if unfollow_blocked do - follow_activity = fetch_latest_follow(blocker, blocked) - if follow_activity, do: unfollow(blocker, blocked, nil, local) - end - - with block_data <- make_block_data(blocker, blocked, activity_id), - {:ok, activity} <- insert(block_data, local), - _ <- notify_and_stream(activity), - :ok <- maybe_federate(activity) do - {:ok, activity} - else - {:error, error} -> Repo.rollback(error) - end - end - @spec flag(map()) :: {:ok, Activity.t()} | {:error, any()} def flag( %{ @@ -526,8 +436,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do public = [Constants.as_public()] recipients = - if opts["user"], - do: [opts["user"].ap_id | User.following(opts["user"])] ++ public, + if opts[:user], + do: [opts[:user].ap_id | User.following(opts[:user])] ++ public, else: public from(activity in Activity) @@ -535,7 +445,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> maybe_preload_bookmarks(opts) |> maybe_set_thread_muted_field(opts) |> restrict_blocked(opts) - |> restrict_recipients(recipients, opts["user"]) + |> restrict_recipients(recipients, opts[:user]) |> where( [activity], fragment( @@ -558,45 +468,50 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> Repo.all() end - @spec fetch_latest_activity_id_for_context(String.t(), keyword() | map()) :: + @spec fetch_latest_direct_activity_id_for_context(String.t(), keyword() | map()) :: FlakeId.Ecto.CompatType.t() | nil - def fetch_latest_activity_id_for_context(context, opts \\ %{}) do + def fetch_latest_direct_activity_id_for_context(context, opts \\ %{}) do context - |> fetch_activities_for_context_query(Map.merge(%{"skip_preload" => true}, opts)) + |> fetch_activities_for_context_query(Map.merge(%{skip_preload: true}, opts)) + |> restrict_visibility(%{visibility: "direct"}) |> limit(1) |> select([a], a.id) |> Repo.one() end - @spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()] - def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do - opts = Map.drop(opts, ["user"]) + @spec fetch_public_or_unlisted_activities(map(), Pagination.type()) :: [Activity.t()] + def fetch_public_or_unlisted_activities(opts \\ %{}, pagination \\ :keyset) do + opts = Map.delete(opts, :user) [Constants.as_public()] |> fetch_activities_query(opts) - |> restrict_unlisted() + |> restrict_unlisted(opts) |> Pagination.fetch_paginated(opts, pagination) end + @spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()] + def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do + opts + |> Map.put(:restrict_unlisted, true) + |> fetch_public_or_unlisted_activities(pagination) + end + @valid_visibilities ~w[direct unlisted public private] defp restrict_visibility(query, %{visibility: visibility}) when is_list(visibility) do if Enum.all?(visibility, &(&1 in @valid_visibilities)) do - query = - from( - a in query, - where: - fragment( - "activity_visibility(?, ?, ?) = ANY (?)", - a.actor, - a.recipients, - a.data, - ^visibility - ) - ) - - query + from( + a in query, + where: + fragment( + "activity_visibility(?, ?, ?) = ANY (?)", + a.actor, + a.recipients, + a.data, + ^visibility + ) + ) else Logger.error("Could not restrict visibility to #{visibility}") end @@ -618,7 +533,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_visibility(query, _visibility), do: query - defp exclude_visibility(query, %{"exclude_visibilities" => visibility}) + defp exclude_visibility(query, %{exclude_visibilities: visibility}) when is_list(visibility) do if Enum.all?(visibility, &(&1 in @valid_visibilities)) do from( @@ -638,7 +553,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end end - defp exclude_visibility(query, %{"exclude_visibilities" => visibility}) + defp exclude_visibility(query, %{exclude_visibilities: visibility}) when visibility in @valid_visibilities do from( a in query, @@ -653,7 +568,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do ) end - defp exclude_visibility(query, %{"exclude_visibilities" => visibility}) + defp exclude_visibility(query, %{exclude_visibilities: visibility}) when visibility not in [nil | @valid_visibilities] do Logger.error("Could not exclude visibility to #{visibility}") query @@ -664,14 +579,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_thread_visibility(query, _, %{skip_thread_containment: true} = _), do: query - defp restrict_thread_visibility( - query, - %{"user" => %User{skip_thread_containment: true}}, - _ - ), - do: query + defp restrict_thread_visibility(query, %{user: %User{skip_thread_containment: true}}, _), + do: query - defp restrict_thread_visibility(query, %{"user" => %User{ap_id: ap_id}}, _) do + defp restrict_thread_visibility(query, %{user: %User{ap_id: ap_id}}, _) do from( a in query, where: fragment("thread_visibility(?, (?)->>'id') = true", ^ap_id, a.data) @@ -683,87 +594,99 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do def fetch_user_abstract_activities(user, reading_user, params \\ %{}) do params = params - |> Map.put("user", reading_user) - |> Map.put("actor_id", user.ap_id) + |> Map.put(:user, reading_user) + |> Map.put(:actor_id, user.ap_id) - recipients = - user_activities_recipients(%{ - "godmode" => params["godmode"], - "reading_user" => reading_user - }) - - fetch_activities(recipients, params) + %{ + godmode: params[:godmode], + reading_user: reading_user + } + |> user_activities_recipients() + |> fetch_activities(params) |> Enum.reverse() end def fetch_user_activities(user, reading_user, params \\ %{}) do params = params - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("user", reading_user) - |> Map.put("actor_id", user.ap_id) - |> Map.put("pinned_activity_ids", user.pinned_activities) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:user, reading_user) + |> Map.put(:actor_id, user.ap_id) + |> Map.put(:pinned_activity_ids, user.pinned_activities) params = if User.blocks?(reading_user, user) do params else params - |> Map.put("blocking_user", reading_user) - |> Map.put("muting_user", reading_user) + |> Map.put(:blocking_user, reading_user) + |> Map.put(:muting_user, reading_user) end - recipients = - user_activities_recipients(%{ - "godmode" => params["godmode"], - "reading_user" => reading_user - }) - - fetch_activities(recipients, params) + %{ + godmode: params[:godmode], + reading_user: reading_user + } + |> user_activities_recipients() + |> fetch_activities(params) |> Enum.reverse() end def fetch_statuses(reading_user, params) do - params = - params - |> Map.put("type", ["Create", "Announce"]) + params = Map.put(params, :type, ["Create", "Announce"]) - recipients = - user_activities_recipients(%{ - "godmode" => params["godmode"], - "reading_user" => reading_user - }) - - fetch_activities(recipients, params, :offset) + %{ + godmode: params[:godmode], + reading_user: reading_user + } + |> user_activities_recipients() + |> fetch_activities(params, :offset) |> Enum.reverse() end - defp user_activities_recipients(%{"godmode" => true}) do - [] - end + defp user_activities_recipients(%{godmode: true}), do: [] - defp user_activities_recipients(%{"reading_user" => reading_user}) do + defp user_activities_recipients(%{reading_user: reading_user}) do if reading_user do - [Constants.as_public()] ++ [reading_user.ap_id | User.following(reading_user)] + [Constants.as_public(), reading_user.ap_id | User.following(reading_user)] else [Constants.as_public()] end end - defp restrict_since(query, %{"since_id" => ""}), do: query + defp restrict_announce_object_actor(_query, %{announce_filtering_user: _, skip_preload: true}) do + raise "Can't use the child object without preloading!" + end + + defp restrict_announce_object_actor(query, %{announce_filtering_user: %{ap_id: actor}}) do + from( + [activity, object] in query, + where: + fragment( + "?->>'type' != ? or ?->>'actor' != ?", + activity.data, + "Announce", + object.data, + ^actor + ) + ) + end + + defp restrict_announce_object_actor(query, _), do: query + + defp restrict_since(query, %{since_id: ""}), do: query - defp restrict_since(query, %{"since_id" => since_id}) do + defp restrict_since(query, %{since_id: since_id}) do from(activity in query, where: activity.id > ^since_id) end defp restrict_since(query, _), do: query - defp restrict_tag_reject(_query, %{"tag_reject" => _tag_reject, "skip_preload" => true}) do + defp restrict_tag_reject(_query, %{tag_reject: _tag_reject, skip_preload: true}) do raise "Can't use the child object without preloading!" end - defp restrict_tag_reject(query, %{"tag_reject" => tag_reject}) - when is_list(tag_reject) and tag_reject != [] do + defp restrict_tag_reject(query, %{tag_reject: [_ | _] = tag_reject}) do from( [_activity, object] in query, where: fragment("not (?)->'tag' \\?| (?)", object.data, ^tag_reject) @@ -772,12 +695,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_tag_reject(query, _), do: query - defp restrict_tag_all(_query, %{"tag_all" => _tag_all, "skip_preload" => true}) do + defp restrict_tag_all(_query, %{tag_all: _tag_all, skip_preload: true}) do raise "Can't use the child object without preloading!" end - defp restrict_tag_all(query, %{"tag_all" => tag_all}) - when is_list(tag_all) and tag_all != [] do + defp restrict_tag_all(query, %{tag_all: [_ | _] = tag_all}) do from( [_activity, object] in query, where: fragment("(?)->'tag' \\?& (?)", object.data, ^tag_all) @@ -786,18 +708,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_tag_all(query, _), do: query - defp restrict_tag(_query, %{"tag" => _tag, "skip_preload" => true}) do + defp restrict_tag(_query, %{tag: _tag, skip_preload: true}) do raise "Can't use the child object without preloading!" end - defp restrict_tag(query, %{"tag" => tag}) when is_list(tag) do + defp restrict_tag(query, %{tag: tag}) when is_list(tag) do from( [_activity, object] in query, where: fragment("(?)->'tag' \\?| (?)", object.data, ^tag) ) end - defp restrict_tag(query, %{"tag" => tag}) when is_binary(tag) do + defp restrict_tag(query, %{tag: tag}) when is_binary(tag) do from( [_activity, object] in query, where: fragment("(?)->'tag' \\? (?)", object.data, ^tag) @@ -820,35 +742,35 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do ) end - defp restrict_local(query, %{"local_only" => true}) do + defp restrict_local(query, %{local_only: true}) do from(activity in query, where: activity.local == true) end defp restrict_local(query, _), do: query - defp restrict_actor(query, %{"actor_id" => actor_id}) do + defp restrict_actor(query, %{actor_id: actor_id}) do from(activity in query, where: activity.actor == ^actor_id) end defp restrict_actor(query, _), do: query - defp restrict_type(query, %{"type" => type}) when is_binary(type) do + defp restrict_type(query, %{type: type}) when is_binary(type) do from(activity in query, where: fragment("?->>'type' = ?", activity.data, ^type)) end - defp restrict_type(query, %{"type" => type}) do + defp restrict_type(query, %{type: type}) do from(activity in query, where: fragment("?->>'type' = ANY(?)", activity.data, ^type)) end defp restrict_type(query, _), do: query - defp restrict_state(query, %{"state" => state}) do + defp restrict_state(query, %{state: state}) do from(activity in query, where: fragment("?->>'state' = ?", activity.data, ^state)) end defp restrict_state(query, _), do: query - defp restrict_favorited_by(query, %{"favorited_by" => ap_id}) do + defp restrict_favorited_by(query, %{favorited_by: ap_id}) do from( [_activity, object] in query, where: fragment("(?)->'likes' \\? (?)", object.data, ^ap_id) @@ -857,20 +779,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_favorited_by(query, _), do: query - defp restrict_media(_query, %{"only_media" => _val, "skip_preload" => true}) do + defp restrict_media(_query, %{only_media: _val, skip_preload: true}) do raise "Can't use the child object without preloading!" end - defp restrict_media(query, %{"only_media" => val}) when val in [true, "true", "1"] do + defp restrict_media(query, %{only_media: true}) do from( - [_activity, object] in query, + [activity, object] in query, + where: fragment("(?)->>'type' = ?", activity.data, "Create"), where: fragment("not (?)->'attachment' = (?)", object.data, ^[]) ) end defp restrict_media(query, _), do: query - defp restrict_replies(query, %{"exclude_replies" => val}) when val in [true, "true", "1"] do + defp restrict_replies(query, %{exclude_replies: true}) do from( [_activity, object] in query, where: fragment("?->>'inReplyTo' is null", object.data) @@ -878,8 +801,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp restrict_replies(query, %{ - "reply_filtering_user" => user, - "reply_visibility" => "self" + reply_filtering_user: user, + reply_visibility: "self" }) do from( [activity, object] in query, @@ -894,8 +817,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end defp restrict_replies(query, %{ - "reply_filtering_user" => user, - "reply_visibility" => "following" + reply_filtering_user: user, + reply_visibility: "following" }) do from( [activity, object] in query, @@ -914,16 +837,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_replies(query, _), do: query - defp restrict_reblogs(query, %{"exclude_reblogs" => val}) when val in [true, "true", "1"] do + defp restrict_reblogs(query, %{exclude_reblogs: true}) do from(activity in query, where: fragment("?->>'type' != 'Announce'", activity.data)) end defp restrict_reblogs(query, _), do: query - defp restrict_muted(query, %{"with_muted" => val}) when val in [true, "true", "1"], do: query + defp restrict_muted(query, %{with_muted: true}), do: query - defp restrict_muted(query, %{"muting_user" => %User{} = user} = opts) do - mutes = opts["muted_users_ap_ids"] || User.muted_users_ap_ids(user) + defp restrict_muted(query, %{muting_user: %User{} = user} = opts) do + mutes = opts[:muted_users_ap_ids] || User.muted_users_ap_ids(user) query = from([activity] in query, @@ -931,7 +854,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do where: fragment("not (?->'to' \\?| ?)", activity.data, ^mutes) ) - unless opts["skip_preload"] do + unless opts[:skip_preload] do from([thread_mute: tm] in query, where: is_nil(tm.user_id)) else query @@ -940,8 +863,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_muted(query, _), do: query - defp restrict_blocked(query, %{"blocking_user" => %User{} = user} = opts) do - blocked_ap_ids = opts["blocked_users_ap_ids"] || User.blocked_users_ap_ids(user) + defp restrict_blocked(query, %{blocking_user: %User{} = user} = opts) do + blocked_ap_ids = opts[:blocked_users_ap_ids] || User.blocked_users_ap_ids(user) domain_blocks = user.domain_blocks || [] following_ap_ids = User.get_friends_ap_ids(user) @@ -953,6 +876,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do [activity, object: o] in query, where: fragment("not (? = ANY(?))", activity.actor, ^blocked_ap_ids), where: fragment("not (? && ?)", activity.recipients, ^blocked_ap_ids), + where: + fragment( + "recipients_contain_blocked_domains(?, ?) = false", + activity.recipients, + ^domain_blocks + ), where: fragment( "not (?->>'type' = 'Announce' and ?->'to' \\?| ?)", @@ -981,7 +910,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_blocked(query, _), do: query - defp restrict_unlisted(query) do + defp restrict_unlisted(query, %{restrict_unlisted: true}) do from( activity in query, where: @@ -993,19 +922,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do ) end - # TODO: when all endpoints migrated to OpenAPI compare `pinned` with `true` (boolean) only, - # the same for `restrict_media/2`, `restrict_replies/2`, 'restrict_reblogs/2' - # and `restrict_muted/2` + defp restrict_unlisted(query, _), do: query - defp restrict_pinned(query, %{"pinned" => pinned, "pinned_activity_ids" => ids}) - when pinned in [true, "true", "1"] do + defp restrict_pinned(query, %{pinned: true, pinned_activity_ids: ids}) do from(activity in query, where: activity.id in ^ids) end defp restrict_pinned(query, _), do: query - defp restrict_muted_reblogs(query, %{"muting_user" => %User{} = user} = opts) do - muted_reblogs = opts["reblog_muted_users_ap_ids"] || User.reblog_muted_users_ap_ids(user) + defp restrict_muted_reblogs(query, %{muting_user: %User{} = user} = opts) do + muted_reblogs = opts[:reblog_muted_users_ap_ids] || User.reblog_muted_users_ap_ids(user) from( activity in query, @@ -1021,7 +947,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_muted_reblogs(query, _), do: query - defp restrict_instance(query, %{"instance" => instance}) do + defp restrict_instance(query, %{instance: instance}) do users = from( u in User, @@ -1035,7 +961,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp restrict_instance(query, _), do: query - defp exclude_poll_votes(query, %{"include_poll_votes" => true}), do: query + defp exclude_poll_votes(query, %{include_poll_votes: true}), do: query defp exclude_poll_votes(query, _) do if has_named_binding?(query, :object) do @@ -1047,38 +973,61 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end end - defp exclude_id(query, %{"exclude_id" => id}) when is_binary(id) do + defp exclude_chat_messages(query, %{include_chat_messages: true}), do: query + + defp exclude_chat_messages(query, _) do + if has_named_binding?(query, :object) do + from([activity, object: o] in query, + where: fragment("not(?->>'type' = ?)", o.data, "ChatMessage") + ) + else + query + end + end + + defp exclude_invisible_actors(query, %{invisible_actors: true}), do: query + + defp exclude_invisible_actors(query, _opts) do + invisible_ap_ids = + User.Query.build(%{invisible: true, select: [:ap_id]}) + |> Repo.all() + |> Enum.map(fn %{ap_id: ap_id} -> ap_id end) + + from([activity] in query, where: activity.actor not in ^invisible_ap_ids) + end + + defp exclude_id(query, %{exclude_id: id}) when is_binary(id) do from(activity in query, where: activity.id != ^id) end defp exclude_id(query, _), do: query - defp maybe_preload_objects(query, %{"skip_preload" => true}), do: query + defp maybe_preload_objects(query, %{skip_preload: true}), do: query defp maybe_preload_objects(query, _) do query |> Activity.with_preloaded_object() end - defp maybe_preload_bookmarks(query, %{"skip_preload" => true}), do: query + defp maybe_preload_bookmarks(query, %{skip_preload: true}), do: query defp maybe_preload_bookmarks(query, opts) do query - |> Activity.with_preloaded_bookmark(opts["user"]) + |> Activity.with_preloaded_bookmark(opts[:user]) end - defp maybe_preload_report_notes(query, %{"preload_report_notes" => true}) do + defp maybe_preload_report_notes(query, %{preload_report_notes: true}) do query |> Activity.with_preloaded_report_notes() end defp maybe_preload_report_notes(query, _), do: query - defp maybe_set_thread_muted_field(query, %{"skip_preload" => true}), do: query + defp maybe_set_thread_muted_field(query, %{skip_preload: true}), do: query defp maybe_set_thread_muted_field(query, opts) do query - |> Activity.with_set_thread_muted_field(opts["muting_user"] || opts["user"]) + |> Activity.with_set_thread_muted_field(opts[:muting_user] || opts[:user]) end defp maybe_order(query, %{order: :desc}) do @@ -1094,24 +1043,23 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp maybe_order(query, _), do: query defp fetch_activities_query_ap_ids_ops(opts) do - source_user = opts["muting_user"] + source_user = opts[:muting_user] ap_id_relationships = if source_user, do: [:mute, :reblog_mute], else: [] ap_id_relationships = - ap_id_relationships ++ - if opts["blocking_user"] && opts["blocking_user"] == source_user do - [:block] - else - [] - end + if opts[:blocking_user] && opts[:blocking_user] == source_user do + [:block | ap_id_relationships] + else + ap_id_relationships + end preloaded_ap_ids = User.outgoing_relationships_ap_ids(source_user, ap_id_relationships) - restrict_blocked_opts = Map.merge(%{"blocked_users_ap_ids" => preloaded_ap_ids[:block]}, opts) - restrict_muted_opts = Map.merge(%{"muted_users_ap_ids" => preloaded_ap_ids[:mute]}, opts) + restrict_blocked_opts = Map.merge(%{blocked_users_ap_ids: preloaded_ap_ids[:block]}, opts) + restrict_muted_opts = Map.merge(%{muted_users_ap_ids: preloaded_ap_ids[:mute]}, opts) restrict_muted_reblogs_opts = - Map.merge(%{"reblog_muted_users_ap_ids" => preloaded_ap_ids[:reblog_mute]}, opts) + Map.merge(%{reblog_muted_users_ap_ids: preloaded_ap_ids[:reblog_mute]}, opts) {restrict_blocked_opts, restrict_muted_opts, restrict_muted_reblogs_opts} end @@ -1130,7 +1078,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> maybe_preload_report_notes(opts) |> maybe_set_thread_muted_field(opts) |> maybe_order(opts) - |> restrict_recipients(recipients, opts["user"]) + |> restrict_recipients(recipients, opts[:user]) |> restrict_replies(opts) |> restrict_tag(opts) |> restrict_tag_reject(opts) @@ -1150,18 +1098,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> restrict_pinned(opts) |> restrict_muted_reblogs(restrict_muted_reblogs_opts) |> restrict_instance(opts) + |> restrict_announce_object_actor(opts) |> Activity.restrict_deactivated_users() |> exclude_poll_votes(opts) + |> exclude_chat_messages(opts) + |> exclude_invisible_actors(opts) |> exclude_visibility(opts) end def fetch_activities(recipients, opts \\ %{}, pagination \\ :keyset) do - list_memberships = Pleroma.List.memberships(opts["user"]) + list_memberships = Pleroma.List.memberships(opts[:user]) fetch_activities_query(recipients ++ list_memberships, opts) |> Pagination.fetch_paginated(opts, pagination) |> Enum.reverse() - |> maybe_update_cc(list_memberships, opts["user"]) + |> maybe_update_cc(list_memberships, opts[:user]) end @doc """ @@ -1174,19 +1125,17 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> Activity.Queries.by_type("Like") |> Activity.with_joined_object() |> Object.with_joined_activity() - |> select([_like, object, activity], %{activity | object: object}) - |> order_by([like, _, _], desc: like.id) + |> select([like, object, activity], %{activity | object: object, pagination_id: like.id}) + |> order_by([like, _, _], desc_nulls_last: like.id) |> Pagination.fetch_paginated( - Map.merge(params, %{"skip_order" => true}), - pagination, - :object_activity + Map.merge(params, %{skip_order: true}), + pagination ) end - defp maybe_update_cc(activities, list_memberships, %User{ap_id: user_ap_id}) - when is_list(list_memberships) and length(list_memberships) > 0 do + defp maybe_update_cc(activities, [_ | _] = list_memberships, %User{ap_id: user_ap_id}) do Enum.map(activities, fn - %{data: %{"bcc" => bcc}} = activity when is_list(bcc) and length(bcc) > 0 -> + %{data: %{"bcc" => [_ | _] = bcc}} = activity -> if Enum.any?(bcc, &(&1 in list_memberships)) do update_in(activity.data["cc"], &[user_ap_id | &1]) else @@ -1200,7 +1149,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp maybe_update_cc(activities, _, _), do: activities - def fetch_activities_bounded_query(query, recipients, recipients_with_public) do + defp fetch_activities_bounded_query(query, recipients, recipients_with_public) do from(activity in query, where: fragment("? && ?", activity.recipients, ^recipients) or @@ -1224,12 +1173,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do @spec upload(Upload.source(), keyword()) :: {:ok, Object.t()} | {:error, any()} def upload(file, opts \\ []) do with {:ok, data} <- Upload.store(file, opts) do - obj_data = - if opts[:actor] do - Map.put(data, "actor", opts[:actor]) - else - data - end + obj_data = Maps.put_if_present(data, "actor", opts[:actor]) Repo.insert(%Object{data: obj_data}) end @@ -1275,8 +1219,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do %{"type" => "Emoji"} -> true _ -> false end) - |> Enum.reduce(%{}, fn %{"icon" => %{"url" => url}, "name" => name}, acc -> - Map.put(acc, String.trim(name, ":"), url) + |> Map.new(fn %{"icon" => %{"url" => url}, "name" => name} -> + {String.trim(name, ":"), url} end) locked = data["manuallyApprovesFollowers"] || false @@ -1322,18 +1266,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do } # nickname can be nil because of virtual actors - user_data = - if data["preferredUsername"] do - Map.put( - user_data, - :nickname, - "#{data["preferredUsername"]}@#{URI.parse(data["id"]).host}" - ) - else - Map.put(user_data, :nickname, nil) - end - - {:ok, user_data} + if data["preferredUsername"] do + Map.put( + user_data, + :nickname, + "#{data["preferredUsername"]}@#{URI.parse(data["id"]).host}" + ) + else + Map.put(user_data, :nickname, nil) + end end def fetch_follow_information_for_user(user) do @@ -1408,9 +1349,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do defp collection_private(_data), do: {:ok, true} def user_data_from_user_object(data) do - with {:ok, data} <- MRF.filter(data), - {:ok, data} <- object_to_user_data(data) do - {:ok, data} + with {:ok, data} <- MRF.filter(data) do + {:ok, object_to_user_data(data)} else e -> {:error, e} end @@ -1418,20 +1358,29 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do def fetch_and_prepare_user_from_ap_id(ap_id) do with {:ok, data} <- Fetcher.fetch_and_contain_remote_object_from_id(ap_id), - {:ok, data} <- user_data_from_user_object(data), - data <- maybe_update_follow_information(data) do - {:ok, data} + {:ok, data} <- user_data_from_user_object(data) do + {:ok, maybe_update_follow_information(data)} else - {:error, "Object has been deleted"} = e -> + {:error, "Object has been deleted" = e} -> Logger.debug("Could not decode user at fetch #{ap_id}, #{inspect(e)}") {:error, e} - e -> + {:error, e} -> Logger.error("Could not decode user at fetch #{ap_id}, #{inspect(e)}") {:error, e} end end + def maybe_handle_clashing_nickname(nickname) do + with %User{} = old_user <- User.get_by_nickname(nickname) do + Logger.info("Found an old user for #{nickname}, ap id is #{old_user.ap_id}, renaming.") + + old_user + |> User.remote_user_changeset(%{nickname: "#{old_user.id}.#{old_user.nickname}"}) + |> User.update_and_set_cache() + end + end + def make_user_from_ap_id(ap_id) do user = User.get_cached_by_ap_id(ap_id) @@ -1444,13 +1393,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |> User.remote_user_changeset(data) |> User.update_and_set_cache() else + maybe_handle_clashing_nickname(data[:nickname]) + data |> User.remote_user_changeset() |> Repo.insert() |> User.set_cache() end - else - e -> {:error, e} end end end @@ -1464,7 +1413,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do end # filter out broken threads - def contain_broken_threads(%Activity{} = activity, %User{} = user) do + defp contain_broken_threads(%Activity{} = activity, %User{} = user) do entire_thread_visible_for_user?(activity, user) end @@ -1475,7 +1424,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do def fetch_direct_messages_query do Activity - |> restrict_type(%{"type" => "Create"}) + |> restrict_type(%{type: "Create"}) |> restrict_visibility(%{visibility: "direct"}) |> order_by([activity], asc: activity.id) end diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 62ad15d85..220c4fe52 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -21,6 +21,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do alias Pleroma.Web.ActivityPub.UserView alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Web.ControllerHelper + alias Pleroma.Web.Endpoint alias Pleroma.Web.FederatingPlug alias Pleroma.Web.Federator @@ -75,8 +77,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do end end - def object(conn, %{"uuid" => uuid}) do - with ap_id <- o_status_url(conn, :object, uuid), + def object(conn, _) do + with ap_id <- Endpoint.url() <> conn.request_path, %Object{} = object <- Object.get_cached_by_ap_id(ap_id), {_, true} <- {:public?, Visibility.is_public?(object)} do conn @@ -101,8 +103,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do conn end - def activity(conn, %{"uuid" => uuid}) do - with ap_id <- o_status_url(conn, :activity, uuid), + def activity(conn, _params) do + with ap_id <- Endpoint.url() <> conn.request_path, %Activity{} = activity <- Activity.normalize(ap_id), {_, true} <- {:public?, Visibility.is_public?(activity)} do conn @@ -229,27 +231,23 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do when page? in [true, "true"] do with %User{} = user <- User.get_cached_by_nickname(nickname), {:ok, user} <- User.ensure_keys_present(user) do - activities = - if params["max_id"] do - ActivityPub.fetch_user_activities(user, for_user, %{ - "max_id" => params["max_id"], - # This is a hack because postgres generates inefficient queries when filtering by - # 'Answer', poll votes will be hidden by the visibility filter in this case anyway - "include_poll_votes" => true, - "limit" => 10 - }) - else - ActivityPub.fetch_user_activities(user, for_user, %{ - "limit" => 10, - "include_poll_votes" => true - }) - end + # "include_poll_votes" is a hack because postgres generates inefficient + # queries when filtering by 'Answer', poll votes will be hidden by the + # visibility filter in this case anyway + params = + params + |> Map.drop(["nickname", "page"]) + |> Map.put("include_poll_votes", true) + |> Map.new(fn {k, v} -> {String.to_existing_atom(k), v} end) + + activities = ActivityPub.fetch_user_activities(user, for_user, params) conn |> put_resp_content_type("application/activity+json") |> put_view(UserView) |> render("activity_collection_page.json", %{ activities: activities, + pagination: ControllerHelper.get_pagination_fields(conn, activities), iri: "#{user.ap_id}/outbox" }) end @@ -352,21 +350,24 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do %{"nickname" => nickname, "page" => page?} = params ) when page? in [true, "true"] do + params = + params + |> Map.drop(["nickname", "page"]) + |> Map.put("blocking_user", user) + |> Map.put("user", user) + |> Map.new(fn {k, v} -> {String.to_existing_atom(k), v} end) + activities = - if params["max_id"] do - ActivityPub.fetch_activities([user.ap_id | User.following(user)], %{ - "max_id" => params["max_id"], - "limit" => 10 - }) - else - ActivityPub.fetch_activities([user.ap_id | User.following(user)], %{"limit" => 10}) - end + [user.ap_id | User.following(user)] + |> ActivityPub.fetch_activities(params) + |> Enum.reverse() conn |> put_resp_content_type("application/activity+json") |> put_view(UserView) |> render("activity_collection_page.json", %{ activities: activities, + pagination: ControllerHelper.get_pagination_fields(conn, activities), iri: "#{user.ap_id}/inbox" }) end @@ -513,7 +514,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do {new_user, for_user} end - # TODO: Add support for "object" field @doc """ Endpoint based on @@ -524,6 +524,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do Response: - HTTP Code: 201 Created - HTTP Body: ActivityPub object to be inserted into another's `attachment` field + + Note: Will not point to a URL with a `Location` header because no standalone Activity has been created. """ def upload_media(%{assigns: %{user: %User{} = user}} = conn, %{"file" => file} = data) do with {:ok, object} <- diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 4a247ad0c..cabc28de9 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -5,11 +5,15 @@ defmodule Pleroma.Web.ActivityPub.Builder do This module encodes our addressing policies and general shape of our objects. """ + alias Pleroma.Emoji alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility + require Pleroma.Constants + @spec emoji_react(User.t(), Object.t(), String.t()) :: {:ok, map(), keyword()} def emoji_react(actor, object, emoji) do with {:ok, data, meta} <- object_action(actor, object) do @@ -62,6 +66,42 @@ defmodule Pleroma.Web.ActivityPub.Builder do }, []} end + def create(actor, object, recipients) do + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "to" => recipients, + "object" => object, + "type" => "Create", + "published" => DateTime.utc_now() |> DateTime.to_iso8601() + }, []} + end + + def chat_message(actor, recipient, content, opts \\ []) do + basic = %{ + "id" => Utils.generate_object_id(), + "actor" => actor.ap_id, + "type" => "ChatMessage", + "to" => [recipient], + "content" => content, + "published" => DateTime.utc_now() |> DateTime.to_iso8601(), + "emoji" => Emoji.Formatter.get_emoji_map(content) + } + + case opts[:attachment] do + %Object{data: attachment_data} -> + { + :ok, + Map.put(basic, "attachment", attachment_data), + [] + } + + _ -> + {:ok, basic, []} + end + end + @spec tombstone(String.t(), String.t()) :: {:ok, map(), keyword()} def tombstone(actor, id) do {:ok, @@ -83,6 +123,61 @@ defmodule Pleroma.Web.ActivityPub.Builder do end end + # Retricted to user updates for now, always public + @spec update(User.t(), Object.t()) :: {:ok, map(), keyword()} + def update(actor, object) do + to = [Pleroma.Constants.as_public(), actor.follower_address] + + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "type" => "Update", + "actor" => actor.ap_id, + "object" => object, + "to" => to + }, []} + end + + @spec block(User.t(), User.t()) :: {:ok, map(), keyword()} + def block(blocker, blocked) do + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "type" => "Block", + "actor" => blocker.ap_id, + "object" => blocked.ap_id, + "to" => [blocked.ap_id] + }, []} + end + + @spec announce(User.t(), Object.t(), keyword()) :: {:ok, map(), keyword()} + def announce(actor, object, options \\ []) do + public? = Keyword.get(options, :public, false) + + to = + cond do + actor.ap_id == Relay.relay_ap_id() -> + [actor.follower_address] + + public? -> + [actor.follower_address, object.data["actor"], Pleroma.Constants.as_public()] + + true -> + [actor.follower_address, object.data["actor"]] + end + + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "object" => object.data["id"], + "to" => to, + "context" => object.data["context"], + "type" => "Announce", + "published" => Utils.make_date() + }, []} + end + @spec object_action(User.t(), Object.t()) :: {:ok, map(), keyword()} defp object_action(actor, object) do object_actor = User.get_cached_by_ap_id(object.data["actor"]) diff --git a/lib/pleroma/web/activity_pub/mrf.ex b/lib/pleroma/web/activity_pub/mrf.ex index a0b3af432..206d6af52 100644 --- a/lib/pleroma/web/activity_pub/mrf.ex +++ b/lib/pleroma/web/activity_pub/mrf.ex @@ -8,18 +8,15 @@ defmodule Pleroma.Web.ActivityPub.MRF do def filter(policies, %{} = object) do policies |> Enum.reduce({:ok, object}, fn - policy, {:ok, object} -> - policy.filter(object) - - _, error -> - error + policy, {:ok, object} -> policy.filter(object) + _, error -> error end) end def filter(%{} = object), do: get_policies() |> filter(object) def get_policies do - Pleroma.Config.get([:instance, :rewrite_policy], []) |> get_policies() + Pleroma.Config.get([:mrf, :policies], []) |> get_policies() end defp get_policies(policy) when is_atom(policy), do: [policy] @@ -54,7 +51,7 @@ defmodule Pleroma.Web.ActivityPub.MRF do get_policies() |> Enum.map(fn policy -> to_string(policy) |> String.split(".") |> List.last() end) - exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions]) + exclusions = Pleroma.Config.get([:mrf, :transparency_exclusions]) base = %{ diff --git a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex new file mode 100644 index 000000000..8e47f1e02 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -0,0 +1,43 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do + @moduledoc "Adds expiration to all local Create activities" + @behaviour Pleroma.Web.ActivityPub.MRF + + @impl true + def filter(activity) do + activity = + if note?(activity) and local?(activity) do + maybe_add_expiration(activity) + else + activity + end + + {:ok, activity} + end + + @impl true + def describe, do: {:ok, %{}} + + defp local?(%{"id" => id}) do + String.starts_with?(id, Pleroma.Web.Endpoint.url()) + end + + defp note?(activity) do + match?(%{"type" => "Create", "object" => %{"type" => "Note"}}, activity) + end + + defp maybe_add_expiration(activity) do + days = Pleroma.Config.get([:mrf_activity_expiration, :days], 365) + expires_at = NaiveDateTime.utc_now() |> Timex.shift(days: days) + + with %{"expires_at" => existing_expires_at} <- activity, + :lt <- NaiveDateTime.compare(existing_expires_at, expires_at) do + activity + else + _ -> Map.put(activity, "expires_at", expires_at) + end + end +end diff --git a/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex b/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex index 9e7800997..a7e187b5e 100644 --- a/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/anti_link_spam_policy.ex @@ -27,11 +27,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicy do @impl true def filter(%{"type" => "Create", "actor" => actor, "object" => object} = message) do - with {:ok, %User{} = u} <- User.get_or_fetch_by_ap_id(actor), + with {:ok, %User{local: false} = u} <- User.get_or_fetch_by_ap_id(actor), {:contains_links, true} <- {:contains_links, contains_links?(object)}, {:old_user, true} <- {:old_user, old_user?(u)} do {:ok, message} else + {:ok, %User{local: true}} -> + {:ok, message} + {:contains_links, false} -> {:ok, message} diff --git a/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex b/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex index 1764bc789..f6b2c4415 100644 --- a/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/hellthread_policy.ex @@ -13,8 +13,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do defp delist_message(message, threshold) when threshold > 0 do follower_collection = User.get_cached_by_ap_id(message["actor"]).follower_address + to = message["to"] || [] + cc = message["cc"] || [] - follower_collection? = Enum.member?(message["to"] ++ message["cc"], follower_collection) + follower_collection? = Enum.member?(to ++ cc, follower_collection) message = case get_recipient_count(message) do @@ -71,7 +73,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicy do end @impl true - def filter(%{"type" => "Create"} = message) do + def filter(%{"type" => "Create", "object" => %{"type" => object_type}} = message) + when object_type in ~w{Note Article} do reject_threshold = Pleroma.Config.get( [:mrf_hellthread, :reject_threshold], diff --git a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex index b7dcb1b86..9cea6bcf9 100644 --- a/lib/pleroma/web/activity_pub/mrf/simple_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/simple_policy.ex @@ -3,21 +3,23 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do - alias Pleroma.User - alias Pleroma.Web.ActivityPub.MRF @moduledoc "Filter activities depending on their origin instance" @behaviour Pleroma.Web.ActivityPub.MRF + alias Pleroma.Config + alias Pleroma.User + alias Pleroma.Web.ActivityPub.MRF + require Pleroma.Constants defp check_accept(%{host: actor_host} = _actor_info, object) do accepts = - Pleroma.Config.get([:mrf_simple, :accept]) + Config.get([:mrf_simple, :accept]) |> MRF.subdomains_regex() cond do accepts == [] -> {:ok, object} - actor_host == Pleroma.Config.get([Pleroma.Web.Endpoint, :url, :host]) -> {:ok, object} + actor_host == Config.get([Pleroma.Web.Endpoint, :url, :host]) -> {:ok, object} MRF.subdomain_match?(accepts, actor_host) -> {:ok, object} true -> {:reject, nil} end @@ -25,7 +27,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do defp check_reject(%{host: actor_host} = _actor_info, object) do rejects = - Pleroma.Config.get([:mrf_simple, :reject]) + Config.get([:mrf_simple, :reject]) |> MRF.subdomains_regex() if MRF.subdomain_match?(rejects, actor_host) do @@ -41,7 +43,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do ) when length(child_attachment) > 0 do media_removal = - Pleroma.Config.get([:mrf_simple, :media_removal]) + Config.get([:mrf_simple, :media_removal]) |> MRF.subdomains_regex() object = @@ -65,7 +67,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do } = object ) do media_nsfw = - Pleroma.Config.get([:mrf_simple, :media_nsfw]) + Config.get([:mrf_simple, :media_nsfw]) |> MRF.subdomains_regex() object = @@ -85,7 +87,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do defp check_ftl_removal(%{host: actor_host} = _actor_info, object) do timeline_removal = - Pleroma.Config.get([:mrf_simple, :federated_timeline_removal]) + Config.get([:mrf_simple, :federated_timeline_removal]) |> MRF.subdomains_regex() object = @@ -108,7 +110,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do defp check_report_removal(%{host: actor_host} = _actor_info, %{"type" => "Flag"} = object) do report_removal = - Pleroma.Config.get([:mrf_simple, :report_removal]) + Config.get([:mrf_simple, :report_removal]) |> MRF.subdomains_regex() if MRF.subdomain_match?(report_removal, actor_host) do @@ -122,7 +124,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do defp check_avatar_removal(%{host: actor_host} = _actor_info, %{"icon" => _icon} = object) do avatar_removal = - Pleroma.Config.get([:mrf_simple, :avatar_removal]) + Config.get([:mrf_simple, :avatar_removal]) |> MRF.subdomains_regex() if MRF.subdomain_match?(avatar_removal, actor_host) do @@ -136,7 +138,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do defp check_banner_removal(%{host: actor_host} = _actor_info, %{"image" => _image} = object) do banner_removal = - Pleroma.Config.get([:mrf_simple, :banner_removal]) + Config.get([:mrf_simple, :banner_removal]) |> MRF.subdomains_regex() if MRF.subdomain_match?(banner_removal, actor_host) do @@ -197,10 +199,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do @impl true def describe do - exclusions = Pleroma.Config.get([:instance, :mrf_transparency_exclusions]) + exclusions = Config.get([:mrf, :transparency_exclusions]) mrf_simple = - Pleroma.Config.get(:mrf_simple) + Config.get(:mrf_simple) |> Enum.map(fn {k, v} -> {k, Enum.reject(v, fn v -> v in exclusions end)} end) |> Enum.into(%{}) diff --git a/lib/pleroma/web/activity_pub/mrf/steal_emoji_policy.ex b/lib/pleroma/web/activity_pub/mrf/steal_emoji_policy.ex new file mode 100644 index 000000000..2858af9eb --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/steal_emoji_policy.ex @@ -0,0 +1,97 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy do + require Logger + + alias Pleroma.Config + + @moduledoc "Detect new emojis by their shortcode and steals them" + @behaviour Pleroma.Web.ActivityPub.MRF + + defp remote_host?(host), do: host != Config.get([Pleroma.Web.Endpoint, :url, :host]) + + defp accept_host?(host), do: host in Config.get([:mrf_steal_emoji, :hosts], []) + + defp steal_emoji({shortcode, url}) do + url = Pleroma.Web.MediaProxy.url(url) + {:ok, response} = Pleroma.HTTP.get(url) + size_limit = Config.get([:mrf_steal_emoji, :size_limit], 50_000) + + if byte_size(response.body) <= size_limit do + emoji_dir_path = + Config.get( + [:mrf_steal_emoji, :path], + Path.join(Config.get([:instance, :static_dir]), "emoji/stolen") + ) + + extension = + url + |> URI.parse() + |> Map.get(:path) + |> Path.basename() + |> Path.extname() + + file_path = Path.join([emoji_dir_path, shortcode <> (extension || ".png")]) + + try do + :ok = File.write(file_path, response.body) + + shortcode + rescue + e -> + Logger.warn("MRF.StealEmojiPolicy: Failed to write to #{file_path}: #{inspect(e)}") + nil + end + else + Logger.debug( + "MRF.StealEmojiPolicy: :#{shortcode}: at #{url} (#{byte_size(response.body)} B) over size limit (#{ + size_limit + } B)" + ) + + nil + end + rescue + e -> + Logger.warn("MRF.StealEmojiPolicy: Failed to fetch #{url}: #{inspect(e)}") + nil + end + + @impl true + def filter(%{"object" => %{"emoji" => foreign_emojis, "actor" => actor}} = message) do + host = URI.parse(actor).host + + if remote_host?(host) and accept_host?(host) do + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + + new_emojis = + foreign_emojis + |> Enum.filter(fn {shortcode, _url} -> shortcode not in installed_emoji end) + |> Enum.filter(fn {shortcode, _url} -> + reject_emoji? = + Config.get([:mrf_steal_emoji, :rejected_shortcodes], []) + |> Enum.find(false, fn regex -> String.match?(shortcode, regex) end) + + !reject_emoji? + end) + |> Enum.map(&steal_emoji(&1)) + |> Enum.filter(& &1) + + if !Enum.empty?(new_emojis) do + Logger.info("Stole new emojis: #{inspect(new_emojis)}") + Pleroma.Emoji.reload() + end + end + + {:ok, message} + end + + def filter(message), do: {:ok, message} + + @impl true + def describe do + {:ok, %{}} + end +end diff --git a/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex b/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex index a927a4ed8..651aed70f 100644 --- a/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/user_allow_list_policy.ex @@ -24,7 +24,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.UserAllowListPolicy do allow_list = Config.get( - [:mrf_user_allowlist, String.to_atom(actor_info.host)], + [:mrf_user_allowlist, actor_info.host], [] ) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 549e5e761..bb6324460 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -9,17 +9,51 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do the system. """ + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.Web.ActivityPub.ObjectValidators.UndoValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.UpdateValidator @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()} def validate(object, meta) + def validate(%{"type" => "Block"} = block_activity, meta) do + with {:ok, block_activity} <- + block_activity + |> BlockValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + block_activity = stringify_keys(block_activity) + outgoing_blocks = Pleroma.Config.get([:activitypub, :outgoing_blocks]) + + meta = + if !outgoing_blocks do + Keyword.put(meta, :do_not_federate, true) + else + meta + end + + {:ok, block_activity, meta} + end + end + + def validate(%{"type" => "Update"} = update_activity, meta) do + with {:ok, update_activity} <- + update_activity + |> UpdateValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + update_activity = stringify_keys(update_activity) + {:ok, update_activity, meta} + end + end + def validate(%{"type" => "Undo"} = object, meta) do with {:ok, object} <- object @@ -42,8 +76,20 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do def validate(%{"type" => "Like"} = object, meta) do with {:ok, object} <- - object |> LikeValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do - object = stringify_keys(object |> Map.from_struct()) + object + |> LikeValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object) + {:ok, object, meta} + end + end + + def validate(%{"type" => "ChatMessage"} = object, meta) do + with {:ok, object} <- + object + |> ChatMessageValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object) {:ok, object, meta} end end @@ -58,26 +104,61 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do end end + def validate(%{"type" => "Create", "object" => object} = create_activity, meta) do + with {:ok, object_data} <- cast_and_apply(object), + meta = Keyword.put(meta, :object_data, object_data |> stringify_keys), + {:ok, create_activity} <- + create_activity + |> CreateChatMessageValidator.cast_and_validate(meta) + |> Ecto.Changeset.apply_action(:insert) do + create_activity = stringify_keys(create_activity) + {:ok, create_activity, meta} + end + end + + def validate(%{"type" => "Announce"} = object, meta) do + with {:ok, object} <- + object + |> AnnounceValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object |> Map.from_struct()) + {:ok, object, meta} + end + end + + def cast_and_apply(%{"type" => "ChatMessage"} = object) do + ChatMessageValidator.cast_and_apply(object) + end + + def cast_and_apply(o), do: {:error, {:validator_not_set, o}} + def stringify_keys(%{__struct__: _} = object) do object |> Map.from_struct() |> stringify_keys end - def stringify_keys(object) do + def stringify_keys(object) when is_map(object) do object - |> Map.new(fn {key, val} -> {to_string(key), val} end) + |> Map.new(fn {key, val} -> {to_string(key), stringify_keys(val)} end) end + def stringify_keys(object) when is_list(object) do + object + |> Enum.map(&stringify_keys/1) + end + + def stringify_keys(object), do: object + def fetch_actor(object) do - with {:ok, actor} <- Types.ObjectID.cast(object["actor"]) do + with {:ok, actor} <- ObjectValidators.ObjectID.cast(object["actor"]) do User.get_or_fetch_by_ap_id(actor) end end def fetch_actor_and_object(object) do fetch_actor(object) - Object.normalize(object["object"]) + Object.normalize(object["object"], true) :ok end end diff --git a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex new file mode 100644 index 000000000..6f757f49c --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex @@ -0,0 +1,101 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator do + use Ecto.Schema + + alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.ActivityPub.Visibility + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + require Pleroma.Constants + + @primary_key false + + embedded_schema do + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:type, :string) + field(:object, ObjectValidators.ObjectID) + field(:actor, ObjectValidators.ObjectID) + field(:context, :string, autogenerate: {Utils, :generate_context_id, []}) + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) + field(:published, ObjectValidators.DateTime) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + def changeset(struct, data) do + struct + |> cast(data, __schema__(:fields)) + |> fix_after_cast() + end + + def fix_after_cast(cng) do + cng + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["Announce"]) + |> validate_required([:id, :type, :object, :actor, :to, :cc]) + |> validate_actor_presence() + |> validate_object_presence() + |> validate_existing_announce() + |> validate_announcable() + end + + def validate_announcable(cng) do + with actor when is_binary(actor) <- get_field(cng, :actor), + object when is_binary(object) <- get_field(cng, :object), + %User{} = actor <- User.get_cached_by_ap_id(actor), + %Object{} = object <- Object.get_cached_by_ap_id(object), + false <- Visibility.is_public?(object) do + same_actor = object.data["actor"] == actor.ap_id + is_public = Pleroma.Constants.as_public() in (get_field(cng, :to) ++ get_field(cng, :cc)) + + cond do + same_actor && is_public -> + cng + |> add_error(:actor, "can not announce this object publicly") + + !same_actor -> + cng + |> add_error(:actor, "can not announce this object") + + true -> + cng + end + else + _ -> cng + end + end + + def validate_existing_announce(cng) do + actor = get_field(cng, :actor) + object = get_field(cng, :object) + + if actor && object && Utils.get_existing_announce(actor, %{data: %{"id" => object}}) do + cng + |> add_error(:actor, "already announced this object") + |> add_error(:object, "already announced by this actor") + else + cng + end + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex new file mode 100644 index 000000000..f53bb02be --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex @@ -0,0 +1,80 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do + use Ecto.Schema + + alias Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator + + import Ecto.Changeset + + @primary_key false + embedded_schema do + field(:type, :string) + field(:mediaType, :string, default: "application/octet-stream") + field(:name, :string) + + embeds_many(:url, UrlObjectValidator) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + def changeset(struct, data) do + data = + data + |> fix_media_type() + |> fix_url() + + struct + |> cast(data, [:type, :mediaType, :name]) + |> cast_embed(:url, required: true) + end + + def fix_media_type(data) do + data = + data + |> Map.put_new("mediaType", data["mimeType"]) + + if MIME.valid?(data["mediaType"]) do + data + else + data + |> Map.put("mediaType", "application/octet-stream") + end + end + + def fix_url(data) do + case data["url"] do + url when is_binary(url) -> + data + |> Map.put( + "url", + [ + %{ + "href" => url, + "type" => "Link", + "mediaType" => data["mediaType"] + } + ] + ) + + _ -> + data + end + end + + def validate_data(cng) do + cng + |> validate_required([:mediaType, :url, :type]) + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/block_validator.ex b/lib/pleroma/web/activity_pub/object_validators/block_validator.ex new file mode 100644 index 000000000..1dde77198 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/block_validator.ex @@ -0,0 +1,42 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator do + use Ecto.Schema + + alias Pleroma.EctoType.ActivityPub.ObjectValidators + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + @primary_key false + + embedded_schema do + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:type, :string) + field(:actor, ObjectValidators.ObjectID) + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) + field(:object, ObjectValidators.ObjectID) + end + + def cast_data(data) do + %__MODULE__{} + |> cast(data, __schema__(:fields)) + end + + def validate_data(cng) do + cng + |> validate_required([:id, :type, :actor, :to, :cc, :object]) + |> validate_inclusion(:type, ["Block"]) + |> validate_actor_presence() + |> validate_actor_presence(field_name: :object) + end + + def cast_and_validate(data) do + data + |> cast_data + |> validate_data + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex new file mode 100644 index 000000000..c481d79e0 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -0,0 +1,123 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do + use Ecto.Schema + + alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1] + + @primary_key false + @derive Jason.Encoder + + embedded_schema do + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:to, ObjectValidators.Recipients, default: []) + field(:type, :string) + field(:content, ObjectValidators.SafeText) + field(:actor, ObjectValidators.ObjectID) + field(:published, ObjectValidators.DateTime) + field(:emoji, :map, default: %{}) + + embeds_one(:attachment, AttachmentValidator) + end + + def cast_and_apply(data) do + data + |> cast_data + |> apply_action(:insert) + end + + def cast_and_validate(data) do + data + |> cast_data() + |> validate_data() + end + + def cast_data(data) do + %__MODULE__{} + |> changeset(data) + end + + def fix(data) do + data + |> fix_emoji() + |> fix_attachment() + |> Map.put_new("actor", data["attributedTo"]) + end + + # Throws everything but the first one away + def fix_attachment(%{"attachment" => [attachment | _]} = data) do + data + |> Map.put("attachment", attachment) + end + + def fix_attachment(data), do: data + + def changeset(struct, data) do + data = fix(data) + + struct + |> cast(data, List.delete(__schema__(:fields), :attachment)) + |> cast_embed(:attachment) + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["ChatMessage"]) + |> validate_required([:id, :actor, :to, :type, :published]) + |> validate_content_or_attachment() + |> validate_length(:to, is: 1) + |> validate_length(:content, max: Pleroma.Config.get([:instance, :remote_limit])) + |> validate_local_concern() + end + + def validate_content_or_attachment(cng) do + attachment = get_field(cng, :attachment) + + if attachment do + cng + else + cng + |> validate_required([:content]) + end + end + + @doc """ + Validates the following + - If both users are in our system + - If at least one of the users in this ChatMessage is a local user + - If the recipient is not blocking the actor + """ + def validate_local_concern(cng) do + with actor_ap <- get_field(cng, :actor), + {_, %User{} = actor} <- {:find_actor, User.get_cached_by_ap_id(actor_ap)}, + {_, %User{} = recipient} <- + {:find_recipient, User.get_cached_by_ap_id(get_field(cng, :to) |> hd())}, + {_, false} <- {:blocking_actor?, User.blocks?(recipient, actor)}, + {_, true} <- {:local?, Enum.any?([actor, recipient], & &1.local)} do + cng + else + {:blocking_actor?, true} -> + cng + |> add_error(:actor, "actor is blocked by recipient") + + {:local?, false} -> + cng + |> add_error(:actor, "actor and recipient are both remote") + + {:find_actor, _} -> + cng + |> add_error(:actor, "can't find user") + + {:find_recipient, _} -> + cng + |> add_error(:to, "can't find user") + end + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex new file mode 100644 index 000000000..7269f9ff0 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex @@ -0,0 +1,91 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +# NOTES +# - Can probably be a generic create validator +# - doesn't embed, will only get the object id +defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator do + use Ecto.Schema + alias Pleroma.EctoType.ActivityPub.ObjectValidators + + alias Pleroma.Object + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + @primary_key false + + embedded_schema do + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:actor, ObjectValidators.ObjectID) + field(:type, :string) + field(:to, ObjectValidators.Recipients, default: []) + field(:object, ObjectValidators.ObjectID) + end + + def cast_and_apply(data) do + data + |> cast_data + |> apply_action(:insert) + end + + def cast_data(data) do + cast(%__MODULE__{}, data, __schema__(:fields)) + end + + def cast_and_validate(data, meta \\ []) do + cast_data(data) + |> validate_data(meta) + end + + def validate_data(cng, meta \\ []) do + cng + |> validate_required([:id, :actor, :to, :type, :object]) + |> validate_inclusion(:type, ["Create"]) + |> validate_actor_presence() + |> validate_recipients_match(meta) + |> validate_actors_match(meta) + |> validate_object_nonexistence() + end + + def validate_object_nonexistence(cng) do + cng + |> validate_change(:object, fn :object, object_id -> + if Object.get_cached_by_ap_id(object_id) do + [{:object, "The object to create already exists"}] + else + [] + end + end) + end + + def validate_actors_match(cng, meta) do + object_actor = meta[:object_data]["actor"] + + cng + |> validate_change(:actor, fn :actor, actor -> + if actor == object_actor do + [] + else + [{:actor, "Actor doesn't match with object actor"}] + end + end) + end + + def validate_recipients_match(cng, meta) do + object_recipients = meta[:object_data]["to"] || [] + + cng + |> validate_change(:to, fn :to, recipients -> + activity_set = MapSet.new(recipients) + object_set = MapSet.new(object_recipients) + + if MapSet.equal?(activity_set, object_set) do + [] + else + [{:to, "Recipients don't match with object recipients"}] + end + end) + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/create_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_note_validator.ex similarity index 81% rename from lib/pleroma/web/activity_pub/object_validators/create_validator.ex rename to lib/pleroma/web/activity_pub/object_validators/create_note_validator.ex index 926804ce7..316bd0c07 100644 --- a/lib/pleroma/web/activity_pub/object_validators/create_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/create_note_validator.ex @@ -5,16 +5,16 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateNoteValidator do use Ecto.Schema + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset @primary_key false embedded_schema do - field(:id, Types.ObjectID, primary_key: true) - field(:actor, Types.ObjectID) + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:actor, ObjectValidators.ObjectID) field(:type, :string) field(:to, {:array, :string}) field(:cc, {:array, :string}) diff --git a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex index f42c03510..93a7b0e0b 100644 --- a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex @@ -6,8 +6,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator do use Ecto.Schema alias Pleroma.Activity + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.User - alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @@ -15,13 +15,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator do @primary_key false embedded_schema do - field(:id, Types.ObjectID, primary_key: true) + field(:id, ObjectValidators.ObjectID, primary_key: true) field(:type, :string) - field(:actor, Types.ObjectID) - field(:to, Types.Recipients, default: []) - field(:cc, Types.Recipients, default: []) - field(:deleted_activity_id, Types.ObjectID) - field(:object, Types.ObjectID) + field(:actor, ObjectValidators.ObjectID) + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) + field(:deleted_activity_id, ObjectValidators.ObjectID) + field(:object, ObjectValidators.ObjectID) end def cast_data(data) do @@ -46,12 +46,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator do Answer Article Audio + ChatMessage Event Note Page Question - Video Tombstone + Video } def validate_data(cng) do cng diff --git a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex index e87519c59..a543af1f8 100644 --- a/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/emoji_react_validator.ex @@ -5,8 +5,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do use Ecto.Schema + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object - alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @@ -14,10 +14,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator do @primary_key false embedded_schema do - field(:id, Types.ObjectID, primary_key: true) + field(:id, ObjectValidators.ObjectID, primary_key: true) field(:type, :string) - field(:object, Types.ObjectID) - field(:actor, Types.ObjectID) + field(:object, ObjectValidators.ObjectID) + field(:actor, ObjectValidators.ObjectID) field(:context, :string) field(:content, :string) field(:to, {:array, :string}, default: []) diff --git a/lib/pleroma/web/activity_pub/object_validators/like_validator.ex b/lib/pleroma/web/activity_pub/object_validators/like_validator.ex index 034f25492..493e4c247 100644 --- a/lib/pleroma/web/activity_pub/object_validators/like_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/like_validator.ex @@ -5,8 +5,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator do use Ecto.Schema + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.Object - alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.Web.ActivityPub.Utils import Ecto.Changeset @@ -15,13 +15,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator do @primary_key false embedded_schema do - field(:id, Types.ObjectID, primary_key: true) + field(:id, ObjectValidators.ObjectID, primary_key: true) field(:type, :string) - field(:object, Types.ObjectID) - field(:actor, Types.ObjectID) + field(:object, ObjectValidators.ObjectID) + field(:actor, ObjectValidators.ObjectID) field(:context, :string) - field(:to, Types.Recipients, default: []) - field(:cc, Types.Recipients, default: []) + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) end def cast_and_validate(data) do @@ -67,7 +67,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator do with {[], []} <- {to, cc}, %Object{data: %{"actor" => actor}} <- Object.get_cached_by_ap_id(object), - {:ok, actor} <- Types.ObjectID.cast(actor) do + {:ok, actor} <- ObjectValidators.ObjectID.cast(actor) do cng |> put_change(:to, [actor]) else diff --git a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex index 462a5620a..56b93dde8 100644 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex @@ -5,14 +5,14 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do use Ecto.Schema - alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.EctoType.ActivityPub.ObjectValidators import Ecto.Changeset @primary_key false embedded_schema do - field(:id, Types.ObjectID, primary_key: true) + field(:id, ObjectValidators.ObjectID, primary_key: true) field(:to, {:array, :string}, default: []) field(:cc, {:array, :string}, default: []) field(:bto, {:array, :string}, default: []) @@ -22,10 +22,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do field(:type, :string) field(:content, :string) field(:context, :string) - field(:actor, Types.ObjectID) - field(:attributedTo, Types.ObjectID) + field(:actor, ObjectValidators.ObjectID) + field(:attributedTo, ObjectValidators.ObjectID) field(:summary, :string) - field(:published, Types.DateTime) + field(:published, ObjectValidators.DateTime) # TODO: Write type field(:emoji, :map, default: %{}) field(:sensitive, :boolean, default: false) @@ -35,13 +35,12 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do field(:like_count, :integer, default: 0) field(:announcement_count, :integer, default: 0) field(:inRepyTo, :string) - field(:uri, Types.Uri) + field(:uri, ObjectValidators.Uri) field(:likes, {:array, :string}, default: []) field(:announcements, {:array, :string}, default: []) # see if needed - field(:conversation, :string) field(:context_id, :string) end diff --git a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex deleted file mode 100644 index 48fe61e1a..000000000 --- a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex +++ /dev/null @@ -1,34 +0,0 @@ -defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients do - use Ecto.Type - - alias Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID - - def type, do: {:array, ObjectID} - - def cast(object) when is_binary(object) do - cast([object]) - end - - def cast(data) when is_list(data) do - data - |> Enum.reduce({:ok, []}, fn element, acc -> - case {acc, ObjectID.cast(element)} do - {:error, _} -> :error - {_, :error} -> :error - {{:ok, list}, {:ok, id}} -> {:ok, [id | list]} - end - end) - end - - def cast(_) do - :error - end - - def dump(data) do - {:ok, data} - end - - def load(data) do - {:ok, data} - end -end diff --git a/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex b/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex index d0ba418e8..e8d2d39c1 100644 --- a/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/undo_validator.ex @@ -6,7 +6,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.UndoValidator do use Ecto.Schema alias Pleroma.Activity - alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.EctoType.ActivityPub.ObjectValidators import Ecto.Changeset import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @@ -14,10 +14,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.UndoValidator do @primary_key false embedded_schema do - field(:id, Types.ObjectID, primary_key: true) + field(:id, ObjectValidators.ObjectID, primary_key: true) field(:type, :string) - field(:object, Types.ObjectID) - field(:actor, Types.ObjectID) + field(:object, ObjectValidators.ObjectID) + field(:actor, ObjectValidators.ObjectID) field(:to, {:array, :string}, default: []) field(:cc, {:array, :string}, default: []) end diff --git a/lib/pleroma/web/activity_pub/object_validators/update_validator.ex b/lib/pleroma/web/activity_pub/object_validators/update_validator.ex new file mode 100644 index 000000000..b4ba5ede0 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/update_validator.ex @@ -0,0 +1,59 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.UpdateValidator do + use Ecto.Schema + + alias Pleroma.EctoType.ActivityPub.ObjectValidators + + import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + + @primary_key false + + embedded_schema do + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:type, :string) + field(:actor, ObjectValidators.ObjectID) + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) + # In this case, we save the full object in this activity instead of just a + # reference, so we can always see what was actually changed by this. + field(:object, :map) + end + + def cast_data(data) do + %__MODULE__{} + |> cast(data, __schema__(:fields)) + end + + def validate_data(cng) do + cng + |> validate_required([:id, :type, :actor, :to, :cc, :object]) + |> validate_inclusion(:type, ["Update"]) + |> validate_actor_presence() + |> validate_updating_rights() + end + + def cast_and_validate(data) do + data + |> cast_data + |> validate_data + end + + # For now we only support updating users, and here the rule is easy: + # object id == actor id + def validate_updating_rights(cng) do + with actor = get_field(cng, :actor), + object = get_field(cng, :object), + {:ok, object_id} <- ObjectValidators.ObjectID.cast(object), + true <- actor == object_id do + cng + else + _e -> + cng + |> add_error(:object, "Can't be updated by this actor") + end + end +end diff --git a/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex b/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex new file mode 100644 index 000000000..f64fac46d --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex @@ -0,0 +1,24 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator do + use Ecto.Schema + + alias Pleroma.EctoType.ActivityPub.ObjectValidators + + import Ecto.Changeset + @primary_key false + + embedded_schema do + field(:type, :string) + field(:href, ObjectValidators.Uri) + field(:mediaType, :string) + end + + def changeset(struct, data) do + struct + |> cast(data, __schema__(:fields)) + |> validate_required([:type, :href, :mediaType]) + end +end diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 657cdfdb1..6875c47f6 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do alias Pleroma.Activity + alias Pleroma.Config alias Pleroma.Object alias Pleroma.Repo alias Pleroma.Web.ActivityPub.ActivityPub @@ -16,6 +17,10 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do {:ok, Activity.t() | Object.t(), keyword()} | {:error, any()} def common_pipeline(object, meta) do case Repo.transaction(fn -> do_common_pipeline(object, meta) end) do + {:ok, {:ok, activity, meta}} -> + SideEffects.handle_after_transaction(meta) + {:ok, activity, meta} + {:ok, value} -> value @@ -44,7 +49,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do defp maybe_federate(%Activity{} = activity, meta) do with {:ok, local} <- Keyword.fetch(meta, :local) do - do_not_federate = meta[:do_not_federate] + do_not_federate = meta[:do_not_federate] || !Config.get([:instance, :federating]) if !do_not_federate && local do Federator.publish(activity) diff --git a/lib/pleroma/web/activity_pub/relay.ex b/lib/pleroma/web/activity_pub/relay.ex index 729c23af7..484178edd 100644 --- a/lib/pleroma/web/activity_pub/relay.ex +++ b/lib/pleroma/web/activity_pub/relay.ex @@ -4,9 +4,10 @@ defmodule Pleroma.Web.ActivityPub.Relay do alias Pleroma.Activity - alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Web.CommonAPI require Logger @relay_nickname "relay" @@ -48,11 +49,11 @@ defmodule Pleroma.Web.ActivityPub.Relay do end end - @spec publish(any()) :: {:ok, Activity.t(), Object.t()} | {:error, any()} + @spec publish(any()) :: {:ok, Activity.t()} | {:error, any()} def publish(%Activity{data: %{"type" => "Create"}} = activity) do with %User{} = user <- get_actor(), - %Object{} = object <- Object.normalize(activity) do - ActivityPub.announce(user, object, nil, true, false) + true <- Visibility.is_public?(activity) do + CommonAPI.repeat(activity.id, user) else error -> format_error(error) end diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index bfc2ab845..61feeae4d 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -6,15 +6,56 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do collection, and so on. """ alias Pleroma.Activity + alias Pleroma.Activity.Ir.Topics + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.Push + alias Pleroma.Web.Streamer def handle(object, meta \\ []) + # Tasks this handles: + # - Unfollow and block + def handle( + %{data: %{"type" => "Block", "object" => blocked_user, "actor" => blocking_user}} = + object, + meta + ) do + with %User{} = blocker <- User.get_cached_by_ap_id(blocking_user), + %User{} = blocked <- User.get_cached_by_ap_id(blocked_user) do + User.block(blocker, blocked) + end + + {:ok, object, meta} + end + + # Tasks this handles: + # - Update the user + # + # For a local user, we also get a changeset with the full information, so we + # can update non-federating, non-activitypub settings as well. + def handle(%{data: %{"type" => "Update", "object" => updated_object}} = object, meta) do + if changeset = Keyword.get(meta, :user_update_changeset) do + changeset + |> User.update_and_set_cache() + else + {:ok, new_user_data} = ActivityPub.user_data_from_user_object(updated_object) + + User.get_by_ap_id(updated_object["id"]) + |> User.remote_user_changeset(new_user_data) + |> User.update_and_set_cache() + end + + {:ok, object, meta} + end + # Tasks this handles: # - Add like to object # - Set up notification @@ -27,6 +68,45 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do {:ok, object, meta} end + # Tasks this handles + # - Actually create object + # - Rollback if we couldn't create it + # - Set up notifications + def handle(%{data: %{"type" => "Create"}} = activity, meta) do + with {:ok, _object, meta} <- handle_object_creation(meta[:object_data], meta) do + {:ok, notifications} = Notification.create_notifications(activity, do_send: false) + + meta = + meta + |> add_notifications(notifications) + + {:ok, activity, meta} + else + e -> Repo.rollback(e) + end + end + + # Tasks this handles: + # - Add announce to object + # - Set up notification + # - Stream out the announce + def handle(%{data: %{"type" => "Announce"}} = object, meta) do + announced_object = Object.get_by_ap_id(object.data["object"]) + user = User.get_cached_by_ap_id(object.data["actor"]) + + Utils.add_announce_to_object(object, announced_object) + + if !User.is_internal_user?(user) do + Notification.create_notifications(object) + + object + |> Topics.get_activity_topics() + |> Streamer.stream(object) + end + + {:ok, object, meta} + end + def handle(%{data: %{"type" => "Undo", "object" => undone_object}} = object, meta) do with undone_object <- Activity.get_by_ap_id(undone_object), :ok <- handle_undoing(undone_object) do @@ -70,6 +150,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do Object.decrease_replies_count(in_reply_to) end + MessageReference.delete_for_object(deleted_object) + ActivityPub.stream_out(object) ActivityPub.stream_out_participations(deleted_object, user) :ok @@ -94,6 +176,39 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do {:ok, object, meta} end + def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do + with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do + actor = User.get_cached_by_ap_id(object.data["actor"]) + recipient = User.get_cached_by_ap_id(hd(object.data["to"])) + + streamables = + [[actor, recipient], [recipient, actor]] + |> Enum.map(fn [user, other_user] -> + if user.local do + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + {:ok, cm_ref} = MessageReference.create(chat, object, user.ap_id != actor.ap_id) + + { + ["user", "user:pleroma_chat"], + {user, %{cm_ref | chat: chat, object: object}} + } + end + end) + |> Enum.filter(& &1) + + meta = + meta + |> add_streamables(streamables) + + {:ok, object, meta} + end + end + + # Nothing to do + def handle_object_creation(object) do + {:ok, object} + end + def handle_undoing(%{data: %{"type" => "Like"}} = object) do with %Object{} = liked_object <- Object.get_by_ap_id(object.data["object"]), {:ok, _} <- Utils.remove_like_from_object(object, liked_object), @@ -130,4 +245,43 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do end def handle_undoing(object), do: {:error, ["don't know how to handle", object]} + + defp send_notifications(meta) do + Keyword.get(meta, :notifications, []) + |> Enum.each(fn notification -> + Streamer.stream(["user", "user:notification"], notification) + Push.send(notification) + end) + + meta + end + + defp send_streamables(meta) do + Keyword.get(meta, :streamables, []) + |> Enum.each(fn {topics, items} -> + Streamer.stream(topics, items) + end) + + meta + end + + defp add_streamables(meta, streamables) do + existing = Keyword.get(meta, :streamables, []) + + meta + |> Keyword.put(:streamables, streamables ++ existing) + end + + defp add_notifications(meta, notifications) do + existing = Keyword.get(meta, :notifications, []) + + meta + |> Keyword.put(:notifications, notifications ++ existing) + end + + def handle_after_transaction(meta) do + meta + |> send_notifications() + |> send_streamables() + end end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 80701bb63..bc6fc4bd8 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -8,7 +8,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do """ alias Pleroma.Activity alias Pleroma.EarmarkRenderer + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.FollowingRelationship + alias Pleroma.Maps + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Object.Containment alias Pleroma.Repo @@ -16,7 +19,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.ObjectValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility @@ -170,8 +172,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do object |> Map.put("inReplyTo", replied_object.data["id"]) |> Map.put("inReplyToAtomUri", object["inReplyToAtomUri"] || in_reply_to_id) - |> Map.put("conversation", replied_object.data["context"] || object["conversation"]) |> Map.put("context", replied_object.data["context"] || object["conversation"]) + |> Map.drop(["conversation"]) else e -> Logger.error("Couldn't fetch #{inspect(in_reply_to_id)}, error: #{inspect(e)}") @@ -205,13 +207,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do object |> Map.put("context", context) - |> Map.put("conversation", context) - end - - defp add_if_present(map, _key, nil), do: map - - defp add_if_present(map, key, value) do - Map.put(map, key, value) + |> Map.drop(["conversation"]) end def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachment) do @@ -226,9 +222,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do media_type = cond do - is_map(url) && is_binary(url["mediaType"]) -> url["mediaType"] - is_binary(data["mediaType"]) -> data["mediaType"] - is_binary(data["mimeType"]) -> data["mimeType"] + is_map(url) && MIME.valid?(url["mediaType"]) -> url["mediaType"] + MIME.valid?(data["mediaType"]) -> data["mediaType"] + MIME.valid?(data["mimeType"]) -> data["mimeType"] true -> nil end @@ -241,13 +237,13 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do attachment_url = %{"href" => href} - |> add_if_present("mediaType", media_type) - |> add_if_present("type", Map.get(url || %{}, "type")) + |> Maps.put_if_present("mediaType", media_type) + |> Maps.put_if_present("type", Map.get(url || %{}, "type")) %{"url" => [attachment_url]} - |> add_if_present("mediaType", media_type) - |> add_if_present("type", data["type"]) - |> add_if_present("name", data["name"]) + |> Maps.put_if_present("mediaType", media_type) + |> Maps.put_if_present("type", data["type"]) + |> Maps.put_if_present("name", data["name"]) end) Map.put(object, "attachment", attachments) @@ -450,19 +446,16 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do when objtype in ["Article", "Event", "Note", "Video", "Page", "Question", "Answer", "Audio"] do actor = Containment.get_actor(data) - data = - Map.put(data, "actor", actor) - |> fix_addressing - with nil <- Activity.get_create_by_object_ap_id(object["id"]), - {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(data["actor"]) do + {:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(actor), + data <- Map.put(data, "actor", actor) |> fix_addressing() do object = fix_object(object, options) params = %{ to: data["to"], object: object, actor: user, - context: object["conversation"], + context: object["context"], local: false, published: data["published"], additional: @@ -532,7 +525,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do User.get_cached_by_ap_id(Containment.get_actor(%{"actor" => followed})), {:ok, %User{} = follower} <- User.get_or_fetch_by_ap_id(Containment.get_actor(%{"actor" => follower})), - {:ok, activity} <- ActivityPub.follow(follower, followed, id, false) do + {:ok, activity} <- + ActivityPub.follow(follower, followed, id, false, skip_notify_and_stream: true) do with deny_follow_blocked <- Pleroma.Config.get([:user, :deny_follow_blocked]), {_, false} <- {:user_blocked, User.blocks?(followed, follower) && deny_follow_blocked}, {_, false} <- {:user_locked, User.locked?(followed)}, @@ -575,6 +569,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do :noop end + ActivityPub.notify_and_stream(activity) {:ok, activity} else _e -> @@ -595,6 +590,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do User.update_follower_count(followed) User.update_following_count(follower) + Notification.update_notification_type(followed, follow_activity) + ActivityPub.accept(%{ to: follow_activity.data["to"], type: "Accept", @@ -662,61 +659,35 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do |> handle_incoming(options) end - def handle_incoming(%{"type" => type} = data, _options) when type in ["Like", "EmojiReact"] do - with :ok <- ObjectValidator.fetch_actor_and_object(data), - {:ok, activity, _meta} <- - Pipeline.common_pipeline(data, local: false) do + def handle_incoming( + %{"type" => "Create", "object" => %{"type" => "ChatMessage"}} = data, + _options + ) do + with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), + {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} - else - e -> {:error, e} end end - def handle_incoming( - %{"type" => "Announce", "object" => object_id, "actor" => _actor, "id" => id} = data, - _options - ) do - with actor <- Containment.get_actor(data), - {:ok, %User{} = actor} <- User.get_or_fetch_by_ap_id(actor), - {:ok, object} <- get_embedded_obj_helper(object_id, actor), - public <- Visibility.is_public?(data), - {:ok, activity, _object} <- ActivityPub.announce(actor, object, id, false, public) do + def handle_incoming(%{"type" => type} = data, _options) + when type in ~w{Like EmojiReact Announce} do + with :ok <- ObjectValidator.fetch_actor_and_object(data), + {:ok, activity, _meta} <- + Pipeline.common_pipeline(data, local: false) do {:ok, activity} else - _e -> :error + e -> {:error, e} end end def handle_incoming( - %{"type" => "Update", "object" => %{"type" => object_type} = object, "actor" => actor_id} = - data, + %{"type" => type} = data, _options ) - when object_type in [ - "Person", - "Application", - "Service", - "Organization" - ] 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) - - actor - |> User.remote_user_changeset(new_user_data) - |> User.update_and_set_cache() - - ActivityPub.update(%{ - local: false, - to: data["to"] || [], - cc: data["cc"] || [], - object: object, - actor: actor_id, - activity_id: data["id"] - }) - else - e -> - Logger.error(e) - :error + when type in ~w{Update Block} do + with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), + {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do + {:ok, activity} end end @@ -729,7 +700,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do else {:error, {:validate_object, _}} = e -> # Check if we have a create activity for this - with {:ok, object_id} <- Types.ObjectID.cast(data["object"]), + with {:ok, object_id} <- ObjectValidators.ObjectID.cast(data["object"]), %Activity{data: %{"actor" => actor}} <- Activity.create_by_object_ap_id(object_id) |> Repo.one(), # We have one, insert a tombstone and retry @@ -792,21 +763,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do end end - def handle_incoming( - %{"type" => "Block", "object" => blocked, "actor" => blocker, "id" => id} = _data, - _options - ) do - with %User{local: true} = blocked = User.get_cached_by_ap_id(blocked), - {:ok, %User{} = blocker} = User.get_or_fetch_by_ap_id(blocker), - {:ok, activity} <- ActivityPub.block(blocker, blocked, id, false) do - User.unfollow(blocker, blocked) - User.block(blocker, blocked) - {:ok, activity} - else - _e -> :error - end - end - def handle_incoming( %{ "type" => "Move", @@ -1059,10 +1015,14 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do Map.put(object, "tag", tags) end + # TODO These should be added on our side on insertion, it doesn't make much + # sense to regenerate these all the time def add_mention_tags(object) do - {enabled_receivers, disabled_receivers} = Utils.get_notified_from_object(object) - potential_receivers = enabled_receivers ++ disabled_receivers - mentions = Enum.map(potential_receivers, &build_mention_tag/1) + to = object["to"] || [] + cc = object["cc"] || [] + mentioned = User.get_users_from_set(to ++ cc, local_only: false) + + mentions = Enum.map(mentioned, &build_mention_tag/1) tags = object["tag"] || [] Map.put(object, "tag", tags ++ mentions) @@ -1123,6 +1083,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do Map.put(object, "attributedTo", attributed_to) end + # TODO: Revisit this + def prepare_attachments(%{"type" => "ChatMessage"} = object), do: object + def prepare_attachments(object) do attachments = object diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index f2375bcc4..dfae602df 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do alias Ecto.UUID alias Pleroma.Activity alias Pleroma.Config + alias Pleroma.Maps alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -244,7 +245,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do Inserts a full object if it is contained in an activity. """ def insert_full_object(%{"object" => %{"type" => type} = object_data} = map) - when is_map(object_data) and type in @supported_object_types do + when type in @supported_object_types do with {:ok, object} <- Object.create(object_data) do map = Map.put(map, "object", object.data["id"]) @@ -307,7 +308,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do "cc" => cc, "context" => object.data["context"] } - |> maybe_put("id", activity_id) + |> Maps.put_if_present("id", activity_id) end def make_emoji_reaction_data(user, object, emoji, activity_id) do @@ -477,7 +478,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do "object" => followed_id, "state" => "pending" } - |> maybe_put("id", activity_id) + |> Maps.put_if_present("id", activity_id) end def fetch_latest_follow(%User{ap_id: follower_id}, %User{ap_id: followed_id}) do @@ -546,7 +547,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do "cc" => [], "context" => object.data["context"] } - |> maybe_put("id", activity_id) + |> Maps.put_if_present("id", activity_id) end def make_announce_data( @@ -563,7 +564,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do "cc" => [Pleroma.Constants.as_public()], "context" => object.data["context"] } - |> maybe_put("id", activity_id) + |> Maps.put_if_present("id", activity_id) end def make_undo_data( @@ -582,7 +583,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do "cc" => [Pleroma.Constants.as_public()], "context" => context } - |> maybe_put("id", activity_id) + |> Maps.put_if_present("id", activity_id) end @spec add_announce_to_object(Activity.t(), Object.t()) :: @@ -627,7 +628,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do "to" => [followed.ap_id], "object" => follow_activity.data } - |> maybe_put("id", activity_id) + |> Maps.put_if_present("id", activity_id) end #### Block-related helpers @@ -650,7 +651,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do "to" => [blocked.ap_id], "object" => blocked.ap_id } - |> maybe_put("id", activity_id) + |> Maps.put_if_present("id", activity_id) end #### Create-related helpers @@ -740,12 +741,12 @@ defmodule Pleroma.Web.ActivityPub.Utils do def get_reports(params, page, page_size) do params = params - |> Map.put("type", "Flag") - |> Map.put("skip_preload", true) - |> Map.put("preload_report_notes", true) - |> Map.put("total", true) - |> Map.put("limit", page_size) - |> Map.put("offset", (page - 1) * page_size) + |> Map.put(:type, "Flag") + |> Map.put(:skip_preload, true) + |> Map.put(:preload_report_notes, true) + |> Map.put(:total, true) + |> Map.put(:limit, page_size) + |> Map.put(:offset, (page - 1) * page_size) ActivityPub.fetch_activities([], params, :offset) end @@ -870,7 +871,4 @@ defmodule Pleroma.Web.ActivityPub.Utils do |> where([a, object: o], fragment("(?)->>'type' = 'Answer'", o.data)) |> Repo.all() end - - def maybe_put(map, _key, nil), do: map - def maybe_put(map, key, value), do: Map.put(map, key, value) end diff --git a/lib/pleroma/web/activity_pub/views/user_view.ex b/lib/pleroma/web/activity_pub/views/user_view.ex index 34590b16d..4a02b09a1 100644 --- a/lib/pleroma/web/activity_pub/views/user_view.ex +++ b/lib/pleroma/web/activity_pub/views/user_view.ex @@ -213,34 +213,24 @@ defmodule Pleroma.Web.ActivityPub.UserView do |> Map.merge(Utils.make_json_ld_header()) end - def render("activity_collection_page.json", %{activities: activities, iri: iri}) do - # this is sorted chronologically, so first activity is the newest (max) - {max_id, min_id, collection} = - if length(activities) > 0 do - { - Enum.at(activities, 0).id, - Enum.at(Enum.reverse(activities), 0).id, - Enum.map(activities, fn act -> - {:ok, data} = Transmogrifier.prepare_outgoing(act.data) - data - end) - } - else - { - 0, - 0, - [] - } - end + def render("activity_collection_page.json", %{ + activities: activities, + iri: iri, + pagination: pagination + }) do + collection = + Enum.map(activities, fn activity -> + {:ok, data} = Transmogrifier.prepare_outgoing(activity.data) + data + end) %{ - "id" => "#{iri}?max_id=#{max_id}&page=true", "type" => "OrderedCollectionPage", "partOf" => iri, - "orderedItems" => collection, - "next" => "#{iri}?max_id=#{min_id}&page=true" + "orderedItems" => collection } |> Map.merge(Utils.make_json_ld_header()) + |> Map.merge(pagination) end defp maybe_put_total_items(map, false, _total), do: map diff --git a/lib/pleroma/web/activity_pub/visibility.ex b/lib/pleroma/web/activity_pub/visibility.ex index 453a6842e..343f41caa 100644 --- a/lib/pleroma/web/activity_pub/visibility.ex +++ b/lib/pleroma/web/activity_pub/visibility.ex @@ -47,6 +47,10 @@ defmodule Pleroma.Web.ActivityPub.Visibility do @spec visible_for_user?(Activity.t(), User.t() | nil) :: boolean() def visible_for_user?(%{actor: ap_id}, %User{ap_id: ap_id}), do: true + def visible_for_user?(nil, _), do: false + + def visible_for_user?(%{data: %{"listMessage" => _}}, nil), do: false + def visible_for_user?(%{data: %{"listMessage" => list_ap_id}} = activity, %User{} = user) do user.ap_id in activity.data["to"] || list_ap_id @@ -54,8 +58,6 @@ defmodule Pleroma.Web.ActivityPub.Visibility do |> Pleroma.List.member?(user) end - def visible_for_user?(%{data: %{"listMessage" => _}}, nil), do: false - def visible_for_user?(%{local: local} = activity, nil) do cfg_key = if local, diff --git a/lib/pleroma/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex similarity index 51% rename from lib/pleroma/web/admin_api/admin_api_controller.ex rename to lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 647ceb3ba..f9545d895 100644 --- a/lib/pleroma/web/admin_api/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -7,38 +7,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do import Pleroma.Web.ControllerHelper, only: [json_response: 3] - alias Pleroma.Activity alias Pleroma.Config - alias Pleroma.ConfigDB alias Pleroma.MFA alias Pleroma.ModerationLog alias Pleroma.Plugs.OAuthScopesPlug - alias Pleroma.ReportNote alias Pleroma.Stats alias Pleroma.User - alias Pleroma.UserInviteToken alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.Pipeline - alias Pleroma.Web.ActivityPub.Relay - alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.AdminAPI alias Pleroma.Web.AdminAPI.AccountView - alias Pleroma.Web.AdminAPI.ConfigView alias Pleroma.Web.AdminAPI.ModerationLogView - alias Pleroma.Web.AdminAPI.Report - alias Pleroma.Web.AdminAPI.ReportView alias Pleroma.Web.AdminAPI.Search - alias Pleroma.Web.CommonAPI alias Pleroma.Web.Endpoint - alias Pleroma.Web.MastodonAPI - alias Pleroma.Web.MastodonAPI.AppView - alias Pleroma.Web.OAuth.App alias Pleroma.Web.Router require Logger - @descriptions Pleroma.Docs.JSON.compile() @users_page_size 50 plug( @@ -69,53 +55,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do ] ) - plug(OAuthScopesPlug, %{scopes: ["read:invites"], admin: true} when action == :invites) - - plug( - OAuthScopesPlug, - %{scopes: ["write:invites"], admin: true} - when action in [:create_invite_token, :revoke_invite, :email_invite] - ) - plug( OAuthScopesPlug, %{scopes: ["write:follows"], admin: true} - when action in [:user_follow, :user_unfollow, :relay_follow, :relay_unfollow] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["read:reports"], admin: true} - when action in [:list_reports, :report_show] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:reports"], admin: true} - when action in [:reports_update, :report_notes_create, :report_notes_delete] + when action in [:user_follow, :user_unfollow] ) plug( OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} - when action in [:list_statuses, :list_user_statuses, :list_instance_statuses, :status_show] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:statuses"], admin: true} - when action in [:status_update, :status_delete] + when action in [:list_user_statuses, :list_instance_statuses] ) plug( OAuthScopesPlug, %{scopes: ["read"], admin: true} when action in [ - :config_show, :list_log, :stats, - :relay_list, - :config_descriptions, :need_reboot ] ) @@ -125,18 +82,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do %{scopes: ["write"], admin: true} when action in [ :restart, - :config_update, :resend_confirmation_email, :confirm_email, - :oauth_app_create, - :oauth_app_list, - :oauth_app_update, - :oauth_app_delete, :reload_emoji ] ) - action_fallback(:errors) + action_fallback(AdminAPI.FallbackController) def user_delete(conn, %{"nickname" => nickname}) do user_delete(conn, %{"nicknames" => [nickname]}) @@ -159,8 +111,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do action: "delete" }) - conn - |> json(nicknames) + json(conn, nicknames) end def user_follow(%{assigns: %{user: admin}} = conn, %{ @@ -179,8 +130,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do }) end - conn - |> json("ok") + json(conn, "ok") end def user_unfollow(%{assigns: %{user: admin}} = conn, %{ @@ -199,8 +149,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do }) end - conn - |> json("ok") + json(conn, "ok") end def users_create(%{assigns: %{user: admin}} = conn, %{"users" => users}) do @@ -239,8 +188,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do action: "create" }) - conn - |> json(res) + json(conn, res) {:error, id, changeset, _} -> res = @@ -274,10 +222,10 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do activities = ActivityPub.fetch_statuses(nil, %{ - "instance" => instance, - "limit" => page_size, - "offset" => (page - 1) * page_size, - "exclude_reblogs" => !with_reblogs && "true" + instance: instance, + limit: page_size, + offset: (page - 1) * page_size, + exclude_reblogs: not with_reblogs }) conn @@ -294,13 +242,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do activities = ActivityPub.fetch_user_activities(user, nil, %{ - "limit" => page_size, - "godmode" => godmode, - "exclude_reblogs" => !with_reblogs && "true" + limit: page_size, + godmode: godmode, + exclude_reblogs: not with_reblogs }) conn - |> put_view(MastodonAPI.StatusView) + |> put_view(AdminAPI.StatusView) |> render("index.json", %{activities: activities, as: :activity}) else _ -> {:error, :not_found} @@ -411,8 +359,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do filters |> String.split(",") |> Enum.filter(&Enum.member?(@filters, &1)) - |> Enum.map(&String.to_atom(&1)) - |> Enum.into(%{}, &{&1, true}) + |> Enum.map(&String.to_atom/1) + |> Map.new(&{&1, true}) end def right_add_multiple(%{assigns: %{user: admin}} = conn, %{ @@ -537,119 +485,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do render_error(conn, :forbidden, "You can't revoke your own admin status.") end - def relay_list(conn, _params) do - with {:ok, list} <- Relay.list() do - json(conn, %{relays: list}) - else - _ -> - conn - |> put_status(500) - end - end - - def relay_follow(%{assigns: %{user: admin}} = conn, %{"relay_url" => target}) do - with {:ok, _message} <- Relay.follow(target) do - ModerationLog.insert_log(%{ - action: "relay_follow", - actor: admin, - target: target - }) - - json(conn, target) - else - _ -> - conn - |> put_status(500) - |> json(target) - end - end - - def relay_unfollow(%{assigns: %{user: admin}} = conn, %{"relay_url" => target}) do - with {:ok, _message} <- Relay.unfollow(target) do - ModerationLog.insert_log(%{ - action: "relay_unfollow", - actor: admin, - target: target - }) - - json(conn, target) - else - _ -> - conn - |> put_status(500) - |> json(target) - end - end - - @doc "Sends registration invite via email" - def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do - with {_, false} <- {:registrations_open, Config.get([:instance, :registrations_open])}, - {_, true} <- {:invites_enabled, Config.get([:instance, :invites_enabled])}, - {:ok, invite_token} <- UserInviteToken.create_invite(), - email <- - Pleroma.Emails.UserEmail.user_invitation_email( - user, - invite_token, - email, - params["name"] - ), - {:ok, _} <- Pleroma.Emails.Mailer.deliver(email) do - json_response(conn, :no_content, "") - else - {:registrations_open, _} -> - errors( - conn, - {:error, "To send invites you need to set the `registrations_open` option to false."} - ) - - {:invites_enabled, _} -> - errors( - conn, - {:error, "To send invites you need to set the `invites_enabled` option to true."} - ) - end - end - - @doc "Create an account registration invite token" - def create_invite_token(conn, params) do - opts = %{} - - opts = - if params["max_use"], - do: Map.put(opts, :max_use, params["max_use"]), - else: opts - - opts = - if params["expires_at"], - do: Map.put(opts, :expires_at, params["expires_at"]), - else: opts - - {:ok, invite} = UserInviteToken.create_invite(opts) - - json(conn, AccountView.render("invite.json", %{invite: invite})) - end - - @doc "Get list of created invites" - def invites(conn, _params) do - invites = UserInviteToken.list_invites() - - conn - |> put_view(AccountView) - |> render("invites.json", %{invites: invites}) - end - - @doc "Revokes invite by token" - def revoke_invite(conn, %{"token" => token}) do - with {:ok, invite} <- UserInviteToken.find_by_token(token), - {:ok, updated_invite} = UserInviteToken.update_invite(invite, %{used: true}) do - conn - |> put_view(AccountView) - |> render("invite.json", %{invite: updated_invite}) - else - nil -> {:error, :not_found} - end - end - @doc "Get a password reset token (base64 string) for given nickname" def get_password_reset(conn, %{"nickname" => nickname}) do (%User{local: true} = user) = User.get_cached_by_nickname(nickname) @@ -705,7 +540,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do %{assigns: %{user: admin}} = conn, %{"nickname" => nickname} = params ) do - with {_, user} <- {:user, User.get_cached_by_nickname(nickname)}, + with {_, %User{} = user} <- {:user, User.get_cached_by_nickname(nickname)}, {:ok, _user} <- User.update_as_admin(user, params) do ModerationLog.insert_log(%{ @@ -727,155 +562,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do json(conn, %{status: "success"}) else {:error, changeset} -> - {_, {error, _}} = Enum.at(changeset.errors, 0) - json(conn, %{error: "New password #{error}."}) - - _ -> - json(conn, %{error: "Unable to change password."}) - end - end - - def list_reports(conn, params) do - {page, page_size} = page_params(params) - - reports = Utils.get_reports(params, page, page_size) - - conn - |> put_view(ReportView) - |> render("index.json", %{reports: reports}) - end - - def report_show(conn, %{"id" => id}) do - with %Activity{} = report <- Activity.get_by_id(id) do - conn - |> put_view(ReportView) - |> render("show.json", Report.extract_report_info(report)) - else - _ -> {:error, :not_found} - end - end - - def reports_update(%{assigns: %{user: admin}} = conn, %{"reports" => reports}) do - result = - reports - |> Enum.map(fn report -> - with {:ok, activity} <- CommonAPI.update_report_state(report["id"], report["state"]) do - ModerationLog.insert_log(%{ - action: "report_update", - actor: admin, - subject: activity - }) - - activity - else - {:error, message} -> %{id: report["id"], error: message} - end - end) - - case Enum.any?(result, &Map.has_key?(&1, :error)) do - true -> json_response(conn, :bad_request, result) - false -> json_response(conn, :no_content, "") - end - end - - def report_notes_create(%{assigns: %{user: user}} = conn, %{ - "id" => report_id, - "content" => content - }) do - with {:ok, _} <- ReportNote.create(user.id, report_id, content) do - ModerationLog.insert_log(%{ - action: "report_note", - actor: user, - subject: Activity.get_by_id(report_id), - text: content - }) - - json_response(conn, :no_content, "") - else - _ -> json_response(conn, :bad_request, "") - end - end - - def report_notes_delete(%{assigns: %{user: user}} = conn, %{ - "id" => note_id, - "report_id" => report_id - }) do - with {:ok, note} <- ReportNote.destroy(note_id) do - ModerationLog.insert_log(%{ - action: "report_note_delete", - actor: user, - subject: Activity.get_by_id(report_id), - text: note.content - }) - - json_response(conn, :no_content, "") - else - _ -> json_response(conn, :bad_request, "") - end - end - - def list_statuses(%{assigns: %{user: _admin}} = conn, params) do - godmode = params["godmode"] == "true" || params["godmode"] == true - local_only = params["local_only"] == "true" || params["local_only"] == true - with_reblogs = params["with_reblogs"] == "true" || params["with_reblogs"] == true - {page, page_size} = page_params(params) - - activities = - ActivityPub.fetch_statuses(nil, %{ - "godmode" => godmode, - "local_only" => local_only, - "limit" => page_size, - "offset" => (page - 1) * page_size, - "exclude_reblogs" => !with_reblogs && "true" - }) - - conn - |> put_view(AdminAPI.StatusView) - |> render("index.json", %{activities: activities, as: :activity}) - end - - def status_show(conn, %{"id" => id}) do - with %Activity{} = activity <- Activity.get_by_id(id) do - conn - |> put_view(MastodonAPI.StatusView) - |> render("show.json", %{activity: activity}) - else - _ -> errors(conn, {:error, :not_found}) - end - end - - def status_update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do - params = - params - |> Map.take(["sensitive", "visibility"]) - |> Map.new(fn {key, value} -> {String.to_existing_atom(key), value} end) - - with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do - {:ok, sensitive} = Ecto.Type.cast(:boolean, params[:sensitive]) - - ModerationLog.insert_log(%{ - action: "status_update", - actor: admin, - subject: activity, - sensitive: sensitive, - visibility: params[:visibility] - }) + errors = Map.new(changeset.errors, fn {key, {error, _}} -> {key, error} end) - conn - |> put_view(MastodonAPI.StatusView) - |> render("show.json", %{activity: activity}) - end - end - - def status_delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do - with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do - ModerationLog.insert_log(%{ - action: "status_delete", - actor: user, - subject_id: id - }) + {:errors, errors} - json(conn, %{}) + _ -> + {:error, :not_found} end end @@ -897,107 +589,8 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do |> render("index.json", %{log: log}) end - def config_descriptions(conn, _params) do - descriptions = Enum.filter(@descriptions, &whitelisted_config?/1) - - json(conn, descriptions) - end - - def config_show(conn, %{"only_db" => true}) do - with :ok <- configurable_from_database(conn) do - configs = Pleroma.Repo.all(ConfigDB) - - conn - |> put_view(ConfigView) - |> render("index.json", %{configs: configs}) - end - end - - def config_show(conn, _params) do - with :ok <- configurable_from_database(conn) do - configs = ConfigDB.get_all_as_keyword() - - merged = - Config.Holder.default_config() - |> ConfigDB.merge(configs) - |> Enum.map(fn {group, values} -> - Enum.map(values, fn {key, value} -> - db = - if configs[group][key] do - ConfigDB.get_db_keys(configs[group][key], key) - end - - db_value = configs[group][key] - - merged_value = - if !is_nil(db_value) and Keyword.keyword?(db_value) and - ConfigDB.sub_key_full_update?(group, key, Keyword.keys(db_value)) do - ConfigDB.merge_group(group, key, value, db_value) - else - value - end - - setting = %{ - group: ConfigDB.convert(group), - key: ConfigDB.convert(key), - value: ConfigDB.convert(merged_value) - } - - if db, do: Map.put(setting, :db, db), else: setting - end) - end) - |> List.flatten() - - json(conn, %{configs: merged, need_reboot: Restarter.Pleroma.need_reboot?()}) - end - end - - def config_update(conn, %{"configs" => configs}) do - with :ok <- configurable_from_database(conn) do - {_errors, results} = - configs - |> Enum.filter(&whitelisted_config?/1) - |> Enum.map(fn - %{"group" => group, "key" => key, "delete" => true} = params -> - ConfigDB.delete(%{group: group, key: key, subkeys: params["subkeys"]}) - - %{"group" => group, "key" => key, "value" => value} -> - ConfigDB.update_or_create(%{group: group, key: key, value: value}) - end) - |> Enum.split_with(fn result -> elem(result, 0) == :error end) - - {deleted, updated} = - results - |> Enum.map(fn {:ok, config} -> - Map.put(config, :db, ConfigDB.get_db_keys(config)) - end) - |> Enum.split_with(fn config -> - Ecto.get_meta(config, :state) == :deleted - end) - - Config.TransferTask.load_and_update_env(deleted, false) - - if !Restarter.Pleroma.need_reboot?() do - changed_reboot_settings? = - (updated ++ deleted) - |> Enum.any?(fn config -> - group = ConfigDB.from_string(config.group) - key = ConfigDB.from_string(config.key) - value = ConfigDB.from_binary(config.value) - Config.TransferTask.pleroma_need_restart?(group, key, value) - end) - - if changed_reboot_settings?, do: Restarter.Pleroma.need_reboot() - end - - conn - |> put_view(ConfigView) - |> render("index.json", %{configs: updated, need_reboot: Restarter.Pleroma.need_reboot?()}) - end - end - def restart(conn, _params) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do Restarter.Pleroma.restart(Config.get(:env), 50) json(conn, %{}) @@ -1008,43 +601,18 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do json(conn, %{need_reboot: Restarter.Pleroma.need_reboot?()}) end - defp configurable_from_database(conn) do + defp configurable_from_database do if Config.get(:configurable_from_database) do :ok else - errors( - conn, - {:error, "To use this endpoint you need to enable configuration from database."} - ) + {:error, "To use this endpoint you need to enable configuration from database."} end end - defp whitelisted_config?(group, key) do - if whitelisted_configs = Config.get(:database_config_whitelist) do - Enum.any?(whitelisted_configs, fn - {whitelisted_group} -> - group == inspect(whitelisted_group) - - {whitelisted_group, whitelisted_key} -> - group == inspect(whitelisted_group) && key == inspect(whitelisted_key) - end) - else - true - end - end - - defp whitelisted_config?(%{"group" => group, "key" => key}) do - whitelisted_config?(group, key) - end - - defp whitelisted_config?(%{:group => group} = config) do - whitelisted_config?(group, config[:key]) - end - def reload_emoji(conn, _params) do Pleroma.Emoji.reload() - conn |> json("ok") + json(conn, "ok") end def confirm_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do @@ -1058,7 +626,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do action: "confirm_email" }) - conn |> json("") + json(conn, "") end def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do @@ -1072,115 +640,13 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do action: "resend_confirmation_email" }) - conn |> json("") - end - - def oauth_app_create(conn, params) do - params = - if params["name"] do - Map.put(params, "client_name", params["name"]) - else - params - end - - result = - case App.create(params) do - {:ok, app} -> - AppView.render("show.json", %{app: app, admin: true}) - - {:error, changeset} -> - App.errors(changeset) - end - - json(conn, result) - end - - def oauth_app_update(conn, params) do - params = - if params["name"] do - Map.put(params, "client_name", params["name"]) - else - params - end - - with {:ok, app} <- App.update(params) do - json(conn, AppView.render("show.json", %{app: app, admin: true})) - else - {:error, changeset} -> - json(conn, App.errors(changeset)) - - nil -> - json_response(conn, :bad_request, "") - end + json(conn, "") end - def oauth_app_list(conn, params) do - {page, page_size} = page_params(params) - - search_params = %{ - client_name: params["name"], - client_id: params["client_id"], - page: page, - page_size: page_size - } + def stats(conn, params) do + counters = Stats.get_status_visibility_count(params["instance"]) - search_params = - if Map.has_key?(params, "trusted") do - Map.put(search_params, :trusted, params["trusted"]) - else - search_params - end - - with {:ok, apps, count} <- App.search(search_params) do - json( - conn, - AppView.render("index.json", - apps: apps, - count: count, - page_size: page_size, - admin: true - ) - ) - end - end - - def oauth_app_delete(conn, params) do - with {:ok, _app} <- App.destroy(params["id"]) do - json_response(conn, :no_content, "") - else - _ -> json_response(conn, :bad_request, "") - end - end - - def stats(conn, _) do - count = Stats.get_status_visibility_count() - - conn - |> json(%{"status_visibility" => count}) - end - - defp errors(conn, {:error, :not_found}) do - conn - |> put_status(:not_found) - |> json(dgettext("errors", "Not found")) - end - - defp errors(conn, {:error, reason}) do - conn - |> put_status(:bad_request) - |> json(reason) - end - - defp errors(conn, {:param_cast, _}) do - conn - |> put_status(:bad_request) - |> json(dgettext("errors", "Invalid parameters")) - end - - defp errors(conn, _) do - conn - |> put_status(:internal_server_error) - |> json(dgettext("errors", "Something went wrong")) + json(conn, %{"status_visibility" => counters}) end defp page_params(params) do diff --git a/lib/pleroma/web/admin_api/controllers/config_controller.ex b/lib/pleroma/web/admin_api/controllers/config_controller.ex new file mode 100644 index 000000000..7f60470cb --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/config_controller.ex @@ -0,0 +1,152 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ConfigController do + use Pleroma.Web, :controller + + alias Pleroma.Config + alias Pleroma.ConfigDB + alias Pleroma.Plugs.OAuthScopesPlug + + @descriptions Pleroma.Docs.JSON.compile() + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :update) + + plug( + OAuthScopesPlug, + %{scopes: ["read"], admin: true} + when action in [:show, :descriptions] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ConfigOperation + + def descriptions(conn, _params) do + descriptions = Enum.filter(@descriptions, &whitelisted_config?/1) + + json(conn, descriptions) + end + + def show(conn, %{only_db: true}) do + with :ok <- configurable_from_database() do + configs = Pleroma.Repo.all(ConfigDB) + + render(conn, "index.json", %{ + configs: configs, + need_reboot: Restarter.Pleroma.need_reboot?() + }) + end + end + + def show(conn, _params) do + with :ok <- configurable_from_database() do + configs = ConfigDB.get_all_as_keyword() + + merged = + Config.Holder.default_config() + |> ConfigDB.merge(configs) + |> Enum.map(fn {group, values} -> + Enum.map(values, fn {key, value} -> + db = + if configs[group][key] do + ConfigDB.get_db_keys(configs[group][key], key) + end + + db_value = configs[group][key] + + merged_value = + if not is_nil(db_value) and Keyword.keyword?(db_value) and + ConfigDB.sub_key_full_update?(group, key, Keyword.keys(db_value)) do + ConfigDB.merge_group(group, key, value, db_value) + else + value + end + + %ConfigDB{ + group: group, + key: key, + value: merged_value + } + |> Pleroma.Maps.put_if_present(:db, db) + end) + end) + |> List.flatten() + + render(conn, "index.json", %{ + configs: merged, + need_reboot: Restarter.Pleroma.need_reboot?() + }) + end + end + + def update(%{body_params: %{configs: configs}} = conn, _) do + with :ok <- configurable_from_database() do + results = + configs + |> Enum.filter(&whitelisted_config?/1) + |> Enum.map(fn + %{group: group, key: key, delete: true} = params -> + ConfigDB.delete(%{group: group, key: key, subkeys: params[:subkeys]}) + + %{group: group, key: key, value: value} -> + ConfigDB.update_or_create(%{group: group, key: key, value: value}) + end) + |> Enum.reject(fn {result, _} -> result == :error end) + + {deleted, updated} = + results + |> Enum.map(fn {:ok, %{key: key, value: value} = config} -> + Map.put(config, :db, ConfigDB.get_db_keys(value, key)) + end) + |> Enum.split_with(&(Ecto.get_meta(&1, :state) == :deleted)) + + Config.TransferTask.load_and_update_env(deleted, false) + + if not Restarter.Pleroma.need_reboot?() do + changed_reboot_settings? = + (updated ++ deleted) + |> Enum.any?(&Config.TransferTask.pleroma_need_restart?(&1.group, &1.key, &1.value)) + + if changed_reboot_settings?, do: Restarter.Pleroma.need_reboot() + end + + render(conn, "index.json", %{ + configs: updated, + need_reboot: Restarter.Pleroma.need_reboot?() + }) + end + end + + defp configurable_from_database do + if Config.get(:configurable_from_database) do + :ok + else + {:error, "To use this endpoint you need to enable configuration from database."} + end + end + + defp whitelisted_config?(group, key) do + if whitelisted_configs = Config.get(:database_config_whitelist) do + Enum.any?(whitelisted_configs, fn + {whitelisted_group} -> + group == inspect(whitelisted_group) + + {whitelisted_group, whitelisted_key} -> + group == inspect(whitelisted_group) && key == inspect(whitelisted_key) + end) + else + true + end + end + + defp whitelisted_config?(%{group: group, key: key}) do + whitelisted_config?(group, key) + end + + defp whitelisted_config?(%{group: group} = config) do + whitelisted_config?(group, config[:key]) + end +end diff --git a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex new file mode 100644 index 000000000..34d90db07 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex @@ -0,0 +1,37 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.FallbackController do + use Pleroma.Web, :controller + + def call(conn, {:error, :not_found}) do + conn + |> put_status(:not_found) + |> json(%{error: dgettext("errors", "Not found")}) + end + + def call(conn, {:error, reason}) do + conn + |> put_status(:bad_request) + |> json(%{error: reason}) + end + + def call(conn, {:errors, errors}) do + conn + |> put_status(:bad_request) + |> json(%{errors: errors}) + end + + def call(conn, {:param_cast, _}) do + conn + |> put_status(:bad_request) + |> json(dgettext("errors", "Invalid parameters")) + end + + def call(conn, _) do + conn + |> put_status(:internal_server_error) + |> json(%{error: dgettext("errors", "Something went wrong")}) + end +end diff --git a/lib/pleroma/web/admin_api/controllers/invite_controller.ex b/lib/pleroma/web/admin_api/controllers/invite_controller.ex new file mode 100644 index 000000000..7d169b8d2 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/invite_controller.ex @@ -0,0 +1,78 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InviteController do + use Pleroma.Web, :controller + + import Pleroma.Web.ControllerHelper, only: [json_response: 3] + + alias Pleroma.Config + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.UserInviteToken + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["read:invites"], admin: true} when action == :index) + + plug( + OAuthScopesPlug, + %{scopes: ["write:invites"], admin: true} when action in [:create, :revoke, :email] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.InviteOperation + + @doc "Get list of created invites" + def index(conn, _params) do + invites = UserInviteToken.list_invites() + + render(conn, "index.json", invites: invites) + end + + @doc "Create an account registration invite token" + def create(%{body_params: params} = conn, _) do + {:ok, invite} = UserInviteToken.create_invite(params) + + render(conn, "show.json", invite: invite) + end + + @doc "Revokes invite by token" + def revoke(%{body_params: %{token: token}} = conn, _) do + with {:ok, invite} <- UserInviteToken.find_by_token(token), + {:ok, updated_invite} = UserInviteToken.update_invite(invite, %{used: true}) do + render(conn, "show.json", invite: updated_invite) + else + nil -> {:error, :not_found} + error -> error + end + end + + @doc "Sends registration invite via email" + def email(%{assigns: %{user: user}, body_params: %{email: email} = params} = conn, _) do + with {_, false} <- {:registrations_open, Config.get([:instance, :registrations_open])}, + {_, true} <- {:invites_enabled, Config.get([:instance, :invites_enabled])}, + {:ok, invite_token} <- UserInviteToken.create_invite(), + {:ok, _} <- + user + |> Pleroma.Emails.UserEmail.user_invitation_email( + invite_token, + email, + params[:name] + ) + |> Pleroma.Emails.Mailer.deliver() do + json_response(conn, :no_content, "") + else + {:registrations_open, _} -> + {:error, "To send invites you need to set the `registrations_open` option to false."} + + {:invites_enabled, _} -> + {:error, "To send invites you need to set the `invites_enabled` option to true."} + + {:error, error} -> + {:error, error} + end + end +end diff --git a/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex b/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex new file mode 100644 index 000000000..e2759d59f --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex @@ -0,0 +1,63 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.MediaProxyCacheController do + use Pleroma.Web, :controller + + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.ApiSpec.Admin, as: Spec + alias Pleroma.Web.MediaProxy + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + OAuthScopesPlug, + %{scopes: ["read:media_proxy_caches"], admin: true} when action in [:index] + ) + + plug( + OAuthScopesPlug, + %{scopes: ["write:media_proxy_caches"], admin: true} when action in [:purge, :delete] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Spec.MediaProxyCacheOperation + + def index(%{assigns: %{user: _}} = conn, params) do + cursor = + :banned_urls_cache + |> :ets.table([{:traverse, {:select, Cachex.Query.create(true, :key)}}]) + |> :qlc.cursor() + + urls = + case params.page do + 1 -> + :qlc.next_answers(cursor, params.page_size) + + _ -> + :qlc.next_answers(cursor, (params.page - 1) * params.page_size) + :qlc.next_answers(cursor, params.page_size) + end + + :qlc.delete_cursor(cursor) + + render(conn, "index.json", urls: urls) + end + + def delete(%{assigns: %{user: _}, body_params: %{urls: urls}} = conn, _) do + MediaProxy.remove_from_banned_urls(urls) + render(conn, "index.json", urls: urls) + end + + def purge(%{assigns: %{user: _}, body_params: %{urls: urls, ban: ban}} = conn, _) do + MediaProxy.Invalidation.purge(urls) + + if ban do + MediaProxy.put_in_banned_urls(urls) + end + + render(conn, "index.json", urls: urls) + end +end diff --git a/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex b/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex new file mode 100644 index 000000000..dca23ea73 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex @@ -0,0 +1,77 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.OAuthAppController do + use Pleroma.Web, :controller + + import Pleroma.Web.ControllerHelper, only: [json_response: 3] + + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.OAuth.App + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(:put_view, Pleroma.Web.MastodonAPI.AppView) + + plug( + OAuthScopesPlug, + %{scopes: ["write"], admin: true} + when action in [:create, :index, :update, :delete] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.OAuthAppOperation + + def index(conn, params) do + search_params = + params + |> Map.take([:client_id, :page, :page_size, :trusted]) + |> Map.put(:client_name, params[:name]) + + with {:ok, apps, count} <- App.search(search_params) do + render(conn, "index.json", + apps: apps, + count: count, + page_size: params.page_size, + admin: true + ) + end + end + + def create(%{body_params: params} = conn, _) do + params = Pleroma.Maps.put_if_present(params, :client_name, params[:name]) + + case App.create(params) do + {:ok, app} -> + render(conn, "show.json", app: app, admin: true) + + {:error, changeset} -> + json(conn, App.errors(changeset)) + end + end + + def update(%{body_params: params} = conn, %{id: id}) do + params = Pleroma.Maps.put_if_present(params, :client_name, params[:name]) + + with {:ok, app} <- App.update(id, params) do + render(conn, "show.json", app: app, admin: true) + else + {:error, changeset} -> + json(conn, App.errors(changeset)) + + nil -> + json_response(conn, :bad_request, "") + end + end + + def delete(conn, params) do + with {:ok, _app} <- App.destroy(params.id) do + json_response(conn, :no_content, "") + else + _ -> json_response(conn, :bad_request, "") + end + end +end diff --git a/lib/pleroma/web/admin_api/controllers/relay_controller.ex b/lib/pleroma/web/admin_api/controllers/relay_controller.ex new file mode 100644 index 000000000..cf9f3a14b --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/relay_controller.ex @@ -0,0 +1,67 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.RelayController do + use Pleroma.Web, :controller + + alias Pleroma.ModerationLog + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.ActivityPub.Relay + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + + plug( + OAuthScopesPlug, + %{scopes: ["write:follows"], admin: true} + when action in [:follow, :unfollow] + ) + + plug(OAuthScopesPlug, %{scopes: ["read"], admin: true} when action == :index) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.RelayOperation + + def index(conn, _params) do + with {:ok, list} <- Relay.list() do + json(conn, %{relays: list}) + end + end + + def follow(%{assigns: %{user: admin}, body_params: %{relay_url: target}} = conn, _) do + with {:ok, _message} <- Relay.follow(target) do + ModerationLog.insert_log(%{ + action: "relay_follow", + actor: admin, + target: target + }) + + json(conn, target) + else + _ -> + conn + |> put_status(500) + |> json(target) + end + end + + def unfollow(%{assigns: %{user: admin}, body_params: %{relay_url: target}} = conn, _) do + with {:ok, _message} <- Relay.unfollow(target) do + ModerationLog.insert_log(%{ + action: "relay_unfollow", + actor: admin, + target: target + }) + + json(conn, target) + else + _ -> + conn + |> put_status(500) + |> json(target) + end + end +end diff --git a/lib/pleroma/web/admin_api/controllers/report_controller.ex b/lib/pleroma/web/admin_api/controllers/report_controller.ex new file mode 100644 index 000000000..4c011e174 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/report_controller.ex @@ -0,0 +1,107 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ReportController do + use Pleroma.Web, :controller + + import Pleroma.Web.ControllerHelper, only: [json_response: 3] + + alias Pleroma.Activity + alias Pleroma.ModerationLog + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.ReportNote + alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.AdminAPI + alias Pleroma.Web.AdminAPI.Report + alias Pleroma.Web.CommonAPI + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["read:reports"], admin: true} when action in [:index, :show]) + + plug( + OAuthScopesPlug, + %{scopes: ["write:reports"], admin: true} + when action in [:update, :notes_create, :notes_delete] + ) + + action_fallback(AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ReportOperation + + def index(conn, params) do + reports = Utils.get_reports(params, params.page, params.page_size) + + render(conn, "index.json", reports: reports) + end + + def show(conn, %{id: id}) do + with %Activity{} = report <- Activity.get_by_id(id) do + render(conn, "show.json", Report.extract_report_info(report)) + else + _ -> {:error, :not_found} + end + end + + def update(%{assigns: %{user: admin}, body_params: %{reports: reports}} = conn, _) do + result = + Enum.map(reports, fn report -> + case CommonAPI.update_report_state(report.id, report.state) do + {:ok, activity} -> + ModerationLog.insert_log(%{ + action: "report_update", + actor: admin, + subject: activity + }) + + activity + + {:error, message} -> + %{id: report.id, error: message} + end + end) + + if Enum.any?(result, &Map.has_key?(&1, :error)) do + json_response(conn, :bad_request, result) + else + json_response(conn, :no_content, "") + end + end + + def notes_create(%{assigns: %{user: user}, body_params: %{content: content}} = conn, %{ + id: report_id + }) do + with {:ok, _} <- ReportNote.create(user.id, report_id, content) do + ModerationLog.insert_log(%{ + action: "report_note", + actor: user, + subject: Activity.get_by_id(report_id), + text: content + }) + + json_response(conn, :no_content, "") + else + _ -> json_response(conn, :bad_request, "") + end + end + + def notes_delete(%{assigns: %{user: user}} = conn, %{ + id: note_id, + report_id: report_id + }) do + with {:ok, note} <- ReportNote.destroy(note_id) do + ModerationLog.insert_log(%{ + action: "report_note_delete", + actor: user, + subject: Activity.get_by_id(report_id), + text: note.content + }) + + json_response(conn, :no_content, "") + else + _ -> json_response(conn, :bad_request, "") + end + end +end diff --git a/lib/pleroma/web/admin_api/controllers/status_controller.ex b/lib/pleroma/web/admin_api/controllers/status_controller.ex new file mode 100644 index 000000000..bc48cc527 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/status_controller.ex @@ -0,0 +1,77 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.StatusController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.ModerationLog + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.MastodonAPI + + require Logger + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} when action in [:index, :show]) + + plug( + OAuthScopesPlug, + %{scopes: ["write:statuses"], admin: true} when action in [:update, :delete] + ) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.StatusOperation + + def index(%{assigns: %{user: _admin}} = conn, params) do + activities = + ActivityPub.fetch_statuses(nil, %{ + godmode: params.godmode, + local_only: params.local_only, + limit: params.page_size, + offset: (params.page - 1) * params.page_size, + exclude_reblogs: not params.with_reblogs + }) + + render(conn, "index.json", activities: activities, as: :activity) + end + + def show(conn, %{id: id}) do + with %Activity{} = activity <- Activity.get_by_id(id) do + render(conn, "show.json", %{activity: activity}) + else + nil -> {:error, :not_found} + end + end + + def update(%{assigns: %{user: admin}, body_params: params} = conn, %{id: id}) do + with {:ok, activity} <- CommonAPI.update_activity_scope(id, params) do + ModerationLog.insert_log(%{ + action: "status_update", + actor: admin, + subject: activity, + sensitive: params[:sensitive], + visibility: params[:visibility] + }) + + conn + |> put_view(MastodonAPI.StatusView) + |> render("show.json", %{activity: activity}) + end + end + + def delete(%{assigns: %{user: user}} = conn, %{id: id}) do + with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do + ModerationLog.insert_log(%{ + action: "status_delete", + actor: user, + subject_id: id + }) + + json(conn, %{}) + end + end +end diff --git a/lib/pleroma/web/admin_api/search.ex b/lib/pleroma/web/admin_api/search.ex index c28efadd5..0bfb8f022 100644 --- a/lib/pleroma/web/admin_api/search.ex +++ b/lib/pleroma/web/admin_api/search.ex @@ -21,7 +21,7 @@ defmodule Pleroma.Web.AdminAPI.Search do query = params |> Map.drop([:page, :page_size]) - |> Map.put(:exclude_service_users, true) + |> Map.put(:invisible, false) |> User.Query.build() |> order_by([u], u.nickname) @@ -31,7 +31,6 @@ defmodule Pleroma.Web.AdminAPI.Search do count = Repo.aggregate(query, :count, :id) results = Repo.all(paginated_query) - {:ok, results, count} end end diff --git a/lib/pleroma/web/admin_api/views/account_view.ex b/lib/pleroma/web/admin_api/views/account_view.ex index 46dadb5ee..e1e929632 100644 --- a/lib/pleroma/web/admin_api/views/account_view.ex +++ b/lib/pleroma/web/admin_api/views/account_view.ex @@ -76,25 +76,8 @@ defmodule Pleroma.Web.AdminAPI.AccountView do "local" => user.local, "roles" => User.roles(user), "tags" => user.tags || [], - "confirmation_pending" => user.confirmation_pending - } - end - - def render("invite.json", %{invite: invite}) do - %{ - "id" => invite.id, - "token" => invite.token, - "used" => invite.used, - "expires_at" => invite.expires_at, - "uses" => invite.uses, - "max_use" => invite.max_use, - "invite_type" => invite.invite_type - } - end - - def render("invites.json", %{invites: invites}) do - %{ - invites: render_many(invites, AccountView, "invite.json", as: :invite) + "confirmation_pending" => user.confirmation_pending, + "url" => user.uri || user.ap_id } end diff --git a/lib/pleroma/web/admin_api/views/config_view.ex b/lib/pleroma/web/admin_api/views/config_view.ex index 587ef760e..d2d8b5907 100644 --- a/lib/pleroma/web/admin_api/views/config_view.ex +++ b/lib/pleroma/web/admin_api/views/config_view.ex @@ -5,23 +5,20 @@ defmodule Pleroma.Web.AdminAPI.ConfigView do use Pleroma.Web, :view + alias Pleroma.ConfigDB + def render("index.json", %{configs: configs} = params) do - map = %{ - configs: render_many(configs, __MODULE__, "show.json", as: :config) + %{ + configs: render_many(configs, __MODULE__, "show.json", as: :config), + need_reboot: params[:need_reboot] } - - if params[:need_reboot] do - Map.put(map, :need_reboot, true) - else - map - end end def render("show.json", %{config: config}) do map = %{ - key: config.key, - group: config.group, - value: Pleroma.ConfigDB.from_binary_with_convert(config.value) + key: ConfigDB.to_json_types(config.key), + group: ConfigDB.to_json_types(config.group), + value: ConfigDB.to_json_types(config.value) } if config.db != [] do diff --git a/lib/pleroma/web/admin_api/views/invite_view.ex b/lib/pleroma/web/admin_api/views/invite_view.ex new file mode 100644 index 000000000..f93cb6916 --- /dev/null +++ b/lib/pleroma/web/admin_api/views/invite_view.ex @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InviteView do + use Pleroma.Web, :view + + def render("index.json", %{invites: invites}) do + %{ + invites: render_many(invites, __MODULE__, "show.json", as: :invite) + } + end + + def render("show.json", %{invite: invite}) do + %{ + "id" => invite.id, + "token" => invite.token, + "used" => invite.used, + "expires_at" => invite.expires_at, + "uses" => invite.uses, + "max_use" => invite.max_use, + "invite_type" => invite.invite_type + } + end +end diff --git a/lib/pleroma/web/admin_api/views/media_proxy_cache_view.ex b/lib/pleroma/web/admin_api/views/media_proxy_cache_view.ex new file mode 100644 index 000000000..c97400beb --- /dev/null +++ b/lib/pleroma/web/admin_api/views/media_proxy_cache_view.ex @@ -0,0 +1,11 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.MediaProxyCacheView do + use Pleroma.Web, :view + + def render("index.json", %{urls: urls}) do + %{urls: urls} + end +end diff --git a/lib/pleroma/web/admin_api/views/report_view.ex b/lib/pleroma/web/admin_api/views/report_view.ex index f432b8c2c..773f798fe 100644 --- a/lib/pleroma/web/admin_api/views/report_view.ex +++ b/lib/pleroma/web/admin_api/views/report_view.ex @@ -18,7 +18,7 @@ defmodule Pleroma.Web.AdminAPI.ReportView do %{ reports: reports[:items] - |> Enum.map(&Report.extract_report_info(&1)) + |> Enum.map(&Report.extract_report_info/1) |> Enum.map(&render(__MODULE__, "show.json", &1)) |> Enum.reverse(), total: reports[:total] diff --git a/lib/pleroma/web/api_spec/cast_and_validate.ex b/lib/pleroma/web/api_spec/cast_and_validate.ex index bd9026237..fbfc27d6f 100644 --- a/lib/pleroma/web/api_spec/cast_and_validate.ex +++ b/lib/pleroma/web/api_spec/cast_and_validate.ex @@ -40,7 +40,7 @@ defmodule Pleroma.Web.ApiSpec.CastAndValidate do |> List.first() _ -> - nil + "application/json" end private_data = Map.put(private_data, :operation_id, operation_id) diff --git a/lib/pleroma/web/api_spec/helpers.ex b/lib/pleroma/web/api_spec/helpers.ex index a9cfe0fed..a258e8421 100644 --- a/lib/pleroma/web/api_spec/helpers.ex +++ b/lib/pleroma/web/api_spec/helpers.ex @@ -39,6 +39,12 @@ defmodule Pleroma.Web.ApiSpec.Helpers do :string, "Return the newest items newer than this ID" ), + Operation.parameter( + :offset, + :query, + %Schema{type: :integer, default: 0}, + "Return items past this number of items" + ), Operation.parameter( :limit, :query, diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex index 20572f8ea..9bde8fc0d 100644 --- a/lib/pleroma/web/api_spec/operations/account_operation.ex +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -102,6 +102,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], responses: %{ 200 => Operation.response("Account", "application/json", Account), + 401 => Operation.response("Error", "application/json", ApiError), 404 => Operation.response("Error", "application/json", ApiError) } } @@ -142,6 +143,7 @@ defmodule Pleroma.Web.ApiSpec.AccountOperation do ] ++ pagination_params(), responses: %{ 200 => Operation.response("Statuses", "application/json", array_of_statuses()), + 401 => Operation.response("Error", "application/json", ApiError), 404 => Operation.response("Error", "application/json", ApiError) } } diff --git a/lib/pleroma/web/api_spec/operations/admin/config_operation.ex b/lib/pleroma/web/api_spec/operations/admin/config_operation.ex new file mode 100644 index 000000000..7b38a2ef4 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/config_operation.ex @@ -0,0 +1,142 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.ConfigOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Admin", "Config"], + summary: "Get list of merged default settings with saved in database", + operationId: "AdminAPI.ConfigController.show", + parameters: [ + Operation.parameter( + :only_db, + :query, + %Schema{type: :boolean, default: false}, + "Get only saved in database settings" + ) + ], + security: [%{"oAuth" => ["read"]}], + responses: %{ + 200 => Operation.response("Config", "application/json", config_response()), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Admin", "Config"], + summary: "Update config settings", + operationId: "AdminAPI.ConfigController.update", + security: [%{"oAuth" => ["write"]}], + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + configs: %Schema{ + type: :array, + items: %Schema{ + type: :object, + properties: %{ + group: %Schema{type: :string}, + key: %Schema{type: :string}, + value: any(), + delete: %Schema{type: :boolean}, + subkeys: %Schema{type: :array, items: %Schema{type: :string}} + } + } + } + } + }), + responses: %{ + 200 => Operation.response("Config", "application/json", config_response()), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def descriptions_operation do + %Operation{ + tags: ["Admin", "Config"], + summary: "Get JSON with config descriptions.", + operationId: "AdminAPI.ConfigController.descriptions", + security: [%{"oAuth" => ["read"]}], + responses: %{ + 200 => + Operation.response("Config Descriptions", "application/json", %Schema{ + type: :array, + items: %Schema{ + type: :object, + properties: %{ + group: %Schema{type: :string}, + key: %Schema{type: :string}, + type: %Schema{oneOf: [%Schema{type: :string}, %Schema{type: :array}]}, + description: %Schema{type: :string}, + children: %Schema{ + type: :array, + items: %Schema{ + type: :object, + properties: %{ + key: %Schema{type: :string}, + type: %Schema{oneOf: [%Schema{type: :string}, %Schema{type: :array}]}, + description: %Schema{type: :string}, + suggestions: %Schema{type: :array} + } + } + } + } + } + }), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + defp any do + %Schema{ + oneOf: [ + %Schema{type: :array}, + %Schema{type: :object}, + %Schema{type: :string}, + %Schema{type: :integer}, + %Schema{type: :boolean} + ] + } + end + + defp config_response do + %Schema{ + type: :object, + properties: %{ + configs: %Schema{ + type: :array, + items: %Schema{ + type: :object, + properties: %{ + group: %Schema{type: :string}, + key: %Schema{type: :string}, + value: any() + } + } + }, + need_reboot: %Schema{ + type: :boolean, + description: + "If `need_reboot` is `true`, instance must be restarted, so reboot time settings can take effect" + } + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex b/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex new file mode 100644 index 000000000..d3af9db49 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex @@ -0,0 +1,148 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.InviteOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Admin", "Invites"], + summary: "Get a list of generated invites", + operationId: "AdminAPI.InviteController.index", + security: [%{"oAuth" => ["read:invites"]}], + responses: %{ + 200 => + Operation.response("Invites", "application/json", %Schema{ + type: :object, + properties: %{ + invites: %Schema{type: :array, items: invite()} + }, + example: %{ + "invites" => [ + %{ + "id" => 123, + "token" => "kSQtDj_GNy2NZsL9AQDFIsHN5qdbguB6qRg3WHw6K1U=", + "used" => true, + "expires_at" => nil, + "uses" => 0, + "max_use" => nil, + "invite_type" => "one_time" + } + ] + } + }) + } + } + end + + def create_operation do + %Operation{ + tags: ["Admin", "Invites"], + summary: "Create an account registration invite token", + operationId: "AdminAPI.InviteController.create", + security: [%{"oAuth" => ["write:invites"]}], + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + max_use: %Schema{type: :integer}, + expires_at: %Schema{type: :string, format: :date, example: "2020-04-20"} + } + }), + responses: %{ + 200 => Operation.response("Invite", "application/json", invite()) + } + } + end + + def revoke_operation do + %Operation{ + tags: ["Admin", "Invites"], + summary: "Revoke invite by token", + operationId: "AdminAPI.InviteController.revoke", + security: [%{"oAuth" => ["write:invites"]}], + requestBody: + request_body( + "Parameters", + %Schema{ + type: :object, + required: [:token], + properties: %{ + token: %Schema{type: :string} + } + }, + required: true + ), + responses: %{ + 200 => Operation.response("Invite", "application/json", invite()), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def email_operation do + %Operation{ + tags: ["Admin", "Invites"], + summary: "Sends registration invite via email", + operationId: "AdminAPI.InviteController.email", + security: [%{"oAuth" => ["write:invites"]}], + requestBody: + request_body( + "Parameters", + %Schema{ + type: :object, + required: [:email], + properties: %{ + email: %Schema{type: :string, format: :email}, + name: %Schema{type: :string} + } + }, + required: true + ), + responses: %{ + 204 => no_content_response(), + 400 => Operation.response("Bad Request", "application/json", ApiError), + 403 => Operation.response("Forbidden", "application/json", ApiError) + } + } + end + + defp invite do + %Schema{ + title: "Invite", + type: :object, + properties: %{ + id: %Schema{type: :integer}, + token: %Schema{type: :string}, + used: %Schema{type: :boolean}, + expires_at: %Schema{type: :string, format: :date, nullable: true}, + uses: %Schema{type: :integer}, + max_use: %Schema{type: :integer, nullable: true}, + invite_type: %Schema{ + type: :string, + enum: ["one_time", "reusable", "date_limited", "reusable_date_limited"] + } + }, + example: %{ + "id" => 123, + "token" => "kSQtDj_GNy2NZsL9AQDFIsHN5qdbguB6qRg3WHw6K1U=", + "used" => true, + "expires_at" => nil, + "uses" => 0, + "max_use" => nil, + "invite_type" => "one_time" + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/media_proxy_cache_operation.ex b/lib/pleroma/web/api_spec/operations/admin/media_proxy_cache_operation.ex new file mode 100644 index 000000000..0358cfbad --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/media_proxy_cache_operation.ex @@ -0,0 +1,109 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.MediaProxyCacheOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Admin", "MediaProxyCache"], + summary: "Fetch a paginated list of all banned MediaProxy URLs in Cachex", + operationId: "AdminAPI.MediaProxyCacheController.index", + security: [%{"oAuth" => ["read:media_proxy_caches"]}], + parameters: [ + Operation.parameter( + :page, + :query, + %Schema{type: :integer, default: 1}, + "Page" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 50}, + "Number of statuses to return" + ) + ], + responses: %{ + 200 => success_response() + } + } + end + + def delete_operation do + %Operation{ + tags: ["Admin", "MediaProxyCache"], + summary: "Remove a banned MediaProxy URL from Cachex", + operationId: "AdminAPI.MediaProxyCacheController.delete", + security: [%{"oAuth" => ["write:media_proxy_caches"]}], + requestBody: + request_body( + "Parameters", + %Schema{ + type: :object, + required: [:urls], + properties: %{ + urls: %Schema{type: :array, items: %Schema{type: :string, format: :uri}} + } + }, + required: true + ), + responses: %{ + 200 => success_response(), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def purge_operation do + %Operation{ + tags: ["Admin", "MediaProxyCache"], + summary: "Purge and optionally ban a MediaProxy URL", + operationId: "AdminAPI.MediaProxyCacheController.purge", + security: [%{"oAuth" => ["write:media_proxy_caches"]}], + requestBody: + request_body( + "Parameters", + %Schema{ + type: :object, + required: [:urls], + properties: %{ + urls: %Schema{type: :array, items: %Schema{type: :string, format: :uri}}, + ban: %Schema{type: :boolean, default: true} + } + }, + required: true + ), + responses: %{ + 200 => success_response(), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + defp success_response do + Operation.response("Array of banned MediaProxy URLs in Cachex", "application/json", %Schema{ + type: :object, + properties: %{ + urls: %Schema{ + type: :array, + items: %Schema{ + type: :string, + format: :uri, + description: "MediaProxy URLs" + } + } + } + }) + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/oauth_app_operation.ex b/lib/pleroma/web/api_spec/operations/admin/oauth_app_operation.ex new file mode 100644 index 000000000..fbc9f80d7 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/oauth_app_operation.ex @@ -0,0 +1,215 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.OAuthAppOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + summary: "List OAuth apps", + tags: ["Admin", "oAuth Apps"], + operationId: "AdminAPI.OAuthAppController.index", + security: [%{"oAuth" => ["write"]}], + parameters: [ + Operation.parameter(:name, :query, %Schema{type: :string}, "App name"), + Operation.parameter(:client_id, :query, %Schema{type: :string}, "Client ID"), + Operation.parameter(:page, :query, %Schema{type: :integer, default: 1}, "Page"), + Operation.parameter( + :trusted, + :query, + %Schema{type: :boolean, default: false}, + "Trusted apps" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 50}, + "Number of apps to return" + ) + ], + responses: %{ + 200 => + Operation.response("List of apps", "application/json", %Schema{ + type: :object, + properties: %{ + apps: %Schema{type: :array, items: oauth_app()}, + count: %Schema{type: :integer}, + page_size: %Schema{type: :integer} + }, + example: %{ + "apps" => [ + %{ + "id" => 1, + "name" => "App name", + "client_id" => "yHoDSiWYp5mPV6AfsaVOWjdOyt5PhWRiafi6MRd1lSk", + "client_secret" => "nLmis486Vqrv2o65eM9mLQx_m_4gH-Q6PcDpGIMl6FY", + "redirect_uri" => "https://example.com/oauth-callback", + "website" => "https://example.com", + "trusted" => true + } + ], + "count" => 1, + "page_size" => 50 + } + }) + } + } + end + + def create_operation do + %Operation{ + tags: ["Admin", "oAuth Apps"], + summary: "Create OAuth App", + operationId: "AdminAPI.OAuthAppController.create", + requestBody: request_body("Parameters", create_request()), + security: [%{"oAuth" => ["write"]}], + responses: %{ + 200 => Operation.response("App", "application/json", oauth_app()), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Admin", "oAuth Apps"], + summary: "Update OAuth App", + operationId: "AdminAPI.OAuthAppController.update", + parameters: [id_param()], + security: [%{"oAuth" => ["write"]}], + requestBody: request_body("Parameters", update_request()), + responses: %{ + 200 => Operation.response("App", "application/json", oauth_app()), + 400 => + Operation.response("Bad Request", "application/json", %Schema{ + oneOf: [ApiError, %Schema{type: :string}] + }) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Admin", "oAuth Apps"], + summary: "Delete OAuth App", + operationId: "AdminAPI.OAuthAppController.delete", + parameters: [id_param()], + security: [%{"oAuth" => ["write"]}], + responses: %{ + 204 => no_content_response(), + 400 => no_content_response() + } + } + end + + defp create_request do + %Schema{ + title: "oAuthAppCreateRequest", + type: :object, + required: [:name, :redirect_uris], + properties: %{ + name: %Schema{type: :string, description: "Application Name"}, + scopes: %Schema{type: :array, items: %Schema{type: :string}, description: "oAuth scopes"}, + redirect_uris: %Schema{ + type: :string, + description: + "Where the user should be redirected after authorization. To display the authorization code to the user instead of redirecting to a web page, use `urn:ietf:wg:oauth:2.0:oob` in this parameter." + }, + website: %Schema{ + type: :string, + nullable: true, + description: "A URL to the homepage of the app" + }, + trusted: %Schema{ + type: :boolean, + nullable: true, + default: false, + description: "Is the app trusted?" + } + }, + example: %{ + "name" => "My App", + "redirect_uris" => "https://myapp.com/auth/callback", + "website" => "https://myapp.com/", + "scopes" => ["read", "write"], + "trusted" => true + } + } + end + + defp update_request do + %Schema{ + title: "oAuthAppUpdateRequest", + type: :object, + properties: %{ + name: %Schema{type: :string, description: "Application Name"}, + scopes: %Schema{type: :array, items: %Schema{type: :string}, description: "oAuth scopes"}, + redirect_uris: %Schema{ + type: :string, + description: + "Where the user should be redirected after authorization. To display the authorization code to the user instead of redirecting to a web page, use `urn:ietf:wg:oauth:2.0:oob` in this parameter." + }, + website: %Schema{ + type: :string, + nullable: true, + description: "A URL to the homepage of the app" + }, + trusted: %Schema{ + type: :boolean, + nullable: true, + default: false, + description: "Is the app trusted?" + } + }, + example: %{ + "name" => "My App", + "redirect_uris" => "https://myapp.com/auth/callback", + "website" => "https://myapp.com/", + "scopes" => ["read", "write"], + "trusted" => true + } + } + end + + defp oauth_app do + %Schema{ + title: "oAuthApp", + type: :object, + properties: %{ + id: %Schema{type: :integer}, + name: %Schema{type: :string}, + client_id: %Schema{type: :string}, + client_secret: %Schema{type: :string}, + redirect_uri: %Schema{type: :string}, + website: %Schema{type: :string, nullable: true}, + trusted: %Schema{type: :boolean} + }, + example: %{ + "id" => 123, + "name" => "My App", + "client_id" => "TWhM-tNSuncnqN7DBJmoyeLnk6K3iJJ71KKXxgL1hPM", + "client_secret" => "ZEaFUFmF0umgBX1qKJDjaU99Q31lDkOU8NutzTOoliw", + "redirect_uri" => "https://myapp.com/oauth-callback", + "website" => "https://myapp.com/", + "trusted" => false + } + } + end + + def id_param do + Operation.parameter(:id, :path, :integer, "App ID", + example: 1337, + required: true + ) + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex b/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex new file mode 100644 index 000000000..7672cb467 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/relay_operation.ex @@ -0,0 +1,83 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.RelayOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Admin", "Relays"], + summary: "List Relays", + operationId: "AdminAPI.RelayController.index", + security: [%{"oAuth" => ["read"]}], + responses: %{ + 200 => + Operation.response("Response", "application/json", %Schema{ + type: :object, + properties: %{ + relays: %Schema{ + type: :array, + items: %Schema{type: :string}, + example: ["lain.com", "mstdn.io"] + } + } + }) + } + } + end + + def follow_operation do + %Operation{ + tags: ["Admin", "Relays"], + summary: "Follow a Relay", + operationId: "AdminAPI.RelayController.follow", + security: [%{"oAuth" => ["write:follows"]}], + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + relay_url: %Schema{type: :string, format: :uri} + } + }), + responses: %{ + 200 => + Operation.response("Status", "application/json", %Schema{ + type: :string, + example: "http://mastodon.example.org/users/admin" + }) + } + } + end + + def unfollow_operation do + %Operation{ + tags: ["Admin", "Relays"], + summary: "Unfollow a Relay", + operationId: "AdminAPI.RelayController.unfollow", + security: [%{"oAuth" => ["write:follows"]}], + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + relay_url: %Schema{type: :string, format: :uri} + } + }), + responses: %{ + 200 => + Operation.response("Status", "application/json", %Schema{ + type: :string, + example: "http://mastodon.example.org/users/admin" + }) + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/report_operation.ex b/lib/pleroma/web/api_spec/operations/admin/report_operation.ex new file mode 100644 index 000000000..15e78bfaf --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/report_operation.ex @@ -0,0 +1,237 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.ReportOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Status + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Admin", "Reports"], + summary: "Get a list of reports", + operationId: "AdminAPI.ReportController.index", + security: [%{"oAuth" => ["read:reports"]}], + parameters: [ + Operation.parameter( + :state, + :query, + report_state(), + "Filter by report state" + ), + Operation.parameter( + :limit, + :query, + %Schema{type: :integer}, + "The number of records to retrieve" + ), + Operation.parameter( + :page, + :query, + %Schema{type: :integer, default: 1}, + "Page number" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 50}, + "Number number of log entries per page" + ) + ], + responses: %{ + 200 => + Operation.response("Response", "application/json", %Schema{ + type: :object, + properties: %{ + total: %Schema{type: :integer}, + reports: %Schema{ + type: :array, + items: report() + } + } + }), + 403 => Operation.response("Forbidden", "application/json", ApiError) + } + } + end + + def show_operation do + %Operation{ + tags: ["Admin", "Reports"], + summary: "Get an individual report", + operationId: "AdminAPI.ReportController.show", + parameters: [id_param()], + security: [%{"oAuth" => ["read:reports"]}], + responses: %{ + 200 => Operation.response("Report", "application/json", report()), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Admin", "Reports"], + summary: "Change the state of one or multiple reports", + operationId: "AdminAPI.ReportController.update", + security: [%{"oAuth" => ["write:reports"]}], + requestBody: request_body("Parameters", update_request(), required: true), + responses: %{ + 204 => no_content_response(), + 400 => Operation.response("Bad Request", "application/json", update_400_response()), + 403 => Operation.response("Forbidden", "application/json", ApiError) + } + } + end + + def notes_create_operation do + %Operation{ + tags: ["Admin", "Reports"], + summary: "Create report note", + operationId: "AdminAPI.ReportController.notes_create", + parameters: [id_param()], + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + content: %Schema{type: :string, description: "The message"} + } + }), + security: [%{"oAuth" => ["write:reports"]}], + responses: %{ + 204 => no_content_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def notes_delete_operation do + %Operation{ + tags: ["Admin", "Reports"], + summary: "Delete report note", + operationId: "AdminAPI.ReportController.notes_delete", + parameters: [ + Operation.parameter(:report_id, :path, :string, "Report ID"), + Operation.parameter(:id, :path, :string, "Note ID") + ], + security: [%{"oAuth" => ["write:reports"]}], + responses: %{ + 204 => no_content_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp report_state do + %Schema{type: :string, enum: ["open", "closed", "resolved"]} + end + + defp id_param do + Operation.parameter(:id, :path, FlakeID, "Report ID", + example: "9umDrYheeY451cQnEe", + required: true + ) + end + + defp report do + %Schema{ + type: :object, + properties: %{ + id: FlakeID, + state: report_state(), + account: account_admin(), + actor: account_admin(), + content: %Schema{type: :string}, + created_at: %Schema{type: :string, format: :"date-time"}, + statuses: %Schema{type: :array, items: Status}, + notes: %Schema{ + type: :array, + items: %Schema{ + type: :object, + properties: %{ + id: %Schema{type: :integer}, + user_id: FlakeID, + content: %Schema{type: :string}, + inserted_at: %Schema{type: :string, format: :"date-time"} + } + } + } + } + } + end + + defp account_admin do + %Schema{ + title: "Account", + description: "Account view for admins", + type: :object, + properties: + Map.merge(Account.schema().properties, %{ + nickname: %Schema{type: :string}, + deactivated: %Schema{type: :boolean}, + local: %Schema{type: :boolean}, + roles: %Schema{ + type: :object, + properties: %{ + admin: %Schema{type: :boolean}, + moderator: %Schema{type: :boolean} + } + }, + confirmation_pending: %Schema{type: :boolean} + }) + } + end + + defp update_request do + %Schema{ + type: :object, + required: [:reports], + properties: %{ + reports: %Schema{ + type: :array, + items: %Schema{ + type: :object, + properties: %{ + id: %Schema{allOf: [FlakeID], description: "Required, report ID"}, + state: %Schema{ + type: :string, + description: + "Required, the new state. Valid values are `open`, `closed` and `resolved`" + } + } + }, + example: %{ + "reports" => [ + %{"id" => "123", "state" => "closed"}, + %{"id" => "1337", "state" => "resolved"} + ] + } + } + } + } + end + + defp update_400_response do + %Schema{ + type: :array, + items: %Schema{ + type: :object, + properties: %{ + id: %Schema{allOf: [FlakeID], description: "Report ID"}, + error: %Schema{type: :string, description: "Error message"} + } + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/status_operation.ex b/lib/pleroma/web/api_spec/operations/admin/status_operation.ex new file mode 100644 index 000000000..745399b4b --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/status_operation.ex @@ -0,0 +1,165 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Admin.StatusOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Status + alias Pleroma.Web.ApiSpec.Schemas.VisibilityScope + + import Pleroma.Web.ApiSpec.Helpers + import Pleroma.Web.ApiSpec.StatusOperation, only: [id_param: 0] + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Admin", "Statuses"], + operationId: "AdminAPI.StatusController.index", + security: [%{"oAuth" => ["read:statuses"]}], + parameters: [ + Operation.parameter( + :godmode, + :query, + %Schema{type: :boolean, default: false}, + "Allows to see private statuses" + ), + Operation.parameter( + :local_only, + :query, + %Schema{type: :boolean, default: false}, + "Excludes remote statuses" + ), + Operation.parameter( + :with_reblogs, + :query, + %Schema{type: :boolean, default: false}, + "Allows to see reblogs" + ), + Operation.parameter( + :page, + :query, + %Schema{type: :integer, default: 1}, + "Page" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 50}, + "Number of statuses to return" + ) + ], + responses: %{ + 200 => + Operation.response("Array of statuses", "application/json", %Schema{ + type: :array, + items: status() + }) + } + } + end + + def show_operation do + %Operation{ + tags: ["Admin", "Statuses"], + summary: "Show Status", + operationId: "AdminAPI.StatusController.show", + parameters: [id_param()], + security: [%{"oAuth" => ["read:statuses"]}], + responses: %{ + 200 => Operation.response("Status", "application/json", status()), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + def update_operation do + %Operation{ + tags: ["Admin", "Statuses"], + summary: "Change the scope of an individual reported status", + operationId: "AdminAPI.StatusController.update", + parameters: [id_param()], + security: [%{"oAuth" => ["write:statuses"]}], + requestBody: request_body("Parameters", update_request(), required: true), + responses: %{ + 200 => Operation.response("Status", "application/json", Status), + 400 => Operation.response("Error", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Admin", "Statuses"], + summary: "Delete an individual reported status", + operationId: "AdminAPI.StatusController.delete", + parameters: [id_param()], + security: [%{"oAuth" => ["write:statuses"]}], + responses: %{ + 200 => empty_object_response(), + 404 => Operation.response("Not Found", "application/json", ApiError) + } + } + end + + defp status do + %Schema{ + anyOf: [ + Status, + %Schema{ + type: :object, + properties: %{ + account: %Schema{allOf: [Account, admin_account()]} + } + } + ] + } + end + + def admin_account do + %Schema{ + type: :object, + properties: %{ + id: FlakeID, + avatar: %Schema{type: :string}, + nickname: %Schema{type: :string}, + display_name: %Schema{type: :string}, + deactivated: %Schema{type: :boolean}, + local: %Schema{type: :boolean}, + roles: %Schema{ + type: :object, + properties: %{ + admin: %Schema{type: :boolean}, + moderator: %Schema{type: :boolean} + } + }, + tags: %Schema{type: :string}, + confirmation_pending: %Schema{type: :string} + } + } + end + + defp update_request do + %Schema{ + type: :object, + properties: %{ + sensitive: %Schema{ + type: :boolean, + description: "Mark status and attached media as sensitive?" + }, + visibility: VisibilityScope + }, + example: %{ + "visibility" => "private", + "sensitive" => "false" + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex new file mode 100644 index 000000000..cf299bfc2 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -0,0 +1,355 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.ChatOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.Chat + alias Pleroma.Web.ApiSpec.Schemas.ChatMessage + + import Pleroma.Web.ApiSpec.Helpers + + @spec open_api_operation(atom) :: Operation.t() + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def mark_as_read_operation do + %Operation{ + tags: ["chat"], + summary: "Mark all messages in the chat as read", + operationId: "ChatController.mark_as_read", + parameters: [Operation.parameter(:id, :path, :string, "The ID of the Chat")], + requestBody: request_body("Parameters", mark_as_read()), + responses: %{ + 200 => + Operation.response( + "The updated chat", + "application/json", + Chat + ) + }, + security: [ + %{ + "oAuth" => ["write:chats"] + } + ] + } + end + + def mark_message_as_read_operation do + %Operation{ + tags: ["chat"], + summary: "Mark one message in the chat as read", + operationId: "ChatController.mark_message_as_read", + parameters: [ + Operation.parameter(:id, :path, :string, "The ID of the Chat"), + Operation.parameter(:message_id, :path, :string, "The ID of the message") + ], + responses: %{ + 200 => + Operation.response( + "The read ChatMessage", + "application/json", + ChatMessage + ) + }, + security: [ + %{ + "oAuth" => ["write:chats"] + } + ] + } + end + + def show_operation do + %Operation{ + tags: ["chat"], + summary: "Create a chat", + operationId: "ChatController.show", + parameters: [ + Operation.parameter( + :id, + :path, + :string, + "The id of the chat", + required: true, + example: "1234" + ) + ], + responses: %{ + 200 => + Operation.response( + "The existing chat", + "application/json", + Chat + ) + }, + security: [ + %{ + "oAuth" => ["read"] + } + ] + } + end + + def create_operation do + %Operation{ + tags: ["chat"], + summary: "Create a chat", + operationId: "ChatController.create", + parameters: [ + Operation.parameter( + :id, + :path, + :string, + "The account id of the recipient of this chat", + required: true, + example: "someflakeid" + ) + ], + responses: %{ + 200 => + Operation.response( + "The created or existing chat", + "application/json", + Chat + ) + }, + security: [ + %{ + "oAuth" => ["write:chats"] + } + ] + } + end + + def index_operation do + %Operation{ + tags: ["chat"], + summary: "Get a list of chats that you participated in", + operationId: "ChatController.index", + parameters: pagination_params(), + responses: %{ + 200 => Operation.response("The chats of the user", "application/json", chats_response()) + }, + security: [ + %{ + "oAuth" => ["read:chats"] + } + ] + } + end + + def messages_operation do + %Operation{ + tags: ["chat"], + summary: "Get the most recent messages of the chat", + operationId: "ChatController.messages", + parameters: + [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++ + pagination_params(), + responses: %{ + 200 => + Operation.response( + "The messages in the chat", + "application/json", + chat_messages_response() + ) + }, + security: [ + %{ + "oAuth" => ["read:chats"] + } + ] + } + end + + def post_chat_message_operation do + %Operation{ + tags: ["chat"], + summary: "Post a message to the chat", + operationId: "ChatController.post_chat_message", + parameters: [ + Operation.parameter(:id, :path, :string, "The ID of the Chat") + ], + requestBody: request_body("Parameters", chat_message_create()), + responses: %{ + 200 => + Operation.response( + "The newly created ChatMessage", + "application/json", + ChatMessage + ), + 400 => Operation.response("Bad Request", "application/json", ApiError) + }, + security: [ + %{ + "oAuth" => ["write:chats"] + } + ] + } + end + + def delete_message_operation do + %Operation{ + tags: ["chat"], + summary: "delete_message", + operationId: "ChatController.delete_message", + parameters: [ + Operation.parameter(:id, :path, :string, "The ID of the Chat"), + Operation.parameter(:message_id, :path, :string, "The ID of the message") + ], + responses: %{ + 200 => + Operation.response( + "The deleted ChatMessage", + "application/json", + ChatMessage + ) + }, + security: [ + %{ + "oAuth" => ["write:chats"] + } + ] + } + end + + def chats_response do + %Schema{ + title: "ChatsResponse", + description: "Response schema for multiple Chats", + type: :array, + items: Chat, + example: [ + %{ + "account" => %{ + "pleroma" => %{ + "is_admin" => false, + "confirmation_pending" => false, + "hide_followers_count" => false, + "is_moderator" => false, + "hide_favorites" => true, + "ap_id" => "https://dontbulling.me/users/lain", + "hide_follows_count" => false, + "hide_follows" => false, + "background_image" => nil, + "skip_thread_containment" => false, + "hide_followers" => false, + "relationship" => %{}, + "tags" => [] + }, + "avatar" => + "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg", + "following_count" => 0, + "header_static" => "https://originalpatchou.li/images/banner.png", + "source" => %{ + "sensitive" => false, + "note" => "lain", + "pleroma" => %{ + "discoverable" => false, + "actor_type" => "Person" + }, + "fields" => [] + }, + "statuses_count" => 1, + "locked" => false, + "created_at" => "2020-04-16T13:40:15.000Z", + "display_name" => "lain", + "fields" => [], + "acct" => "lain@dontbulling.me", + "id" => "9u6Qw6TAZANpqokMkK", + "emojis" => [], + "avatar_static" => + "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg", + "username" => "lain", + "followers_count" => 0, + "header" => "https://originalpatchou.li/images/banner.png", + "bot" => false, + "note" => "lain", + "url" => "https://dontbulling.me/users/lain" + }, + "id" => "1", + "unread" => 2 + } + ] + } + end + + def chat_messages_response do + %Schema{ + title: "ChatMessagesResponse", + description: "Response schema for multiple ChatMessages", + type: :array, + items: ChatMessage, + example: [ + %{ + "emojis" => [ + %{ + "static_url" => "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker" => false, + "shortcode" => "firefox", + "url" => "https://dontbulling.me/emoji/Firefox.gif" + } + ], + "created_at" => "2020-04-21T15:11:46.000Z", + "content" => "Check this out :firefox:", + "id" => "13", + "chat_id" => "1", + "actor_id" => "someflakeid", + "unread" => false + }, + %{ + "actor_id" => "someflakeid", + "content" => "Whats' up?", + "id" => "12", + "chat_id" => "1", + "emojis" => [], + "created_at" => "2020-04-21T15:06:45.000Z", + "unread" => false + } + ] + } + end + + def chat_message_create do + %Schema{ + title: "ChatMessageCreateRequest", + description: "POST body for creating an chat message", + type: :object, + properties: %{ + content: %Schema{ + type: :string, + description: "The content of your message. Optional if media_id is present" + }, + media_id: %Schema{type: :string, description: "The id of an upload"} + }, + example: %{ + "content" => "Hey wanna buy feet pics?", + "media_id" => "134234" + } + } + end + + def mark_as_read do + %Schema{ + title: "MarkAsReadRequest", + description: "POST body for marking a number of chat messages as read", + type: :object, + required: [:last_read_id], + properties: %{ + last_read_id: %Schema{ + type: :string, + description: "The content of your message." + } + }, + example: %{ + "last_read_id" => "abcdef12456" + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex new file mode 100644 index 000000000..1a49fece0 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex @@ -0,0 +1,104 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.EmojiReactionOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Account + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.Schemas.Status + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def index_operation do + %Operation{ + tags: ["Emoji Reactions"], + summary: + "Get an object of emoji to account mappings with accounts that reacted to the post", + parameters: [ + Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), + Operation.parameter(:emoji, :path, :string, "Filter by a single unicode emoji", + required: false + ) + ], + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "EmojiReactionController.index", + responses: %{ + 200 => array_of_reactions_response() + } + } + end + + def create_operation do + %Operation{ + tags: ["Emoji Reactions"], + summary: "React to a post with a unicode emoji", + parameters: [ + Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), + Operation.parameter(:emoji, :path, :string, "A single character unicode emoji", + required: true + ) + ], + security: [%{"oAuth" => ["write:statuses"]}], + operationId: "EmojiReactionController.create", + responses: %{ + 200 => Operation.response("Status", "application/json", Status), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end + + def delete_operation do + %Operation{ + tags: ["Emoji Reactions"], + summary: "Remove a reaction to a post with a unicode emoji", + parameters: [ + Operation.parameter(:id, :path, FlakeID, "Status ID", required: true), + Operation.parameter(:emoji, :path, :string, "A single character unicode emoji", + required: true + ) + ], + security: [%{"oAuth" => ["write:statuses"]}], + operationId: "EmojiReactionController.delete", + responses: %{ + 200 => Operation.response("Status", "application/json", Status) + } + } + end + + defp array_of_reactions_response do + Operation.response("Array of Emoji Reactions", "application/json", %Schema{ + type: :array, + items: emoji_reaction(), + example: [emoji_reaction().example] + }) + end + + defp emoji_reaction do + %Schema{ + title: "EmojiReaction", + type: :object, + properties: %{ + name: %Schema{type: :string, description: "Emoji"}, + count: %Schema{type: :integer, description: "Count of reactions with this emoji"}, + me: %Schema{type: :boolean, description: "Did I react with this emoji?"}, + accounts: %Schema{ + type: :array, + items: Account, + description: "Array of accounts reacted with this emoji" + } + }, + example: %{ + "name" => "😱", + "count" => 1, + "me" => false, + "accounts" => [Account.schema().example] + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/instance_operation.ex b/lib/pleroma/web/api_spec/operations/instance_operation.ex index d5c335d0c..bf39ae643 100644 --- a/lib/pleroma/web/api_spec/operations/instance_operation.ex +++ b/lib/pleroma/web/api_spec/operations/instance_operation.ex @@ -137,7 +137,7 @@ defmodule Pleroma.Web.ApiSpec.InstanceOperation do "background_upload_limit" => 4_000_000, "background_image" => "/static/image.png", "banner_upload_limit" => 4_000_000, - "description" => "A Pleroma instance, an alternative fediverse server", + "description" => "Pleroma: An efficient and flexible fediverse server", "email" => "lain@lain.com", "languages" => ["en"], "max_toot_chars" => 5000, diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex index 64adc5319..f09be64cb 100644 --- a/lib/pleroma/web/api_spec/operations/notification_operation.ex +++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex @@ -145,7 +145,7 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do } end - defp notification do + def notification do %Schema{ title: "Notification", description: "Response schema for a notification", @@ -163,6 +163,13 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do description: "Status that was the object of the notification, e.g. in mentions, reblogs, favourites, or polls.", nullable: true + }, + pleroma: %Schema{ + type: :object, + properties: %{ + is_seen: %Schema{type: :boolean}, + is_muted: %Schema{type: :boolean} + } } }, example: %{ @@ -170,7 +177,8 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do "type" => "mention", "created_at" => "2019-11-23T07:49:02.064Z", "account" => Account.schema().example, - "status" => Status.schema().example + "status" => Status.schema().example, + "pleroma" => %{"is_seen" => false, "is_muted" => false} } } end @@ -183,8 +191,8 @@ defmodule Pleroma.Web.ApiSpec.NotificationOperation do "favourite", "reblog", "mention", - "poll", "pleroma:emoji_reaction", + "pleroma:chat_mention", "move", "follow_request" ], diff --git a/lib/pleroma/web/api_spec/operations/pleroma_conversation_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_conversation_operation.ex new file mode 100644 index 000000000..e885eab20 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_conversation_operation.ex @@ -0,0 +1,106 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaConversationOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.Conversation + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.StatusOperation + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def show_operation do + %Operation{ + tags: ["Conversations"], + summary: "The conversation with the given ID", + parameters: [ + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ) + ], + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "PleromaAPI.ConversationController.show", + responses: %{ + 200 => Operation.response("Conversation", "application/json", Conversation) + } + } + end + + def statuses_operation do + %Operation{ + tags: ["Conversations"], + summary: "Timeline for a given conversation", + parameters: [ + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ) + | pagination_params() + ], + security: [%{"oAuth" => ["read:statuses"]}], + operationId: "PleromaAPI.ConversationController.statuses", + responses: %{ + 200 => + Operation.response( + "Array of Statuses", + "application/json", + StatusOperation.array_of_statuses() + ) + } + } + end + + def update_operation do + %Operation{ + tags: ["Conversations"], + summary: "Update a conversation. Used to change the set of recipients.", + parameters: [ + Operation.parameter(:id, :path, :string, "Conversation ID", + example: "123", + required: true + ), + Operation.parameter( + :recipients, + :query, + %Schema{type: :array, items: FlakeID}, + "A list of ids of users that should receive posts to this conversation. This will replace the current list of recipients, so submit the full list. The owner of owner of the conversation will always be part of the set of recipients, though.", + required: true + ) + ], + security: [%{"oAuth" => ["write:conversations"]}], + operationId: "PleromaAPI.ConversationController.update", + responses: %{ + 200 => Operation.response("Conversation", "application/json", Conversation) + } + } + end + + def mark_as_read_operation do + %Operation{ + tags: ["Conversations"], + summary: "Marks all user's conversations as read", + security: [%{"oAuth" => ["write:conversations"]}], + operationId: "PleromaAPI.ConversationController.mark_as_read", + responses: %{ + 200 => + Operation.response( + "Array of Conversations that were marked as read", + "application/json", + %Schema{ + type: :array, + items: Conversation, + example: [Conversation.schema().example] + } + ) + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex index 567688ff5..b2b4f8713 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex @@ -33,6 +33,20 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do tags: ["Emoji Packs"], summary: "Lists local custom emoji packs", operationId: "PleromaAPI.EmojiPackController.index", + parameters: [ + Operation.parameter( + :page, + :query, + %Schema{type: :integer, default: 1}, + "Page" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 50}, + "Number of emoji packs to return" + ) + ], responses: %{ 200 => emoji_packs_response() } @@ -44,7 +58,21 @@ defmodule Pleroma.Web.ApiSpec.PleromaEmojiPackOperation do tags: ["Emoji Packs"], summary: "Show emoji pack", operationId: "PleromaAPI.EmojiPackController.show", - parameters: [name_param()], + parameters: [ + name_param(), + Operation.parameter( + :page, + :query, + %Schema{type: :integer, default: 1}, + "Page" + ), + Operation.parameter( + :page_size, + :query, + %Schema{type: :integer, default: 30}, + "Number of emoji to return" + ) + ], responses: %{ 200 => Operation.response("Emoji Pack", "application/json", emoji_pack()), 400 => Operation.response("Bad Request", "application/json", ApiError), diff --git a/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex new file mode 100644 index 000000000..b0c8db863 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex @@ -0,0 +1,48 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaNotificationOperation do + alias OpenApiSpex.Operation + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.NotificationOperation + alias Pleroma.Web.ApiSpec.Schemas.ApiError + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def mark_as_read_operation do + %Operation{ + tags: ["Notifications"], + summary: "Mark notifications as read. Query parameters are mutually exclusive.", + requestBody: + request_body("Parameters", %Schema{ + type: :object, + properties: %{ + id: %Schema{type: :integer, description: "A single notification ID to read"}, + max_id: %Schema{type: :integer, description: "Read all notifications up to this ID"} + } + }), + security: [%{"oAuth" => ["write:notifications"]}], + operationId: "PleromaAPI.NotificationController.mark_as_read", + responses: %{ + 200 => + Operation.response( + "A Notification or array of Motifications", + "application/json", + %Schema{ + anyOf: [ + %Schema{type: :array, items: NotificationOperation.notification()}, + NotificationOperation.notification() + ] + } + ), + 400 => Operation.response("Bad Request", "application/json", ApiError) + } + } + end +end diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex index 0682ca6e5..0b7fad793 100644 --- a/lib/pleroma/web/api_spec/operations/status_operation.ex +++ b/lib/pleroma/web/api_spec/operations/status_operation.ex @@ -333,7 +333,8 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do %Operation{ tags: ["Statuses"], summary: "Favourited statuses", - description: "Statuses the user has favourited", + description: + "Statuses the user has favourited. Please note that you have to use the link headers to paginate this. You can not build the query parameters yourself.", operationId: "StatusController.favourites", parameters: pagination_params(), security: [%{"oAuth" => ["read:favourites"]}], @@ -487,7 +488,7 @@ defmodule Pleroma.Web.ApiSpec.StatusOperation do } end - defp id_param do + def id_param do Operation.parameter(:id, :path, FlakeID, "Status ID", example: "9umDrYheeY451cQnEe", required: true diff --git a/lib/pleroma/web/api_spec/operations/subscription_operation.ex b/lib/pleroma/web/api_spec/operations/subscription_operation.ex index c575a87e6..775dd795d 100644 --- a/lib/pleroma/web/api_spec/operations/subscription_operation.ex +++ b/lib/pleroma/web/api_spec/operations/subscription_operation.ex @@ -141,6 +141,11 @@ defmodule Pleroma.Web.ApiSpec.SubscriptionOperation do allOf: [BooleanLike], nullable: true, description: "Receive poll notifications?" + }, + "pleroma:chat_mention": %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive chat notifications?" } } } diff --git a/lib/pleroma/web/api_spec/schemas/account.ex b/lib/pleroma/web/api_spec/schemas/account.ex index d54e2158d..84f18f1b6 100644 --- a/lib/pleroma/web/api_spec/schemas/account.ex +++ b/lib/pleroma/web/api_spec/schemas/account.ex @@ -40,20 +40,53 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do pleroma: %Schema{ type: :object, properties: %{ - allow_following_move: %Schema{type: :boolean}, - background_image: %Schema{type: :string, nullable: true}, + allow_following_move: %Schema{ + type: :boolean, + description: "whether the user allows automatically follow moved following accounts" + }, + background_image: %Schema{type: :string, nullable: true, format: :uri}, chat_token: %Schema{type: :string}, - confirmation_pending: %Schema{type: :boolean}, + confirmation_pending: %Schema{ + type: :boolean, + description: + "whether the user account is waiting on email confirmation to be activated" + }, hide_favorites: %Schema{type: :boolean}, - hide_followers_count: %Schema{type: :boolean}, - hide_followers: %Schema{type: :boolean}, - hide_follows_count: %Schema{type: :boolean}, - hide_follows: %Schema{type: :boolean}, - is_admin: %Schema{type: :boolean}, - is_moderator: %Schema{type: :boolean}, + hide_followers_count: %Schema{ + type: :boolean, + description: "whether the user has follower stat hiding enabled" + }, + hide_followers: %Schema{ + type: :boolean, + description: "whether the user has follower hiding enabled" + }, + hide_follows_count: %Schema{ + type: :boolean, + description: "whether the user has follow stat hiding enabled" + }, + hide_follows: %Schema{ + type: :boolean, + description: "whether the user has follow hiding enabled" + }, + is_admin: %Schema{ + type: :boolean, + description: "whether the user is an admin of the local instance" + }, + is_moderator: %Schema{ + type: :boolean, + description: "whether the user is a moderator of the local instance" + }, skip_thread_containment: %Schema{type: :boolean}, - tags: %Schema{type: :array, items: %Schema{type: :string}}, - unread_conversation_count: %Schema{type: :integer}, + tags: %Schema{ + type: :array, + items: %Schema{type: :string}, + description: + "List of tags being used for things like extra roles or moderation(ie. marking all media as nsfw all)." + }, + unread_conversation_count: %Schema{ + type: :integer, + description: "The count of unread conversations. Only returned to the account owner." + }, notification_settings: %Schema{ type: :object, properties: %{ @@ -66,7 +99,9 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do }, relationship: AccountRelationship, settings_store: %Schema{ - type: :object + type: :object, + description: + "A generic map of settings for frontends. Opaque to the backend. Only returned in `verify_credentials` and `update_credentials`" } } }, @@ -74,16 +109,32 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Account do type: :object, properties: %{ fields: %Schema{type: :array, items: AccountField}, - note: %Schema{type: :string}, + note: %Schema{ + type: :string, + description: + "Plaintext version of the bio without formatting applied by the backend, used for editing the bio." + }, privacy: VisibilityScope, sensitive: %Schema{type: :boolean}, pleroma: %Schema{ type: :object, properties: %{ actor_type: ActorType, - discoverable: %Schema{type: :boolean}, - no_rich_text: %Schema{type: :boolean}, - show_role: %Schema{type: :boolean} + discoverable: %Schema{ + type: :boolean, + description: + "whether the user allows discovery of the account in search results and other services." + }, + no_rich_text: %Schema{ + type: :boolean, + description: + "whether the HTML tags for rich-text formatting are stripped from all statuses requested from the API." + }, + show_role: %Schema{ + type: :boolean, + description: + "whether the user wants their role (e.g admin, moderator) to be shown" + } } } } diff --git a/lib/pleroma/web/api_spec/schemas/chat.ex b/lib/pleroma/web/api_spec/schemas/chat.ex new file mode 100644 index 000000000..b4986b734 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/chat.ex @@ -0,0 +1,75 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.Chat do + alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ChatMessage + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "Chat", + description: "Response schema for a Chat", + type: :object, + properties: %{ + id: %Schema{type: :string}, + account: %Schema{type: :object}, + unread: %Schema{type: :integer}, + last_message: ChatMessage, + updated_at: %Schema{type: :string, format: :"date-time"} + }, + example: %{ + "account" => %{ + "pleroma" => %{ + "is_admin" => false, + "confirmation_pending" => false, + "hide_followers_count" => false, + "is_moderator" => false, + "hide_favorites" => true, + "ap_id" => "https://dontbulling.me/users/lain", + "hide_follows_count" => false, + "hide_follows" => false, + "background_image" => nil, + "skip_thread_containment" => false, + "hide_followers" => false, + "relationship" => %{}, + "tags" => [] + }, + "avatar" => + "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg", + "following_count" => 0, + "header_static" => "https://originalpatchou.li/images/banner.png", + "source" => %{ + "sensitive" => false, + "note" => "lain", + "pleroma" => %{ + "discoverable" => false, + "actor_type" => "Person" + }, + "fields" => [] + }, + "statuses_count" => 1, + "locked" => false, + "created_at" => "2020-04-16T13:40:15.000Z", + "display_name" => "lain", + "fields" => [], + "acct" => "lain@dontbulling.me", + "id" => "9u6Qw6TAZANpqokMkK", + "emojis" => [], + "avatar_static" => + "https://dontbulling.me/media/065a4dd3c6740dab13ff9c71ec7d240bb9f8be9205c9e7467fb2202117da1e32.jpg", + "username" => "lain", + "followers_count" => 0, + "header" => "https://originalpatchou.li/images/banner.png", + "bot" => false, + "note" => "lain", + "url" => "https://dontbulling.me/users/lain" + }, + "id" => "1", + "unread" => 2, + "last_message" => ChatMessage.schema().example(), + "updated_at" => "2020-04-21T15:06:45.000Z" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/chat_message.ex b/lib/pleroma/web/api_spec/schemas/chat_message.ex new file mode 100644 index 000000000..3ee85aa76 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/chat_message.ex @@ -0,0 +1,41 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ChatMessage", + description: "Response schema for a ChatMessage", + nullable: true, + type: :object, + properties: %{ + id: %Schema{type: :string}, + account_id: %Schema{type: :string, description: "The Mastodon API id of the actor"}, + chat_id: %Schema{type: :string}, + content: %Schema{type: :string, nullable: true}, + created_at: %Schema{type: :string, format: :"date-time"}, + emojis: %Schema{type: :array}, + attachment: %Schema{type: :object, nullable: true} + }, + example: %{ + "account_id" => "someflakeid", + "chat_id" => "1", + "content" => "hey you again", + "created_at" => "2020-04-21T15:06:45.000Z", + "emojis" => [ + %{ + "static_url" => "https://dontbulling.me/emoji/Firefox.gif", + "visible_in_picker" => false, + "shortcode" => "firefox", + "url" => "https://dontbulling.me/emoji/Firefox.gif" + } + ], + "id" => "14", + "attachment" => nil + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/status.ex b/lib/pleroma/web/api_spec/schemas/status.ex index 8b87cb25b..28cde963e 100644 --- a/lib/pleroma/web/api_spec/schemas/status.ex +++ b/lib/pleroma/web/api_spec/schemas/status.ex @@ -184,6 +184,10 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do thread_muted: %Schema{ type: :boolean, description: "`true` if the thread the post belongs to is muted" + }, + parent_visible: %Schema{ + type: :boolean, + description: "`true` if the parent post is visible to the user" } } }, diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex index 3f1a50b96..9bcb9f587 100644 --- a/lib/pleroma/web/common_api/activity_draft.ex +++ b/lib/pleroma/web/common_api/activity_draft.ex @@ -197,6 +197,13 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do defp changes(draft) do direct? = draft.visibility == "direct" + additional = %{"cc" => draft.cc, "directMessage" => direct?} + + additional = + case draft.expires_at do + %NaiveDateTime{} = expires_at -> Map.put(additional, "expires_at", expires_at) + _ -> additional + end changes = %{ @@ -204,7 +211,7 @@ defmodule Pleroma.Web.CommonAPI.ActivityDraft do actor: draft.user, context: draft.context, object: draft.object, - additional: %{"cc" => draft.cc, "directMessage" => direct?} + additional: additional } |> Utils.maybe_add_list_data(draft.user, draft.visibility) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 447dbe4e6..fd7149079 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.CommonAPI do alias Pleroma.ActivityExpiration alias Pleroma.Conversation.Participation alias Pleroma.FollowingRelationship + alias Pleroma.Formatter alias Pleroma.Notification alias Pleroma.Object alias Pleroma.ThreadMute @@ -24,6 +25,60 @@ defmodule Pleroma.Web.CommonAPI do require Pleroma.Constants require Logger + def block(blocker, blocked) do + with {:ok, block_data, _} <- Builder.block(blocker, blocked), + {:ok, block, _} <- Pipeline.common_pipeline(block_data, local: true) do + {:ok, block} + end + end + + def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) do + with maybe_attachment <- opts[:media_id] && Object.get_by_id(opts[:media_id]), + :ok <- validate_chat_content_length(content, !!maybe_attachment), + {_, {:ok, chat_message_data, _meta}} <- + {:build_object, + Builder.chat_message( + user, + recipient.ap_id, + content |> format_chat_content, + attachment: maybe_attachment + )}, + {_, {:ok, create_activity_data, _meta}} <- + {:build_create_activity, Builder.create(user, chat_message_data, [recipient.ap_id])}, + {_, {:ok, %Activity{} = activity, _meta}} <- + {:common_pipeline, + Pipeline.common_pipeline(create_activity_data, + local: true + )} do + {:ok, activity} + end + end + + defp format_chat_content(nil), do: nil + + defp format_chat_content(content) do + {text, _, _} = + content + |> Formatter.html_escape("text/plain") + |> Formatter.linkify() + |> (fn {text, mentions, tags} -> + {String.replace(text, ~r/\r?\n/, "
"), mentions, tags} + end).() + + text + end + + defp validate_chat_content_length(_, true), do: :ok + defp validate_chat_content_length(nil, false), do: {:error, :no_content} + + defp validate_chat_content_length(content, _) do + if String.length(content) <= Pleroma.Config.get([:instance, :chat_limit]) do + :ok + else + {:error, :content_too_long} + end + end + def unblock(blocker, blocked) do with {_, %Activity{} = block} <- {:fetch_block, Utils.fetch_latest_block(blocker, blocked)}, {:ok, unblock_data, _} <- Builder.undo(blocker, block), @@ -73,6 +128,7 @@ defmodule Pleroma.Web.CommonAPI do object: follow_activity.data["id"], type: "Accept" }) do + Notification.update_notification_type(followed, follow_activity) {:ok, follower} end end @@ -127,18 +183,19 @@ defmodule Pleroma.Web.CommonAPI do end def repeat(id, user, params \\ %{}) do - with %Activity{data: %{"type" => "Create"}} = activity <- Activity.get_by_id(id) do - object = Object.normalize(activity) - announce_activity = Utils.get_existing_announce(user.ap_id, object) - public = public_announce?(object, params) - - if announce_activity do - {:ok, announce_activity, object} - else - ActivityPub.announce(user, object, nil, true, public) - end + with %Activity{data: %{"type" => "Create"}} = activity <- Activity.get_by_id(id), + object = %Object{} <- Object.normalize(activity, false), + {_, nil} <- {:existing_announce, Utils.get_existing_announce(user.ap_id, object)}, + public = public_announce?(object, params), + {:ok, announce, _} <- Builder.announce(user, object, public: public), + {:ok, activity, _} <- Pipeline.common_pipeline(announce, local: true) do + {:ok, activity} else - _ -> {:error, :not_found} + {:existing_announce, %Activity{} = announce} -> + {:ok, announce} + + _ -> + {:error, :not_found} end end @@ -373,20 +430,10 @@ defmodule Pleroma.Web.CommonAPI do def post(user, %{status: _} = data) do with {:ok, draft} <- Pleroma.Web.CommonAPI.ActivityDraft.create(user, data) do - draft.changes - |> ActivityPub.create(draft.preview?) - |> maybe_create_activity_expiration(draft.expires_at) + ActivityPub.create(draft.changes, draft.preview?) end end - defp maybe_create_activity_expiration({:ok, activity}, %NaiveDateTime{} = expires_at) do - with {:ok, _} <- ActivityExpiration.create(activity, expires_at) do - {:ok, activity} - end - end - - defp maybe_create_activity_expiration(result, _), do: result - def pin(id, %{ap_id: user_ap_id} = user) do with %Activity{ actor: ^user_ap_id, @@ -426,12 +473,13 @@ defmodule Pleroma.Web.CommonAPI do {:ok, activity} end - def thread_muted?(%{id: nil} = _user, _activity), do: false - - def thread_muted?(user, activity) do - ThreadMute.exists?(user.id, activity.data["context"]) + def thread_muted?(%User{id: user_id}, %{data: %{"context" => context}}) + when is_binary("context") do + ThreadMute.exists?(user_id, context) end + def thread_muted?(_, _), do: false + def report(user, data) do with {:ok, account} <- get_reported_account(data.account_id), {:ok, {content_html, _, _}} <- make_report_content_html(data[:comment]), diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index e8deee223..15594125f 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -102,7 +102,8 @@ defmodule Pleroma.Web.CommonAPI.Utils do end def get_to_and_cc(_user, mentioned_users, inReplyTo, "direct", _) do - if inReplyTo do + # If the OP is a DM already, add the implicit actor. + if inReplyTo && Visibility.is_direct?(inReplyTo) do {Enum.uniq([inReplyTo.data["actor"] | mentioned_users]), []} else {mentioned_users, []} @@ -395,10 +396,12 @@ defmodule Pleroma.Web.CommonAPI.Utils do def to_masto_date(_), do: "" defp shortname(name) do - if String.length(name) < 30 do - name + with max_length when max_length > 0 <- + Config.get([Pleroma.Upload, :filename_display_max_length], 30), + true <- String.length(name) > max_length do + String.slice(name, 0..max_length) <> "…" else - String.slice(name, 0..30) <> "…" + _ -> name end end @@ -426,7 +429,7 @@ defmodule Pleroma.Web.CommonAPI.Utils do %Activity{data: %{"to" => _to, "type" => type} = data} = activity ) when type == "Create" do - object = Object.normalize(activity) + object = Object.normalize(activity, false) object_data = cond do @@ -467,6 +470,8 @@ defmodule Pleroma.Web.CommonAPI.Utils do |> Enum.map(& &1.ap_id) recipients ++ subscriber_ids + else + _e -> recipients end end @@ -478,6 +483,8 @@ defmodule Pleroma.Web.CommonAPI.Utils do |> User.get_followers() |> Enum.map(& &1.ap_id) |> Enum.concat(recipients) + else + _e -> recipients end end diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 5a1316a5f..69946fb81 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -5,6 +5,8 @@ defmodule Pleroma.Web.ControllerHelper do use Pleroma.Web, :controller + alias Pleroma.Pagination + # As in Mastodon API, per https://api.rubyonrails.org/classes/ActiveModel/Type/Boolean.html @falsy_param_values [false, 0, "0", "f", "F", "false", "False", "FALSE", "off", "OFF"] @@ -46,43 +48,53 @@ defmodule Pleroma.Web.ControllerHelper do do: conn def add_link_headers(conn, activities, extra_params) do + case get_pagination_fields(conn, activities, extra_params) do + %{"next" => next_url, "prev" => prev_url} -> + put_resp_header(conn, "link", "<#{next_url}>; rel=\"next\", <#{prev_url}>; rel=\"prev\"") + + _ -> + conn + end + end + + @id_keys Pagination.page_keys() -- ["limit", "order"] + defp build_pagination_fields(conn, min_id, max_id, extra_params) do + params = + conn.params + |> Map.drop(Map.keys(conn.path_params)) + |> Map.merge(extra_params) + |> Map.drop(@id_keys) + + %{ + "next" => current_url(conn, Map.put(params, :max_id, max_id)), + "prev" => current_url(conn, Map.put(params, :min_id, min_id)), + "id" => current_url(conn) + } + end + + def get_pagination_fields(conn, activities, extra_params \\ %{}) do case List.last(activities) do + %{pagination_id: max_id} when not is_nil(max_id) -> + %{pagination_id: min_id} = + activities + |> List.first() + + build_pagination_fields(conn, min_id, max_id, extra_params) + %{id: max_id} -> - params = - conn.params - |> Map.drop(Map.keys(conn.path_params)) - |> Map.drop(["since_id", "max_id", "min_id"]) - |> Map.merge(extra_params) - - limit = - params - |> Map.get("limit", "20") - |> String.to_integer() - - min_id = - if length(activities) <= limit do - activities - |> List.first() - |> Map.get(:id) - else - activities - |> Enum.at(limit * -1) - |> Map.get(:id) - end - - next_url = current_url(conn, Map.merge(params, %{max_id: max_id})) - prev_url = current_url(conn, Map.merge(params, %{min_id: min_id})) + %{id: min_id} = + activities + |> List.first() - put_resp_header(conn, "link", "<#{next_url}>; rel=\"next\", <#{prev_url}>; rel=\"prev\"") + build_pagination_fields(conn, min_id, max_id, extra_params) _ -> - conn + %{} end end def assign_account_by_id(conn, _) do - # TODO: use `conn.params[:id]` only after moving to OpenAPI - case Pleroma.User.get_cached_by_id(conn.params[:id] || conn.params["id"]) do + case Pleroma.User.get_cached_by_id(conn.params.id) do %Pleroma.User{} = account -> assign(conn, :account, account) nil -> Pleroma.Web.MastodonAPI.FallbackController.call(conn, {:error, :not_found}) |> halt() end @@ -99,11 +111,6 @@ defmodule Pleroma.Web.ControllerHelper do render_error(conn, :not_implemented, "Can't display this activity") end - @spec put_if_exist(map(), atom() | String.t(), any) :: map() - def put_if_exist(map, _key, nil), do: map - - def put_if_exist(map, key, value), do: Map.put(map, key, value) - @doc """ Returns true if request specifies to include embedded relationships in account objects. May only be used in selected account-related endpoints; has no effect for status- or diff --git a/lib/pleroma/web/embed_controller.ex b/lib/pleroma/web/embed_controller.ex new file mode 100644 index 000000000..f6b8a5ee1 --- /dev/null +++ b/lib/pleroma/web/embed_controller.ex @@ -0,0 +1,42 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.EmbedController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.User + + alias Pleroma.Web.ActivityPub.Visibility + + plug(:put_layout, :embed) + + def show(conn, %{"id" => id}) do + with %Activity{local: true} = activity <- + Activity.get_by_id_with_object(id), + true <- Visibility.is_public?(activity.object) do + {:ok, author} = User.get_or_fetch(activity.object.data["actor"]) + + conn + |> delete_resp_header("x-frame-options") + |> delete_resp_header("content-security-policy") + |> render("show.html", + activity: activity, + author: User.sanitize_html(author), + counts: get_counts(activity) + ) + end + end + + defp get_counts(%Activity{} = activity) do + %Object{data: data} = Object.normalize(activity) + + %{ + likes: Map.get(data, "like_count", 0), + replies: Map.get(data, "repliesCount", 0), + announces: Map.get(data, "announcement_count", 0) + } + end +end diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex index 0d9d578fc..431ad5485 100644 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ b/lib/pleroma/web/fallback_redirect_controller.ex @@ -9,6 +9,7 @@ defmodule Fallback.RedirectController do alias Pleroma.User alias Pleroma.Web.Metadata + alias Pleroma.Web.Preload def api_not_implemented(conn, _params) do conn @@ -16,16 +17,7 @@ defmodule Fallback.RedirectController do |> json(%{error: "Not implemented"}) end - def redirector(conn, _params, code \\ 200) - - # redirect to admin section - # /pleroma/admin -> /pleroma/admin/ - # - def redirector(conn, %{"path" => ["pleroma", "admin"]} = _, _code) do - redirect(conn, to: "/pleroma/admin/") - end - - def redirector(conn, _params, code) do + def redirector(conn, _params, code \\ 200) do conn |> put_resp_content_type("text/html") |> send_file(code, index_file_path()) @@ -43,28 +35,33 @@ defmodule Fallback.RedirectController do def redirector_with_meta(conn, params) do {:ok, index_content} = File.read(index_file_path()) - tags = - try do - Metadata.build_tags(params) - rescue - e -> - Logger.error( - "Metadata rendering for #{conn.request_path} failed.\n" <> - Exception.format(:error, e, __STACKTRACE__) - ) - - "" - end + tags = build_tags(conn, params) + preloads = preload_data(conn, params) - response = String.replace(index_content, "", tags) + response = + index_content + |> String.replace("", tags <> preloads) conn |> put_resp_content_type("text/html") |> send_resp(200, response) end - def index_file_path do - Pleroma.Plugs.InstanceStatic.file_path("index.html") + def redirector_with_preload(conn, %{"path" => ["pleroma", "admin"]}) do + redirect(conn, to: "/pleroma/admin/") + end + + def redirector_with_preload(conn, params) do + {:ok, index_content} = File.read(index_file_path()) + preloads = preload_data(conn, params) + + response = + index_content + |> String.replace("", preloads) + + conn + |> put_resp_content_type("text/html") + |> send_resp(200, response) end def registration_page(conn, params) do @@ -76,4 +73,36 @@ defmodule Fallback.RedirectController do |> put_status(204) |> text("") end + + defp index_file_path do + Pleroma.Plugs.InstanceStatic.file_path("index.html") + end + + defp build_tags(conn, params) do + try do + Metadata.build_tags(params) + rescue + e -> + Logger.error( + "Metadata rendering for #{conn.request_path} failed.\n" <> + Exception.format(:error, e, __STACKTRACE__) + ) + + "" + end + end + + defp preload_data(conn, params) do + try do + Preload.build_tags(conn, params) + rescue + e -> + Logger.error( + "Preloading for #{conn.request_path} failed.\n" <> + Exception.format(:error, e, __STACKTRACE__) + ) + + "" + end + end end diff --git a/lib/pleroma/web/feed/tag_controller.ex b/lib/pleroma/web/feed/tag_controller.ex index 8133f8480..39b2a766a 100644 --- a/lib/pleroma/web/feed/tag_controller.ex +++ b/lib/pleroma/web/feed/tag_controller.ex @@ -9,14 +9,12 @@ defmodule Pleroma.Web.Feed.TagController do alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.Feed.FeedView - import Pleroma.Web.ControllerHelper, only: [put_if_exist: 3] - def feed(conn, %{"tag" => raw_tag} = params) do {format, tag} = parse_tag(raw_tag) activities = - %{"type" => ["Create"], "tag" => tag} - |> put_if_exist("max_id", params["max_id"]) + %{type: ["Create"], tag: tag} + |> Pleroma.Maps.put_if_present(:max_id, params["max_id"]) |> ActivityPub.fetch_public_activities() conn diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex index 1b72e23dc..d56f43818 100644 --- a/lib/pleroma/web/feed/user_controller.ex +++ b/lib/pleroma/web/feed/user_controller.ex @@ -11,8 +11,6 @@ defmodule Pleroma.Web.Feed.UserController do alias Pleroma.Web.ActivityPub.ActivityPubController alias Pleroma.Web.Feed.FeedView - import Pleroma.Web.ControllerHelper, only: [put_if_exist: 3] - plug(Pleroma.Plugs.SetFormatPlug when action in [:feed_redirect]) action_fallback(:errors) @@ -52,11 +50,11 @@ defmodule Pleroma.Web.Feed.UserController do with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname(nickname)} do activities = %{ - "type" => ["Create"], - "actor_id" => user.ap_id + type: ["Create"], + actor_id: user.ap_id } - |> put_if_exist("max_id", params["max_id"]) - |> ActivityPub.fetch_public_activities() + |> Pleroma.Maps.put_if_present(:max_id, params["max_id"]) + |> ActivityPub.fetch_public_or_unlisted_activities() conn |> put_resp_content_type("application/#{format}+xml") diff --git a/lib/pleroma/web/masto_fe_controller.ex b/lib/pleroma/web/masto_fe_controller.ex index d0d8bc8eb..43ec70021 100644 --- a/lib/pleroma/web/masto_fe_controller.ex +++ b/lib/pleroma/web/masto_fe_controller.ex @@ -49,7 +49,7 @@ defmodule Pleroma.Web.MastoFEController do |> render("manifest.json") end - @doc "PUT /api/web/settings" + @doc "PUT /api/web/settings: Backend-obscure settings blob for MastoFE, don't parse/reuse elsewhere" def put_settings(%{assigns: %{user: user}} = conn, %{"data" => settings} = _params) do with {:ok, _} <- User.mastodon_settings_update(user, settings) do json(conn, %{}) diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 75512442d..b5008d69b 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -14,11 +14,14 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do json_response: 3 ] + alias Pleroma.Maps alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Plugs.RateLimiter alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.ListView alias Pleroma.Web.MastodonAPI.MastodonAPI @@ -81,7 +84,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do plug( RateLimiter, - [name: :relation_id_action, params: ["id", "uri"]] when action in @relationship_actions + [name: :relation_id_action, params: [:id, :uri]] when action in @relationship_actions ) plug(RateLimiter, [name: :relations_actions] when action in @relationship_actions) @@ -139,9 +142,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do end @doc "PATCH /api/v1/accounts/update_credentials" - def update_credentials(%{assigns: %{user: original_user}, body_params: params} = conn, _params) do - user = original_user - + def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _params) do params = params |> Enum.filter(fn {_, value} -> not is_nil(value) end) @@ -162,43 +163,60 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do :discoverable ] |> Enum.reduce(%{}, fn key, acc -> - add_if_present(acc, params, key, key, &{:ok, truthy_param?(&1)}) + Maps.put_if_present(acc, key, params[key], &{:ok, truthy_param?(&1)}) end) - |> add_if_present(params, :display_name, :name) - |> add_if_present(params, :note, :bio) - |> add_if_present(params, :avatar, :avatar) - |> add_if_present(params, :header, :banner) - |> add_if_present(params, :pleroma_background_image, :background) - |> add_if_present( - params, - :fields_attributes, + |> Maps.put_if_present(:name, params[:display_name]) + |> Maps.put_if_present(:bio, params[:note]) + |> Maps.put_if_present(:raw_bio, params[:note]) + |> Maps.put_if_present(:avatar, params[:avatar]) + |> Maps.put_if_present(:banner, params[:header]) + |> Maps.put_if_present(:background, params[:pleroma_background_image]) + |> Maps.put_if_present( :raw_fields, + params[:fields_attributes], &{:ok, normalize_fields_attributes(&1)} ) - |> add_if_present(params, :pleroma_settings_store, :pleroma_settings_store) - |> add_if_present(params, :default_scope, :default_scope) - |> add_if_present(params["source"], "privacy", :default_scope) - |> add_if_present(params, :actor_type, :actor_type) - - changeset = User.update_changeset(user, user_params) - - with {:ok, user} <- User.update_and_set_cache(changeset) do - render(conn, "show.json", user: user, for: user, with_pleroma_settings: true) + |> Maps.put_if_present(:pleroma_settings_store, params[:pleroma_settings_store]) + |> Maps.put_if_present(:default_scope, params[:default_scope]) + |> Maps.put_if_present(:default_scope, params["source"]["privacy"]) + |> Maps.put_if_present(:actor_type, params[:bot], fn bot -> + if bot, do: {:ok, "Service"}, else: {:ok, "Person"} + end) + |> Maps.put_if_present(:actor_type, params[:actor_type]) + + # What happens here: + # + # We want to update the user through the pipeline, but the ActivityPub + # update information is not quite enough for this, because this also + # contains local settings that don't federate and don't even appear + # in the Update activity. + # + # So we first build the normal local changeset, then apply it to the + # user data, but don't persist it. With this, we generate the object + # data for our update activity. We feed this and the changeset as meta + # inforation into the pipeline, where they will be properly updated and + # federated. + with changeset <- User.update_changeset(user, user_params), + {:ok, unpersisted_user} <- Ecto.Changeset.apply_action(changeset, :update), + updated_object <- + Pleroma.Web.ActivityPub.UserView.render("user.json", user: user) + |> Map.delete("@context"), + {:ok, update_data, []} <- Builder.update(user, updated_object), + {:ok, _update, _} <- + Pipeline.common_pipeline(update_data, + local: true, + user_update_changeset: changeset + ) do + render(conn, "show.json", + user: unpersisted_user, + for: unpersisted_user, + with_pleroma_settings: true + ) else _e -> render_error(conn, :forbidden, "Invalid request") end end - defp add_if_present(map, params, params_field, map_field, value_function \\ &{:ok, &1}) do - with true <- is_map(params), - true <- Map.has_key?(params, params_field), - {:ok, new_value} <- value_function.(Map.get(params, params_field)) do - Map.put(map, map_field, new_value) - else - _ -> map - end - end - defp normalize_fields_attributes(fields) do if Enum.all?(fields, &is_tuple/1) do Enum.map(fields, fn {_, v} -> v end) @@ -223,23 +241,21 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do @doc "GET /api/v1/accounts/:id" def show(%{assigns: %{user: for_user}} = conn, %{id: nickname_or_id}) do with %User{} = user <- User.get_cached_by_nickname_or_id(nickname_or_id, for: for_user), - true <- User.visible_for?(user, for_user) do + :visible <- User.visible_for(user, for_user) do render(conn, "show.json", user: user, for: for_user) else - _e -> render_error(conn, :not_found, "Can't find user") + error -> user_visibility_error(conn, error) end end @doc "GET /api/v1/accounts/:id/statuses" def statuses(%{assigns: %{user: reading_user}} = conn, params) do with %User{} = user <- User.get_cached_by_nickname_or_id(params.id, for: reading_user), - true <- User.visible_for?(user, reading_user) do + :visible <- User.visible_for(user, reading_user) do params = params |> Map.delete(:tagged) - |> Enum.filter(&(not is_nil(&1))) - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> Map.put("tag", params[:tagged]) + |> Map.put(:tag, params[:tagged]) activities = ActivityPub.fetch_user_activities(user, reading_user, params) @@ -252,7 +268,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do as: :activity ) else - _e -> render_error(conn, :not_found, "Can't find user") + error -> user_visibility_error(conn, error) + end + end + + defp user_visibility_error(conn, error) do + case error do + :restrict_unauthenticated -> + render_error(conn, :unauthorized, "This API requires an authenticated user") + + _ -> + render_error(conn, :not_found, "Can't find user") end end @@ -359,8 +385,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do @doc "POST /api/v1/accounts/:id/block" def block(%{assigns: %{user: blocker, account: blocked}} = conn, _params) do - with {:ok, _user_block} <- User.block(blocker, blocked), - {:ok, _activity} <- ActivityPub.block(blocker, blocked) do + with {:ok, _activity} <- CommonAPI.block(blocker, blocked) do render(conn, "relationship.json", user: blocker, target: blocked) else {:error, message} -> json_response(conn, :forbidden, %{error: message}) diff --git a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex index bcd12c73f..e25cef30b 100644 --- a/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/notification_controller.ex @@ -42,8 +42,20 @@ defmodule Pleroma.Web.MastodonAPI.NotificationController do end end + @default_notification_types ~w{ + mention + follow + follow_request + reblog + favourite + move + pleroma:emoji_reaction + } def index(%{assigns: %{user: user}} = conn, params) do - params = Map.new(params, fn {k, v} -> {to_string(k), v} end) + params = + Map.new(params, fn {k, v} -> {to_string(k), v} end) + |> Map.put_new("include_types", @default_notification_types) + notifications = MastodonAPI.get_notifications(user, params) conn diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 77e2224e4..e50980122 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -107,28 +107,72 @@ defmodule Pleroma.Web.MastodonAPI.SearchController do ) end - defp resource_search(:v2, "hashtags", query, _options) do + defp resource_search(:v2, "hashtags", query, options) do tags_path = Web.base_url() <> "/tag/" query - |> prepare_tags() + |> prepare_tags(options) |> Enum.map(fn tag -> - tag = String.trim_leading(tag, "#") %{name: tag, url: tags_path <> tag} end) end - defp resource_search(:v1, "hashtags", query, _options) do - query - |> prepare_tags() - |> Enum.map(fn tag -> String.trim_leading(tag, "#") end) + defp resource_search(:v1, "hashtags", query, options) do + prepare_tags(query, options) end - defp prepare_tags(query) do - query - |> String.split() - |> Enum.uniq() - |> Enum.filter(fn tag -> String.starts_with?(tag, "#") end) + defp prepare_tags(query, options) do + tags = + query + |> preprocess_uri_query() + |> String.split(~r/[^#\w]+/u, trim: true) + |> Enum.uniq_by(&String.downcase/1) + + explicit_tags = Enum.filter(tags, fn tag -> String.starts_with?(tag, "#") end) + + tags = + if Enum.any?(explicit_tags) do + explicit_tags + else + tags + end + + tags = Enum.map(tags, fn tag -> String.trim_leading(tag, "#") end) + + tags = + if Enum.empty?(explicit_tags) && !options[:skip_joined_tag] do + add_joined_tag(tags) + else + tags + end + + Pleroma.Pagination.paginate(tags, options) + end + + defp add_joined_tag(tags) do + tags + |> Kernel.++([joined_tag(tags)]) + |> Enum.uniq_by(&String.downcase/1) + end + + # If `query` is a URI, returns last component of its path, otherwise returns `query` + defp preprocess_uri_query(query) do + if query =~ ~r/https?:\/\// do + query + |> String.trim_trailing("/") + |> URI.parse() + |> Map.get(:path) + |> String.split("/") + |> Enum.at(-1) + else + query + end + end + + defp joined_tag(tags) do + tags + |> Enum.map(fn tag -> String.capitalize(tag) end) + |> Enum.join() end defp with_fallback(f, fallback \\ []) do diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex index 9dbf4f33c..468b44b67 100644 --- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex @@ -84,13 +84,13 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do plug( RateLimiter, - [name: :status_id_action, bucket_name: "status_id_action:reblog_unreblog", params: ["id"]] + [name: :status_id_action, bucket_name: "status_id_action:reblog_unreblog", params: [:id]] when action in ~w(reblog unreblog)a ) plug( RateLimiter, - [name: :status_id_action, bucket_name: "status_id_action:fav_unfav", params: ["id"]] + [name: :status_id_action, bucket_name: "status_id_action:fav_unfav", params: [:id]] when action in ~w(favourite unfavourite)a ) @@ -210,7 +210,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do @doc "POST /api/v1/statuses/:id/reblog" def reblog(%{assigns: %{user: user}, body_params: params} = conn, %{id: ap_id_or_id}) do - with {:ok, announce, _activity} <- CommonAPI.repeat(ap_id_or_id, user, params), + with {:ok, announce} <- CommonAPI.repeat(ap_id_or_id, user, params), %Activity{} = announce <- Activity.normalize(announce.data) do try_render(conn, "show.json", %{activity: announce, for: user, as: :activity}) end @@ -359,9 +359,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do with %Activity{} = activity <- Activity.get_by_id(id) do activities = ActivityPub.fetch_activities_for_context(activity.data["context"], %{ - "blocking_user" => user, - "user" => user, - "exclude_id" => activity.id + blocking_user: user, + user: user, + exclude_id: activity.id }) render(conn, "context.json", activity: activity, activities: activities, user: user) @@ -370,11 +370,6 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do @doc "GET /api/v1/favourites" def favourites(%{assigns: %{user: %User{} = user}} = conn, params) do - params = - params - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> Map.take(Pleroma.Pagination.page_keys()) - activities = ActivityPub.fetch_favourites(user, params) conn diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 958567510..4bdd46d7e 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -44,17 +44,15 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do def home(%{assigns: %{user: user}} = conn, params) do params = params - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("reply_filtering_user", user) - |> Map.put("user", user) - - recipients = [user.ap_id | User.following(user)] + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:reply_filtering_user, user) + |> Map.put(:announce_filtering_user, user) + |> Map.put(:user, user) activities = - recipients + [user.ap_id | User.following(user)] |> ActivityPub.fetch_activities(params) |> Enum.reverse() @@ -71,10 +69,9 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do def direct(%{assigns: %{user: user}} = conn, params) do params = params - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> Map.put("type", "Create") - |> Map.put("blocking_user", user) - |> Map.put("user", user) + |> Map.put(:type, "Create") + |> Map.put(:blocking_user, user) + |> Map.put(:user, user) |> Map.put(:visibility, "direct") activities = @@ -93,9 +90,7 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do # GET /api/v1/timelines/public def public(%{assigns: %{user: user}} = conn, params) do - params = Map.new(params, fn {key, value} -> {to_string(key), value} end) - - local_only = params["local"] + local_only = params[:local] cfg_key = if local_only do @@ -111,11 +106,11 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do else activities = params - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", local_only) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create"]) + |> Map.put(:local_only, local_only) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:reply_filtering_user, user) |> ActivityPub.fetch_public_activities() conn @@ -130,39 +125,38 @@ defmodule Pleroma.Web.MastodonAPI.TimelineController do defp hashtag_fetching(params, user, local_only) do tags = - [params["tag"], params["any"]] + [params[:tag], params[:any]] |> List.flatten() |> Enum.uniq() - |> Enum.filter(& &1) - |> Enum.map(&String.downcase(&1)) + |> Enum.reject(&is_nil/1) + |> Enum.map(&String.downcase/1) tag_all = params - |> Map.get("all", []) - |> Enum.map(&String.downcase(&1)) + |> Map.get(:all, []) + |> Enum.map(&String.downcase/1) tag_reject = params - |> Map.get("none", []) - |> Enum.map(&String.downcase(&1)) + |> Map.get(:none, []) + |> Enum.map(&String.downcase/1) _activities = params - |> Map.put("type", "Create") - |> Map.put("local_only", local_only) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - |> Map.put("tag", tags) - |> Map.put("tag_all", tag_all) - |> Map.put("tag_reject", tag_reject) + |> Map.put(:type, "Create") + |> Map.put(:local_only, local_only) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + |> Map.put(:tag, tags) + |> Map.put(:tag_all, tag_all) + |> Map.put(:tag_reject, tag_reject) |> ActivityPub.fetch_public_activities() end # GET /api/v1/timelines/tag/:tag def hashtag(%{assigns: %{user: user}} = conn, params) do - params = Map.new(params, fn {key, value} -> {to_string(key), value} end) - local_only = params["local"] + local_only = params[:local] activities = hashtag_fetching(params, user, local_only) conn diff --git a/lib/pleroma/web/mastodon_api/mastodon_api.ex b/lib/pleroma/web/mastodon_api/mastodon_api.ex index 70da64a7a..694bf5ca8 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api.ex @@ -6,7 +6,6 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPI do import Ecto.Query import Ecto.Changeset - alias Pleroma.Activity alias Pleroma.Notification alias Pleroma.Pagination alias Pleroma.ScheduledActivity @@ -82,15 +81,11 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPI do end defp restrict(query, :include_types, %{include_types: mastodon_types = [_ | _]}) do - ap_types = convert_and_filter_mastodon_types(mastodon_types) - - where(query, [q, a], fragment("? @> ARRAY[?->>'type']::varchar[]", ^ap_types, a.data)) + where(query, [n], n.type in ^mastodon_types) end defp restrict(query, :exclude_types, %{exclude_types: mastodon_types = [_ | _]}) do - ap_types = convert_and_filter_mastodon_types(mastodon_types) - - where(query, [q, a], not fragment("? @> ARRAY[?->>'type']::varchar[]", ^ap_types, a.data)) + where(query, [n], n.type not in ^mastodon_types) end defp restrict(query, :account_ap_id, %{account_ap_id: account_ap_id}) do @@ -98,10 +93,4 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPI do end defp restrict(query, _, _), do: query - - defp convert_and_filter_mastodon_types(types) do - types - |> Enum.map(&Activity.from_mastodon_notification_type/1) - |> Enum.filter(& &1) - end end diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 45fffaad2..a6e64b4ab 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -35,7 +35,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do end def render("show.json", %{user: user} = opts) do - if User.visible_for?(user, opts[:for]) do + if User.visible_for(user, opts[:for]) == :visible do do_render("show.json", opts) else %{} @@ -179,15 +179,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do 0 end - bot = user.actor_type in ["Application", "Service"] + bot = user.actor_type == "Service" emojis = - Enum.map(user.emoji, fn {shortcode, url} -> + Enum.map(user.emoji, fn {shortcode, raw_url} -> + url = MediaProxy.url(raw_url) + %{ - "shortcode" => shortcode, - "url" => url, - "static_url" => url, - "visible_in_picker" => false + shortcode: shortcode, + url: url, + static_url: url, + visible_in_picker: false } end) @@ -222,7 +224,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do fields: user.fields, bot: bot, source: %{ - note: prepare_user_bio(user), + note: user.raw_bio || "", sensitive: false, fields: user.raw_fields, pleroma: %{ @@ -233,6 +235,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do # Pleroma extension pleroma: %{ + ap_id: user.ap_id, confirmation_pending: user.confirmation_pending, tags: user.tags, hide_followers_count: user.hide_followers_count, @@ -257,17 +260,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do |> maybe_put_unread_notification_count(user, opts[:for]) end - defp prepare_user_bio(%User{bio: ""}), do: "" - - defp prepare_user_bio(%User{bio: bio}) when is_binary(bio) do - bio - |> String.replace(~r(
), "\n") - |> Pleroma.HTML.strip_tags() - |> HtmlEntities.decode() - end - - defp prepare_user_bio(_), do: "" - defp username_from_nickname(string) when is_binary(string) do hd(String.split(string, "@")) end diff --git a/lib/pleroma/web/mastodon_api/views/app_view.ex b/lib/pleroma/web/mastodon_api/views/app_view.ex index 36071cd25..e44272c6f 100644 --- a/lib/pleroma/web/mastodon_api/views/app_view.ex +++ b/lib/pleroma/web/mastodon_api/views/app_view.ex @@ -45,10 +45,6 @@ defmodule Pleroma.Web.MastodonAPI.AppView do defp with_vapid_key(data) do vapid_key = Application.get_env(:web_push_encryption, :vapid_details, [])[:public_key] - if vapid_key do - Map.put(data, "vapid_key", vapid_key) - else - data - end + Pleroma.Maps.put_if_present(data, "vapid_key", vapid_key) end end diff --git a/lib/pleroma/web/mastodon_api/views/conversation_view.ex b/lib/pleroma/web/mastodon_api/views/conversation_view.ex index 2b6f84c72..06f0c1728 100644 --- a/lib/pleroma/web/mastodon_api/views/conversation_view.ex +++ b/lib/pleroma/web/mastodon_api/views/conversation_view.ex @@ -23,10 +23,13 @@ defmodule Pleroma.Web.MastodonAPI.ConversationView do last_activity_id = with nil <- participation.last_activity_id do - ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{ - "user" => user, - "blocking_user" => user - }) + ActivityPub.fetch_latest_direct_activity_id_for_context( + participation.conversation.ap_id, + %{ + user: user, + blocking_user: user + } + ) end activity = Activity.get_by_id_with_object(last_activity_id) diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index 8088306c3..35c2fc25c 100644 --- a/lib/pleroma/web/mastodon_api/views/instance_view.ex +++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex @@ -23,7 +23,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do streaming_api: Pleroma.Web.Endpoint.websocket_url() }, stats: Pleroma.Stats.get_stats(), - thumbnail: Pleroma.Web.base_url() <> "/instance/thumbnail.jpeg", + thumbnail: Keyword.get(instance, :instance_thumbnail), languages: ["en"], registrations: Keyword.get(instance, :registrations_open), # Extra (not present in Mastodon): @@ -69,7 +69,8 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do if Config.get([:instance, :safe_dm_mentions]) do "safe_dm_mentions" end, - "pleroma_emoji_reactions" + "pleroma_emoji_reactions", + "pleroma_chat_messages" ] |> Enum.filter(& &1) end @@ -77,7 +78,7 @@ defmodule Pleroma.Web.MastodonAPI.InstanceView do def federation do quarantined = Config.get([:instance, :quarantined_instances], []) - if Config.get([:instance, :mrf_transparency]) do + if Config.get([:mrf, :transparency]) do {:ok, data} = MRF.describe() data diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index c46ddcf55..c97e6d32f 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -6,26 +6,28 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do use Pleroma.Web, :view alias Pleroma.Activity + alias Pleroma.Chat.MessageReference alias Pleroma.Notification + alias Pleroma.Object alias Pleroma.User alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MastodonAPI.NotificationView alias Pleroma.Web.MastodonAPI.StatusView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView + + @parent_types ~w{Like Announce EmojiReact} def render("index.json", %{notifications: notifications, for: reading_user} = opts) do activities = Enum.map(notifications, & &1.activity) parent_activities = activities - |> Enum.filter( - &(Activity.mastodon_notification_type(&1) in [ - "favourite", - "reblog", - "pleroma:emoji_reaction" - ]) - ) + |> Enum.filter(fn + %{data: %{"type" => type}} -> + type in @parent_types + end) |> Enum.map(& &1.data["object"]) |> Activity.create_by_object_ap_id() |> Activity.with_preloaded_object(:left) @@ -42,8 +44,9 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do true -> move_activities_targets = activities - |> Enum.filter(&(Activity.mastodon_notification_type(&1) == "move")) + |> Enum.filter(&(&1.data["type"] == "Move")) |> Enum.map(&User.get_cached_by_ap_id(&1.data["target"])) + |> Enum.filter(& &1) actors = activities @@ -79,52 +82,44 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do end end - mastodon_type = Activity.mastodon_notification_type(activity) - # Note: :relationships contain user mutes (needed for :muted flag in :status) status_render_opts = %{relationships: opts[:relationships]} - - with %{id: _} = account <- - AccountView.render( - "show.json", - %{user: actor, for: reading_user} - ) do - response = %{ - id: to_string(notification.id), - type: mastodon_type, - created_at: CommonAPI.Utils.to_masto_date(notification.inserted_at), - account: account, - pleroma: %{ - is_seen: notification.seen - } + account = AccountView.render("show.json", %{user: actor, for: reading_user}) + + response = %{ + id: to_string(notification.id), + type: notification.type, + created_at: CommonAPI.Utils.to_masto_date(notification.inserted_at), + account: account, + pleroma: %{ + is_muted: User.mutes?(reading_user, actor), + is_seen: notification.seen } + } - case mastodon_type do - "mention" -> - put_status(response, activity, reading_user, status_render_opts) + case notification.type do + "mention" -> + put_status(response, activity, reading_user, status_render_opts) - "favourite" -> - put_status(response, parent_activity_fn.(), reading_user, status_render_opts) + "favourite" -> + put_status(response, parent_activity_fn.(), reading_user, status_render_opts) - "reblog" -> - put_status(response, parent_activity_fn.(), reading_user, status_render_opts) + "reblog" -> + put_status(response, parent_activity_fn.(), reading_user, status_render_opts) - "move" -> - put_target(response, activity, reading_user, %{}) + "move" -> + put_target(response, activity, reading_user, %{}) - "pleroma:emoji_reaction" -> - response - |> put_status(parent_activity_fn.(), reading_user, status_render_opts) - |> put_emoji(activity) + "pleroma:emoji_reaction" -> + response + |> put_status(parent_activity_fn.(), reading_user, status_render_opts) + |> put_emoji(activity) - type when type in ["follow", "follow_request"] -> - response + "pleroma:chat_mention" -> + put_chat_message(response, activity, reading_user, status_render_opts) - _ -> - nil - end - else - _ -> nil + type when type in ["follow", "follow_request"] -> + response end end @@ -132,6 +127,17 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do Map.put(response, :emoji, activity.data["content"]) end + defp put_chat_message(response, activity, reading_user, opts) do + object = Object.normalize(activity) + author = User.get_cached_by_ap_id(object.data["actor"]) + chat = Pleroma.Chat.get(reading_user.id, author.ap_id) + cm_ref = MessageReference.for_chat_and_object(chat, object) + render_opts = Map.merge(opts, %{for: reading_user, chat_message_reference: cm_ref}) + chat_message_render = MessageReferenceView.render("show.json", render_opts) + + Map.put(response, :chat_message, chat_message_render) + end + defp put_status(response, activity, reading_user, opts) do status_render_opts = Map.merge(opts, %{activity: activity, for: reading_user}) status_render = StatusView.render("show.json", status_render_opts) diff --git a/lib/pleroma/web/mastodon_api/views/scheduled_activity_view.ex b/lib/pleroma/web/mastodon_api/views/scheduled_activity_view.ex index 458f6bc78..5b896bf3b 100644 --- a/lib/pleroma/web/mastodon_api/views/scheduled_activity_view.ex +++ b/lib/pleroma/web/mastodon_api/views/scheduled_activity_view.ex @@ -30,7 +30,7 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityView do defp with_media_attachments(data, _), do: data defp status_params(params) do - data = %{ + %{ text: params["status"], sensitive: params["sensitive"], spoiler_text: params["spoiler_text"], @@ -39,10 +39,6 @@ defmodule Pleroma.Web.MastodonAPI.ScheduledActivityView do poll: params["poll"], in_reply_to_id: params["in_reply_to_id"] } - - case params["media_ids"] do - nil -> data - media_ids -> Map.put(data, :media_ids, media_ids) - end + |> Pleroma.Maps.put_if_present(:media_ids, params["media_ids"]) end end diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index e31e45553..00d45bcd4 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -21,7 +21,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do alias Pleroma.Web.MastodonAPI.StatusView alias Pleroma.Web.MediaProxy - import Pleroma.Web.ActivityPub.Visibility, only: [get_visibility: 1] + import Pleroma.Web.ActivityPub.Visibility, only: [get_visibility: 1, visible_for_user?: 2] # TODO: Add cached version. defp get_replied_to_activities([]), do: %{} @@ -364,7 +364,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do expires_at: expires_at, direct_conversation_id: direct_conversation_id, thread_muted: thread_muted?, - emoji_reactions: emoji_reactions + emoji_reactions: emoji_reactions, + parent_visible: visible_for_user?(reply_to, opts[:for]) } } end @@ -377,8 +378,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do page_url_data = URI.parse(page_url) page_url_data = - if rich_media[:url] != nil do - URI.merge(page_url_data, URI.parse(rich_media[:url])) + if is_binary(rich_media["url"]) do + URI.merge(page_url_data, URI.parse(rich_media["url"])) else page_url_data end @@ -386,11 +387,9 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do page_url = page_url_data |> to_string image_url = - if rich_media[:image] != nil do - URI.merge(page_url_data, URI.parse(rich_media[:image])) + if is_binary(rich_media["image"]) do + URI.merge(page_url_data, URI.parse(rich_media["image"])) |> to_string - else - nil end %{ @@ -399,8 +398,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do provider_url: page_url_data.scheme <> "://" <> page_url_data.host, url: page_url, image: image_url |> MediaProxy.url(), - title: rich_media[:title] || "", - description: rich_media[:description] || "", + title: rich_media["title"] || "", + description: rich_media["description"] || "", pleroma: %{ opengraph: rich_media } diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex index c037ff13e..5808861e6 100644 --- a/lib/pleroma/web/media_proxy/invalidation.ex +++ b/lib/pleroma/web/media_proxy/invalidation.ex @@ -5,22 +5,34 @@ defmodule Pleroma.Web.MediaProxy.Invalidation do @moduledoc false - @callback purge(list(String.t()), map()) :: {:ok, String.t()} | {:error, String.t()} + @callback purge(list(String.t()), Keyword.t()) :: {:ok, list(String.t())} | {:error, String.t()} alias Pleroma.Config + alias Pleroma.Web.MediaProxy - @spec purge(list(String.t())) :: {:ok, String.t()} | {:error, String.t()} + @spec enabled?() :: boolean() + def enabled?, do: Config.get([:media_proxy, :invalidation, :enabled]) + + @spec purge(list(String.t()) | String.t()) :: {:ok, list(String.t())} | {:error, String.t()} def purge(urls) do - [:media_proxy, :invalidation, :enabled] - |> Config.get() - |> do_purge(urls) + prepared_urls = prepare_urls(urls) + + if enabled?() do + do_purge(prepared_urls) + else + {:ok, prepared_urls} + end end - defp do_purge(true, urls) do + defp do_purge(urls) do provider = Config.get([:media_proxy, :invalidation, :provider]) options = Config.get(provider) provider.purge(urls, options) end - defp do_purge(_, _), do: :ok + def prepare_urls(urls) do + urls + |> List.wrap() + |> Enum.map(&MediaProxy.url/1) + end end diff --git a/lib/pleroma/web/media_proxy/invalidations/http.ex b/lib/pleroma/web/media_proxy/invalidations/http.ex index 07248df6e..bb81d8888 100644 --- a/lib/pleroma/web/media_proxy/invalidations/http.ex +++ b/lib/pleroma/web/media_proxy/invalidations/http.ex @@ -9,10 +9,10 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Http do require Logger @impl Pleroma.Web.MediaProxy.Invalidation - def purge(urls, opts) do - method = Map.get(opts, :method, :purge) - headers = Map.get(opts, :headers, []) - options = Map.get(opts, :options, []) + def purge(urls, opts \\ []) do + method = Keyword.get(opts, :method, :purge) + headers = Keyword.get(opts, :headers, []) + options = Keyword.get(opts, :options, []) Logger.debug("Running cache purge: #{inspect(urls)}") @@ -22,7 +22,7 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Http do end end) - {:ok, "success"} + {:ok, urls} end defp do_purge(method, url, headers, options) do diff --git a/lib/pleroma/web/media_proxy/invalidations/script.ex b/lib/pleroma/web/media_proxy/invalidations/script.ex index 6be782132..d32ffc50b 100644 --- a/lib/pleroma/web/media_proxy/invalidations/script.ex +++ b/lib/pleroma/web/media_proxy/invalidations/script.ex @@ -10,32 +10,34 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Script do require Logger @impl Pleroma.Web.MediaProxy.Invalidation - def purge(urls, %{script_path: script_path} = _options) do + def purge(urls, opts \\ []) do args = urls |> List.wrap() |> Enum.uniq() |> Enum.join(" ") - path = Path.expand(script_path) - - Logger.debug("Running cache purge: #{inspect(urls)}, #{path}") - - case do_purge(path, [args]) do - {result, exit_status} when exit_status > 0 -> - Logger.error("Error while cache purge: #{inspect(result)}") - {:error, inspect(result)} - - _ -> - {:ok, "success"} - end + opts + |> Keyword.get(:script_path) + |> do_purge([args]) + |> handle_result(urls) end - def purge(_, _), do: {:error, "not found script path"} - - defp do_purge(path, args) do + defp do_purge(script_path, args) when is_binary(script_path) do + path = Path.expand(script_path) + Logger.debug("Running cache purge: #{inspect(args)}, #{inspect(path)}") System.cmd(path, args) rescue - error -> {inspect(error), 1} + error -> error + end + + defp do_purge(_, _), do: {:error, "not found script path"} + + defp handle_result({_result, 0}, urls), do: {:ok, urls} + defp handle_result({:error, error}, urls), do: handle_result(error, urls) + + defp handle_result(error, _) do + Logger.error("Error while cache purge: #{inspect(error)}") + {:error, inspect(error)} end end diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 4e01c14e4..1b6242cb4 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -6,20 +6,53 @@ defmodule Pleroma.Web.MediaProxy do alias Pleroma.Config alias Pleroma.Upload alias Pleroma.Web + alias Pleroma.Web.MediaProxy.Invalidation @base64_opts [padding: false] + @spec in_banned_urls(String.t()) :: boolean() + def in_banned_urls(url), do: elem(Cachex.exists?(:banned_urls_cache, url(url)), 1) + + def remove_from_banned_urls(urls) when is_list(urls) do + Cachex.execute!(:banned_urls_cache, fn cache -> + Enum.each(Invalidation.prepare_urls(urls), &Cachex.del(cache, &1)) + end) + end + + def remove_from_banned_urls(url) when is_binary(url) do + Cachex.del(:banned_urls_cache, url(url)) + end + + def put_in_banned_urls(urls) when is_list(urls) do + Cachex.execute!(:banned_urls_cache, fn cache -> + Enum.each(Invalidation.prepare_urls(urls), &Cachex.put(cache, &1, true)) + end) + end + + def put_in_banned_urls(url) when is_binary(url) do + Cachex.put(:banned_urls_cache, url(url), true) + end + def url(url) when is_nil(url) or url == "", do: nil def url("/" <> _ = url), do: url def url(url) do - if not enabled?() or local?(url) or whitelisted?(url) do + if not enabled?() or not url_proxiable?(url) do url else encode_url(url) end end + @spec url_proxiable?(String.t()) :: boolean() + def url_proxiable?(url) do + if local?(url) or whitelisted?(url) do + false + else + true + end + end + # Note: routing all URLs to preview handler (even local and whitelisted). # Preview handler will call url/1 on decoded URLs, and applicable ones will detour media proxy. def preview_url(url) do diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 12d4401fa..0f4575e2f 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -12,6 +12,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do def remote(conn, %{"sig" => sig64, "url" => url64}) do with {_, true} <- {:enabled, MediaProxy.enabled?()}, + {_, false} <- {:in_banned_urls, MediaProxy.in_banned_urls(url)}, {:ok, url} <- MediaProxy.decode_url(sig64, url64), :ok <- MediaProxy.verify_request_path_and_url(conn, url) do proxy_opts = Config.get([:media_proxy, :proxy_opts], []) @@ -20,6 +21,9 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyController do {:enabled, false} -> send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) + {:in_banned_urls, true} -> + send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) + {:error, :invalid_signature} -> send_resp(conn, 403, Plug.Conn.Status.reason_phrase(403)) diff --git a/lib/pleroma/web/nodeinfo/nodeinfo.ex b/lib/pleroma/web/nodeinfo/nodeinfo.ex new file mode 100644 index 000000000..47fa46376 --- /dev/null +++ b/lib/pleroma/web/nodeinfo/nodeinfo.ex @@ -0,0 +1,91 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Nodeinfo.Nodeinfo do + alias Pleroma.Config + alias Pleroma.Stats + alias Pleroma.User + alias Pleroma.Web.Federator.Publisher + alias Pleroma.Web.MastodonAPI.InstanceView + + # returns a nodeinfo 2.0 map, since 2.1 just adds a repository field + # under software. + def get_nodeinfo("2.0") do + stats = Stats.get_stats() + + staff_accounts = + User.all_superusers() + |> Enum.map(fn u -> u.ap_id end) + + federation = InstanceView.federation() + features = InstanceView.features() + + %{ + version: "2.0", + software: %{ + name: Pleroma.Application.name() |> String.downcase(), + version: Pleroma.Application.version() + }, + protocols: Publisher.gather_nodeinfo_protocol_names(), + services: %{ + inbound: [], + outbound: [] + }, + openRegistrations: Config.get([:instance, :registrations_open]), + usage: %{ + users: %{ + total: Map.get(stats, :user_count, 0) + }, + localPosts: Map.get(stats, :status_count, 0) + }, + metadata: %{ + nodeName: Config.get([:instance, :name]), + nodeDescription: Config.get([:instance, :description]), + private: !Config.get([:instance, :public], true), + suggestions: %{ + enabled: false + }, + staffAccounts: staff_accounts, + federation: federation, + pollLimits: Config.get([:instance, :poll_limits]), + postFormats: Config.get([:instance, :allowed_post_formats]), + uploadLimits: %{ + general: Config.get([:instance, :upload_limit]), + avatar: Config.get([:instance, :avatar_upload_limit]), + banner: Config.get([:instance, :banner_upload_limit]), + background: Config.get([:instance, :background_upload_limit]) + }, + fieldsLimits: %{ + maxFields: Config.get([:instance, :max_account_fields]), + maxRemoteFields: Config.get([:instance, :max_remote_account_fields]), + nameLength: Config.get([:instance, :account_field_name_length]), + valueLength: Config.get([:instance, :account_field_value_length]) + }, + accountActivationRequired: Config.get([:instance, :account_activation_required], false), + invitesEnabled: Config.get([:instance, :invites_enabled], false), + mailerEnabled: Config.get([Pleroma.Emails.Mailer, :enabled], false), + features: features, + restrictedNicknames: Config.get([Pleroma.User, :restricted_nicknames]), + skipThreadContainment: Config.get([:instance, :skip_thread_containment], false) + } + } + end + + def get_nodeinfo("2.1") do + raw_response = get_nodeinfo("2.0") + + updated_software = + raw_response + |> Map.get(:software) + |> Map.put(:repository, Pleroma.Application.repository()) + + raw_response + |> Map.put(:software, updated_software) + |> Map.put(:version, "2.1") + end + + def get_nodeinfo(_version) do + {:error, :missing} + end +end diff --git a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex index 721b599d4..8c7a9e565 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo_controller.ex @@ -5,12 +5,8 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do use Pleroma.Web, :controller - alias Pleroma.Config - alias Pleroma.Stats - alias Pleroma.User alias Pleroma.Web - alias Pleroma.Web.Federator.Publisher - alias Pleroma.Web.MastodonAPI.InstanceView + alias Pleroma.Web.Nodeinfo.Nodeinfo def schemas(conn, _params) do response = %{ @@ -29,102 +25,20 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do json(conn, response) end - # returns a nodeinfo 2.0 map, since 2.1 just adds a repository field - # under software. - def raw_nodeinfo do - stats = Stats.get_stats() - - staff_accounts = - User.all_superusers() - |> Enum.map(fn u -> u.ap_id end) - - features = InstanceView.features() - federation = InstanceView.federation() - - %{ - version: "2.0", - software: %{ - name: Pleroma.Application.name() |> String.downcase(), - version: Pleroma.Application.version() - }, - protocols: Publisher.gather_nodeinfo_protocol_names(), - services: %{ - inbound: [], - outbound: [] - }, - openRegistrations: Config.get([:instance, :registrations_open]), - usage: %{ - users: %{ - total: Map.get(stats, :user_count, 0) - }, - localPosts: Map.get(stats, :status_count, 0) - }, - metadata: %{ - nodeName: Config.get([:instance, :name]), - nodeDescription: Config.get([:instance, :description]), - private: !Config.get([:instance, :public], true), - suggestions: %{ - enabled: false - }, - staffAccounts: staff_accounts, - federation: federation, - pollLimits: Config.get([:instance, :poll_limits]), - postFormats: Config.get([:instance, :allowed_post_formats]), - uploadLimits: %{ - general: Config.get([:instance, :upload_limit]), - avatar: Config.get([:instance, :avatar_upload_limit]), - banner: Config.get([:instance, :banner_upload_limit]), - background: Config.get([:instance, :background_upload_limit]) - }, - fieldsLimits: %{ - maxFields: Config.get([:instance, :max_account_fields]), - maxRemoteFields: Config.get([:instance, :max_remote_account_fields]), - nameLength: Config.get([:instance, :account_field_name_length]), - valueLength: Config.get([:instance, :account_field_value_length]) - }, - accountActivationRequired: Config.get([:instance, :account_activation_required], false), - invitesEnabled: Config.get([:instance, :invites_enabled], false), - mailerEnabled: Config.get([Pleroma.Emails.Mailer, :enabled], false), - features: features, - restrictedNicknames: Config.get([Pleroma.User, :restricted_nicknames]), - skipThreadContainment: Config.get([:instance, :skip_thread_containment], false) - } - } - end - # Schema definition: https://github.com/jhass/nodeinfo/blob/master/schemas/2.0/schema.json # and https://github.com/jhass/nodeinfo/blob/master/schemas/2.1/schema.json - def nodeinfo(conn, %{"version" => "2.0"}) do - conn - |> put_resp_header( - "content-type", - "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8" - ) - |> json(raw_nodeinfo()) - end - - def nodeinfo(conn, %{"version" => "2.1"}) do - raw_response = raw_nodeinfo() - - updated_software = - raw_response - |> Map.get(:software) - |> Map.put(:repository, Pleroma.Application.repository()) - - response = - raw_response - |> Map.put(:software, updated_software) - |> Map.put(:version, "2.1") - - conn - |> put_resp_header( - "content-type", - "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.1#; charset=utf-8" - ) - |> json(response) - end - - def nodeinfo(conn, _) do - render_error(conn, :not_found, "Nodeinfo schema version not handled") + def nodeinfo(conn, %{"version" => version}) do + case Nodeinfo.get_nodeinfo(version) do + {:error, :missing} -> + render_error(conn, :not_found, "Nodeinfo schema version not handled") + + node_info -> + conn + |> put_resp_header( + "content-type", + "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8" + ) + |> json(node_info) + end end end diff --git a/lib/pleroma/web/oauth/app.ex b/lib/pleroma/web/oauth/app.ex index 6a6d5f2e2..df99472e1 100644 --- a/lib/pleroma/web/oauth/app.ex +++ b/lib/pleroma/web/oauth/app.ex @@ -25,12 +25,12 @@ defmodule Pleroma.Web.OAuth.App do timestamps() end - @spec changeset(App.t(), map()) :: Ecto.Changeset.t() + @spec changeset(t(), map()) :: Ecto.Changeset.t() def changeset(struct, params) do cast(struct, params, [:client_name, :redirect_uris, :scopes, :website, :trusted]) end - @spec register_changeset(App.t(), map()) :: Ecto.Changeset.t() + @spec register_changeset(t(), map()) :: Ecto.Changeset.t() def register_changeset(struct, params \\ %{}) do changeset = struct @@ -52,18 +52,19 @@ defmodule Pleroma.Web.OAuth.App do end end - @spec create(map()) :: {:ok, App.t()} | {:error, Ecto.Changeset.t()} + @spec create(map()) :: {:ok, t()} | {:error, Ecto.Changeset.t()} def create(params) do - with changeset <- __MODULE__.register_changeset(%__MODULE__{}, params) do - Repo.insert(changeset) - end + %__MODULE__{} + |> register_changeset(params) + |> Repo.insert() end - @spec update(map()) :: {:ok, App.t()} | {:error, Ecto.Changeset.t()} - def update(params) do - with %__MODULE__{} = app <- Repo.get(__MODULE__, params["id"]), - changeset <- changeset(app, params) do - Repo.update(changeset) + @spec update(pos_integer(), map()) :: {:ok, t()} | {:error, Ecto.Changeset.t()} + def update(id, params) do + with %__MODULE__{} = app <- Repo.get(__MODULE__, id) do + app + |> changeset(params) + |> Repo.update() end end @@ -71,7 +72,7 @@ defmodule Pleroma.Web.OAuth.App do Gets app by attrs or create new with attrs. And updates the scopes if need. """ - @spec get_or_make(map(), list(String.t())) :: {:ok, App.t()} | {:error, Ecto.Changeset.t()} + @spec get_or_make(map(), list(String.t())) :: {:ok, t()} | {:error, Ecto.Changeset.t()} def get_or_make(attrs, scopes) do with %__MODULE__{} = app <- Repo.get_by(__MODULE__, attrs) do update_scopes(app, scopes) @@ -92,7 +93,7 @@ defmodule Pleroma.Web.OAuth.App do |> Repo.update() end - @spec search(map()) :: {:ok, [App.t()], non_neg_integer()} + @spec search(map()) :: {:ok, [t()], non_neg_integer()} def search(params) do query = from(a in __MODULE__) @@ -128,7 +129,7 @@ defmodule Pleroma.Web.OAuth.App do {:ok, Repo.all(query), count} end - @spec destroy(pos_integer()) :: {:ok, App.t()} | {:error, Ecto.Changeset.t()} + @spec destroy(pos_integer()) :: {:ok, t()} | {:error, Ecto.Changeset.t()} def destroy(id) do with %__MODULE__{} = app <- Repo.get(__MODULE__, id) do Repo.delete(app) diff --git a/lib/pleroma/web/oauth/oauth_controller.ex b/lib/pleroma/web/oauth/oauth_controller.ex index 7c804233c..c557778ca 100644 --- a/lib/pleroma/web/oauth/oauth_controller.ex +++ b/lib/pleroma/web/oauth/oauth_controller.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do use Pleroma.Web, :controller alias Pleroma.Helpers.UriHelper + alias Pleroma.Maps alias Pleroma.MFA alias Pleroma.Plugs.RateLimiter alias Pleroma.Registration @@ -108,7 +109,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do if redirect_uri in String.split(app.redirect_uris) do redirect_uri = redirect_uri(conn, redirect_uri) url_params = %{access_token: token.token} - url_params = UriHelper.append_param_if_present(url_params, :state, params["state"]) + url_params = Maps.put_if_present(url_params, :state, params["state"]) url = UriHelper.append_uri_params(redirect_uri, url_params) redirect(conn, external: url) else @@ -147,7 +148,7 @@ defmodule Pleroma.Web.OAuth.OAuthController do if redirect_uri in String.split(app.redirect_uris) do redirect_uri = redirect_uri(conn, redirect_uri) url_params = %{code: auth.token} - url_params = UriHelper.append_param_if_present(url_params, :state, auth_attrs["state"]) + url_params = Maps.put_if_present(url_params, :state, auth_attrs["state"]) url = UriHelper.append_uri_params(redirect_uri, url_params) redirect(conn, external: url) else diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index 6971cd9f8..de1b0b3f0 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -32,13 +32,13 @@ defmodule Pleroma.Web.OStatus.OStatusController do action_fallback(:errors) - def object(%{assigns: %{format: format}} = conn, %{"uuid" => _uuid}) + def object(%{assigns: %{format: format}} = conn, _params) when format in ["json", "activity+json"] do ActivityPubController.call(conn, :object) end - def object(%{assigns: %{format: format}} = conn, %{"uuid" => uuid}) do - with id <- o_status_url(conn, :object, uuid), + def object(%{assigns: %{format: format}} = conn, _params) do + with id <- Endpoint.url() <> conn.request_path, {_, %Activity{} = activity} <- {:activity, Activity.get_create_by_object_ap_id_with_object(id)}, {_, true} <- {:public?, Visibility.is_public?(activity)} do @@ -54,13 +54,13 @@ defmodule Pleroma.Web.OStatus.OStatusController do end end - def activity(%{assigns: %{format: format}} = conn, %{"uuid" => _uuid}) + def activity(%{assigns: %{format: format}} = conn, _params) when format in ["json", "activity+json"] do ActivityPubController.call(conn, :activity) end - def activity(%{assigns: %{format: format}} = conn, %{"uuid" => uuid}) do - with id <- o_status_url(conn, :activity, uuid), + def activity(%{assigns: %{format: format}} = conn, _params) do + with id <- Endpoint.url() <> conn.request_path, {_, %Activity{} = activity} <- {:activity, Activity.normalize(id)}, {_, true} <- {:public?, Visibility.is_public?(activity)} do case format do diff --git a/lib/pleroma/web/pleroma_api/controllers/account_controller.ex b/lib/pleroma/web/pleroma_api/controllers/account_controller.ex index 0a3f45620..f3554d919 100644 --- a/lib/pleroma/web/pleroma_api/controllers/account_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/account_controller.ex @@ -126,10 +126,9 @@ defmodule Pleroma.Web.PleromaAPI.AccountController do def favourites(%{assigns: %{user: for_user, account: user}} = conn, params) do params = params - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> Map.put("type", "Create") - |> Map.put("favorited_by", user.ap_id) - |> Map.put("blocking_user", for_user) + |> Map.put(:type, "Create") + |> Map.put(:favorited_by, user.ap_id) + |> Map.put(:blocking_user, for_user) recipients = if for_user do diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex new file mode 100644 index 000000000..c8ef3d915 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -0,0 +1,174 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only +defmodule Pleroma.Web.PleromaAPI.ChatController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference + alias Pleroma.Object + alias Pleroma.Pagination + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView + alias Pleroma.Web.PleromaAPI.ChatView + + import Ecto.Query + + action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + + plug( + OAuthScopesPlug, + %{scopes: ["write:chats"]} + when action in [ + :post_chat_message, + :create, + :mark_as_read, + :mark_message_as_read, + :delete_message + ] + ) + + plug( + OAuthScopesPlug, + %{scopes: ["read:chats"]} when action in [:messages, :index, :show] + ) + + plug(OpenApiSpex.Plug.CastAndValidate, render_error: Pleroma.Web.ApiSpec.RenderError) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation + + def delete_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ + message_id: message_id, + id: chat_id + }) do + with %MessageReference{} = cm_ref <- + MessageReference.get_by_id(message_id), + ^chat_id <- cm_ref.chat_id |> to_string(), + %Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id), + {:ok, _} <- remove_or_delete(cm_ref, user) do + conn + |> put_view(MessageReferenceView) + |> render("show.json", chat_message_reference: cm_ref) + else + _e -> + {:error, :could_not_delete} + end + end + + defp remove_or_delete( + %{object: %{data: %{"actor" => actor, "id" => id}}}, + %{ap_id: actor} = user + ) do + with %Activity{} = activity <- Activity.get_create_by_object_ap_id(id) do + CommonAPI.delete(activity.id, user) + end + end + + defp remove_or_delete(cm_ref, _) do + cm_ref + |> MessageReference.delete() + end + + def post_chat_message( + %{body_params: params, assigns: %{user: %{id: user_id} = user}} = conn, + %{ + id: id + } + ) do + with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), + %User{} = recipient <- User.get_cached_by_ap_id(chat.recipient), + {:ok, activity} <- + CommonAPI.post_chat_message(user, recipient, params[:content], + media_id: params[:media_id] + ), + message <- Object.normalize(activity, false), + cm_ref <- MessageReference.for_chat_and_object(chat, message) do + conn + |> put_view(MessageReferenceView) + |> render("show.json", for: user, chat_message_reference: cm_ref) + end + end + + def mark_message_as_read(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ + id: chat_id, + message_id: message_id + }) do + with %MessageReference{} = cm_ref <- + MessageReference.get_by_id(message_id), + ^chat_id <- cm_ref.chat_id |> to_string(), + %Chat{user_id: ^user_id} <- Chat.get_by_id(chat_id), + {:ok, cm_ref} <- MessageReference.mark_as_read(cm_ref) do + conn + |> put_view(MessageReferenceView) + |> render("show.json", for: user, chat_message_reference: cm_ref) + end + end + + def mark_as_read( + %{body_params: %{last_read_id: last_read_id}, assigns: %{user: %{id: user_id}}} = conn, + %{id: id} + ) do + with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), + {_n, _} <- + MessageReference.set_all_seen_for_chat(chat, last_read_id) do + conn + |> put_view(ChatView) + |> render("show.json", chat: chat) + end + end + + def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: id} = params) do + with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do + cm_refs = + chat + |> MessageReference.for_chat_query() + |> Pagination.fetch_paginated(params) + + conn + |> put_view(MessageReferenceView) + |> render("index.json", for: user, chat_message_references: cm_refs) + else + _ -> + conn + |> put_status(:not_found) + |> json(%{error: "not found"}) + end + end + + def index(%{assigns: %{user: %{id: user_id} = user}} = conn, _params) do + blocked_ap_ids = User.blocked_users_ap_ids(user) + + chats = + from(c in Chat, + where: c.user_id == ^user_id, + where: c.recipient not in ^blocked_ap_ids, + order_by: [desc: c.updated_at] + ) + |> Repo.all() + + conn + |> put_view(ChatView) + |> render("index.json", chats: chats) + end + + def create(%{assigns: %{user: user}} = conn, params) do + with %User{ap_id: recipient} <- User.get_by_id(params[:id]), + {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do + conn + |> put_view(ChatView) + |> render("show.json", chat: chat) + end + end + + def show(%{assigns: %{user: user}} = conn, params) do + with %Chat{} = chat <- Repo.get_by(Chat, user_id: user.id, id: params[:id]) do + conn + |> put_view(ChatView) + |> render("show.json", chat: chat) + end + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex b/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex new file mode 100644 index 000000000..3d007f324 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex @@ -0,0 +1,94 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ConversationController do + use Pleroma.Web, :controller + + import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] + + alias Pleroma.Conversation.Participation + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.MastodonAPI.StatusView + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(:put_view, Pleroma.Web.MastodonAPI.ConversationView) + plug(OAuthScopesPlug, %{scopes: ["read:statuses"]} when action in [:show, :statuses]) + + plug( + OAuthScopesPlug, + %{scopes: ["write:conversations"]} when action in [:update, :mark_as_read] + ) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaConversationOperation + + def show(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: participation_id}) do + with %Participation{user_id: ^user_id} = participation <- Participation.get(participation_id) do + render(conn, "participation.json", participation: participation, for: user) + else + _error -> + conn + |> put_status(:not_found) + |> json(%{"error" => "Unknown conversation id"}) + end + end + + def statuses( + %{assigns: %{user: %{id: user_id} = user}} = conn, + %{id: participation_id} = params + ) do + with %Participation{user_id: ^user_id} = participation <- + Participation.get(participation_id, preload: [:conversation]) do + params = + params + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + + activities = + participation.conversation.ap_id + |> ActivityPub.fetch_activities_for_context_query(params) + |> Pleroma.Pagination.fetch_paginated(Map.put(params, :total, false)) + |> Enum.reverse() + + conn + |> add_link_headers(activities) + |> put_view(StatusView) + |> render("index.json", activities: activities, for: user, as: :activity) + else + _error -> + conn + |> put_status(:not_found) + |> json(%{"error" => "Unknown conversation id"}) + end + end + + def update( + %{assigns: %{user: %{id: user_id} = user}} = conn, + %{id: participation_id, recipients: recipients} + ) do + with %Participation{user_id: ^user_id} = participation <- Participation.get(participation_id), + {:ok, participation} <- Participation.set_recipients(participation, recipients) do + render(conn, "participation.json", participation: participation, for: user) + else + {:error, message} -> + conn + |> put_status(:bad_request) + |> json(%{"error" => message}) + + _error -> + conn + |> put_status(:not_found) + |> json(%{"error" => "Unknown conversation id"}) + end + end + + def mark_as_read(%{assigns: %{user: user}} = conn, _params) do + with {:ok, _, participations} <- Participation.mark_all_as_read(user) do + conn + |> add_link_headers(participations) + |> render("participations.json", participations: participations, for: user) + end + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex index 2c53dcde1..33ecd1f70 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -37,14 +37,14 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do end end - def index(conn, _params) do + def index(conn, params) do emoji_path = [:instance, :static_dir] |> Pleroma.Config.get!() |> Path.join("emoji") - with {:ok, packs} <- Pack.list_local() do - json(conn, packs) + with {:ok, packs, count} <- Pack.list_local(page: params.page, page_size: params.page_size) do + json(conn, %{packs: packs, count: count}) else {:error, :create_dir, e} -> conn @@ -60,10 +60,10 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do end end - def show(conn, %{name: name}) do + def show(conn, %{name: name, page: page, page_size: page_size}) do name = String.trim(name) - with {:ok, pack} <- Pack.show(name) do + with {:ok, pack} <- Pack.show(name: name, page: page, page_size: page_size) do json(conn, pack) else {:error, :not_found} -> @@ -106,7 +106,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackController do |> put_status(:internal_server_error) |> json(%{error: "The requested instance does not support sharing emoji packs"}) - {:error, :imvalid_checksum} -> + {:error, :invalid_checksum} -> conn |> put_status(:internal_server_error) |> json(%{error: "SHA256 for the pack doesn't match the one sent by the server"}) diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex new file mode 100644 index 000000000..19dcffdf3 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex @@ -0,0 +1,63 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiReactionController do + use Pleroma.Web, :controller + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.MastodonAPI.StatusView + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["write:statuses"]} when action in [:create, :delete]) + + plug( + OAuthScopesPlug, + %{scopes: ["read:statuses"], fallback: :proceed_unauthenticated} + when action == :index + ) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.EmojiReactionOperation + + action_fallback(Pleroma.Web.MastodonAPI.FallbackController) + + def index(%{assigns: %{user: user}} = conn, %{id: activity_id} = params) do + with %Activity{} = activity <- Activity.get_by_id_with_object(activity_id), + %Object{data: %{"reactions" => reactions}} when is_list(reactions) <- + Object.normalize(activity) do + reactions = filter(reactions, params) + render(conn, "index.json", emoji_reactions: reactions, user: user) + else + _e -> json(conn, []) + end + end + + defp filter(reactions, %{emoji: emoji}) when is_binary(emoji) do + Enum.filter(reactions, fn [e, _] -> e == emoji end) + end + + defp filter(reactions, _), do: reactions + + def create(%{assigns: %{user: user}} = conn, %{id: activity_id, emoji: emoji}) do + with {:ok, _activity} <- CommonAPI.react_with_emoji(activity_id, user, emoji) do + activity = Activity.get_by_id(activity_id) + + conn + |> put_view(StatusView) + |> render("show.json", activity: activity, for: user, as: :activity) + end + end + + def delete(%{assigns: %{user: user}} = conn, %{id: activity_id, emoji: emoji}) do + with {:ok, _activity} <- CommonAPI.unreact_with_emoji(activity_id, user, emoji) do + activity = Activity.get_by_id(activity_id) + + conn + |> put_view(StatusView) + |> render("show.json", activity: activity, for: user, as: :activity) + end + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex b/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex new file mode 100644 index 000000000..3ed8bd294 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex @@ -0,0 +1,36 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.NotificationController do + use Pleroma.Web, :controller + + alias Pleroma.Notification + alias Pleroma.Plugs.OAuthScopesPlug + + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug(OAuthScopesPlug, %{scopes: ["write:notifications"]} when action == :mark_as_read) + plug(:put_view, Pleroma.Web.MastodonAPI.NotificationView) + + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaNotificationOperation + + def mark_as_read(%{assigns: %{user: user}, body_params: %{id: notification_id}} = conn, _) do + with {:ok, notification} <- Notification.read_one(user, notification_id) do + render(conn, "show.json", notification: notification, for: user) + else + {:error, message} -> + conn + |> put_status(:bad_request) + |> json(%{"error" => message}) + end + end + + def mark_as_read(%{assigns: %{user: user}, body_params: %{max_id: max_id}} = conn, _) do + notifications = + user + |> Notification.set_read_up_to(max_id) + |> Enum.take(80) + + render(conn, "index.json", notifications: notifications, for: user) + end +end diff --git a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex deleted file mode 100644 index e834133b2..000000000 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ /dev/null @@ -1,220 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do - use Pleroma.Web, :controller - - import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] - - alias Pleroma.Activity - alias Pleroma.Conversation.Participation - alias Pleroma.Notification - alias Pleroma.Object - alias Pleroma.Plugs.OAuthScopesPlug - alias Pleroma.User - alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.CommonAPI - alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.MastodonAPI.ConversationView - alias Pleroma.Web.MastodonAPI.NotificationView - alias Pleroma.Web.MastodonAPI.StatusView - - plug( - OAuthScopesPlug, - %{scopes: ["read:statuses"]} - when action in [:conversation, :conversation_statuses] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["read:statuses"], fallback: :proceed_unauthenticated} - when action == :emoji_reactions_by - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:statuses"]} - when action in [:react_with_emoji, :unreact_with_emoji] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:conversations"]} - when action in [:update_conversation, :mark_conversations_as_read] - ) - - plug( - OAuthScopesPlug, - %{scopes: ["write:notifications"]} when action == :mark_notifications_as_read - ) - - def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id} = params) do - with %Activity{} = activity <- Activity.get_by_id_with_object(activity_id), - %Object{data: %{"reactions" => emoji_reactions}} when is_list(emoji_reactions) <- - Object.normalize(activity) do - reactions = - emoji_reactions - |> Enum.map(fn [emoji, user_ap_ids] -> - if params["emoji"] && params["emoji"] != emoji do - nil - else - users = - Enum.map(user_ap_ids, &User.get_cached_by_ap_id/1) - |> Enum.filter(fn - %{deactivated: false} -> true - _ -> false - end) - - %{ - name: emoji, - count: length(users), - accounts: - AccountView.render("index.json", %{ - users: users, - for: user, - as: :user - }), - me: !!(user && user.ap_id in user_ap_ids) - } - end - end) - |> Enum.filter(& &1) - - conn - |> json(reactions) - else - _e -> - conn - |> json([]) - end - end - - def react_with_emoji(%{assigns: %{user: user}} = conn, %{"id" => activity_id, "emoji" => emoji}) do - with {:ok, _activity} <- CommonAPI.react_with_emoji(activity_id, user, emoji), - activity <- Activity.get_by_id(activity_id) do - conn - |> put_view(StatusView) - |> render("show.json", %{activity: activity, for: user, as: :activity}) - end - end - - def unreact_with_emoji(%{assigns: %{user: user}} = conn, %{ - "id" => activity_id, - "emoji" => emoji - }) do - with {:ok, _activity} <- - CommonAPI.unreact_with_emoji(activity_id, user, emoji), - activity <- Activity.get_by_id(activity_id) do - conn - |> put_view(StatusView) - |> render("show.json", %{activity: activity, for: user, as: :activity}) - end - end - - def conversation(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) do - with %Participation{} = participation <- Participation.get(participation_id), - true <- user.id == participation.user_id do - conn - |> put_view(ConversationView) - |> render("participation.json", %{participation: participation, for: user}) - else - _error -> - conn - |> put_status(404) - |> json(%{"error" => "Unknown conversation id"}) - end - end - - def conversation_statuses( - %{assigns: %{user: %{id: user_id} = user}} = conn, - %{"id" => participation_id} = params - ) do - with %Participation{user_id: ^user_id} = participation <- - Participation.get(participation_id, preload: [:conversation]) do - params = - params - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - - activities = - participation.conversation.ap_id - |> ActivityPub.fetch_activities_for_context_query(params) - |> Pleroma.Pagination.fetch_paginated(Map.put(params, "total", false)) - |> Enum.reverse() - - conn - |> add_link_headers(activities) - |> put_view(StatusView) - |> render("index.json", - activities: activities, - for: user, - as: :activity - ) - else - _error -> - conn - |> put_status(404) - |> json(%{"error" => "Unknown conversation id"}) - end - end - - def update_conversation( - %{assigns: %{user: user}} = conn, - %{"id" => participation_id, "recipients" => recipients} - ) do - with %Participation{} = participation <- Participation.get(participation_id), - true <- user.id == participation.user_id, - {:ok, participation} <- Participation.set_recipients(participation, recipients) do - conn - |> put_view(ConversationView) - |> render("participation.json", %{participation: participation, for: user}) - else - {:error, message} -> - conn - |> put_status(:bad_request) - |> json(%{"error" => message}) - - _error -> - conn - |> put_status(404) - |> json(%{"error" => "Unknown conversation id"}) - end - end - - def mark_conversations_as_read(%{assigns: %{user: user}} = conn, _params) do - with {:ok, _, participations} <- Participation.mark_all_as_read(user) do - conn - |> add_link_headers(participations) - |> put_view(ConversationView) - |> render("participations.json", participations: participations, for: user) - end - end - - def mark_notifications_as_read(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do - with {:ok, notification} <- Notification.read_one(user, notification_id) do - conn - |> put_view(NotificationView) - |> render("show.json", %{notification: notification, for: user}) - else - {:error, message} -> - conn - |> put_status(:bad_request) - |> json(%{"error" => message}) - end - end - - def mark_notifications_as_read(%{assigns: %{user: user}} = conn, %{"max_id" => max_id}) do - with notifications <- Notification.set_read_up_to(user, max_id) do - notifications = Enum.take(notifications, 80) - - conn - |> put_view(NotificationView) - |> render("index.json", - notifications: notifications, - for: user - ) - end - end -end diff --git a/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex b/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex index 8665ca56c..e9a4fba92 100644 --- a/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex @@ -36,10 +36,7 @@ defmodule Pleroma.Web.PleromaAPI.ScrobbleController do def index(%{assigns: %{user: reading_user}} = conn, %{id: id} = params) do with %User{} = user <- User.get_cached_by_nickname_or_id(id, for: reading_user) do - params = - params - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> Map.put("type", ["Listen"]) + params = Map.put(params, :type, ["Listen"]) activities = ActivityPub.fetch_user_abstract_activities(user, reading_user, params) diff --git a/lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex b/lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex new file mode 100644 index 000000000..f2112a86e --- /dev/null +++ b/lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex @@ -0,0 +1,45 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.Chat.MessageReferenceView do + use Pleroma.Web, :view + + alias Pleroma.User + alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MastodonAPI.StatusView + + def render( + "show.json", + %{ + chat_message_reference: %{ + id: id, + object: %{data: chat_message}, + chat_id: chat_id, + unread: unread + } + } + ) do + %{ + id: id |> to_string(), + content: chat_message["content"], + chat_id: chat_id |> to_string(), + account_id: User.get_cached_by_ap_id(chat_message["actor"]).id, + created_at: Utils.to_masto_date(chat_message["published"]), + emojis: StatusView.build_emojis(chat_message["emoji"]), + attachment: + chat_message["attachment"] && + StatusView.render("attachment.json", attachment: chat_message["attachment"]), + unread: unread + } + end + + def render("index.json", opts) do + render_many( + opts[:chat_message_references], + __MODULE__, + "show.json", + Map.put(opts, :as, :chat_message_reference) + ) + end +end diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex new file mode 100644 index 000000000..1c996da11 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -0,0 +1,33 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ChatView do + use Pleroma.Web, :view + + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference + alias Pleroma.User + alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView + + def render("show.json", %{chat: %Chat{} = chat} = opts) do + recipient = User.get_cached_by_ap_id(chat.recipient) + last_message = opts[:last_message] || MessageReference.last_message_for_chat(chat) + + %{ + id: chat.id |> to_string(), + account: AccountView.render("show.json", Map.put(opts, :user, recipient)), + unread: MessageReference.unread_count_for_chat(chat), + last_message: + last_message && + MessageReferenceView.render("show.json", chat_message_reference: last_message), + updated_at: Utils.to_masto_date(chat.updated_at) + } + end + + def render("index.json", %{chats: chats}) do + render_many(chats, __MODULE__, "show.json") + end +end diff --git a/lib/pleroma/web/pleroma_api/views/emoji_reaction_view.ex b/lib/pleroma/web/pleroma_api/views/emoji_reaction_view.ex new file mode 100644 index 000000000..84d2d303d --- /dev/null +++ b/lib/pleroma/web/pleroma_api/views/emoji_reaction_view.ex @@ -0,0 +1,33 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiReactionView do + use Pleroma.Web, :view + + alias Pleroma.Web.MastodonAPI.AccountView + + def render("index.json", %{emoji_reactions: emoji_reactions} = opts) do + render_many(emoji_reactions, __MODULE__, "show.json", opts) + end + + def render("show.json", %{emoji_reaction: [emoji, user_ap_ids], user: user}) do + users = fetch_users(user_ap_ids) + + %{ + name: emoji, + count: length(users), + accounts: render(AccountView, "index.json", users: users, for: user, as: :user), + me: !!(user && user.ap_id in user_ap_ids) + } + end + + defp fetch_users(user_ap_ids) do + user_ap_ids + |> Enum.map(&Pleroma.User.get_cached_by_ap_id/1) + |> Enum.filter(fn + %{deactivated: false} -> true + _ -> false + end) + end +end diff --git a/lib/pleroma/web/preload.ex b/lib/pleroma/web/preload.ex new file mode 100644 index 000000000..90e454468 --- /dev/null +++ b/lib/pleroma/web/preload.ex @@ -0,0 +1,36 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload do + alias Phoenix.HTML + require Logger + + def build_tags(_conn, params) do + preload_data = + Enum.reduce(Pleroma.Config.get([__MODULE__, :providers], []), %{}, fn parser, acc -> + terms = + params + |> parser.generate_terms() + |> Enum.map(fn {k, v} -> {k, Base.encode64(Jason.encode!(v))} end) + |> Enum.into(%{}) + + Map.merge(acc, terms) + end) + + rendered_html = + preload_data + |> Jason.encode!() + |> build_script_tag() + |> HTML.safe_to_string() + + rendered_html + end + + def build_script_tag(content) do + HTML.Tag.content_tag(:script, HTML.raw(content), + id: "initial-results", + type: "application/json" + ) + end +end diff --git a/lib/pleroma/web/preload/instance.ex b/lib/pleroma/web/preload/instance.ex new file mode 100644 index 000000000..50d1f3382 --- /dev/null +++ b/lib/pleroma/web/preload/instance.ex @@ -0,0 +1,50 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.Instance do + alias Pleroma.Plugs.InstanceStatic + alias Pleroma.Web.MastodonAPI.InstanceView + alias Pleroma.Web.Nodeinfo.Nodeinfo + alias Pleroma.Web.Preload.Providers.Provider + + @behaviour Provider + @instance_url "/api/v1/instance" + @panel_url "/instance/panel.html" + @nodeinfo_url "/nodeinfo/2.0.json" + + @impl Provider + def generate_terms(_params) do + %{} + |> build_info_tag() + |> build_panel_tag() + |> build_nodeinfo_tag() + end + + defp build_info_tag(acc) do + info_data = InstanceView.render("show.json", %{}) + + Map.put(acc, @instance_url, info_data) + end + + defp build_panel_tag(acc) do + instance_path = InstanceStatic.file_path(@panel_url |> to_string()) + + if File.exists?(instance_path) do + panel_data = File.read!(instance_path) + Map.put(acc, @panel_url, panel_data) + else + acc + end + end + + defp build_nodeinfo_tag(acc) do + case Nodeinfo.get_nodeinfo("2.0") do + {:error, _} -> + acc + + nodeinfo_data -> + Map.put(acc, @nodeinfo_url, nodeinfo_data) + end + end +end diff --git a/lib/pleroma/web/preload/provider.ex b/lib/pleroma/web/preload/provider.ex new file mode 100644 index 000000000..7ef595a34 --- /dev/null +++ b/lib/pleroma/web/preload/provider.ex @@ -0,0 +1,7 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.Provider do + @callback generate_terms(map()) :: map() +end diff --git a/lib/pleroma/web/preload/status_net.ex b/lib/pleroma/web/preload/status_net.ex new file mode 100644 index 000000000..9b62f87a2 --- /dev/null +++ b/lib/pleroma/web/preload/status_net.ex @@ -0,0 +1,25 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.StatusNet do + alias Pleroma.Web.Preload.Providers.Provider + alias Pleroma.Web.TwitterAPI.UtilController + + @behaviour Provider + @config_url "/api/statusnet/config.json" + + @impl Provider + def generate_terms(_params) do + %{} + |> build_config_tag() + end + + defp build_config_tag(acc) do + resp = + Plug.Test.conn(:get, @config_url |> to_string()) + |> UtilController.config(nil) + + Map.put(acc, @config_url, resp.resp_body) + end +end diff --git a/lib/pleroma/web/preload/timelines.ex b/lib/pleroma/web/preload/timelines.ex new file mode 100644 index 000000000..57de04051 --- /dev/null +++ b/lib/pleroma/web/preload/timelines.ex @@ -0,0 +1,39 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.Timelines do + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.MastodonAPI.StatusView + alias Pleroma.Web.Preload.Providers.Provider + + @behaviour Provider + @public_url "/api/v1/timelines/public" + + @impl Provider + def generate_terms(params) do + build_public_tag(%{}, params) + end + + def build_public_tag(acc, params) do + if Pleroma.Config.get([:restrict_unauthenticated, :timelines, :federated], true) do + acc + else + Map.put(acc, @public_url, public_timeline(params)) + end + end + + defp public_timeline(%{"path" => ["main", "all"]}), do: get_public_timeline(false) + + defp public_timeline(_params), do: get_public_timeline(true) + + defp get_public_timeline(local_only) do + activities = + ActivityPub.fetch_public_activities(%{ + type: ["Create"], + local_only: local_only + }) + + StatusView.render("index.json", activities: activities, for: nil, as: :activity) + end +end diff --git a/lib/pleroma/web/preload/user.ex b/lib/pleroma/web/preload/user.ex new file mode 100644 index 000000000..b3d2e9b8d --- /dev/null +++ b/lib/pleroma/web/preload/user.ex @@ -0,0 +1,26 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.User do + alias Pleroma.User + alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.Preload.Providers.Provider + + @behaviour Provider + @account_url_base "/api/v1/accounts" + + @impl Provider + def generate_terms(%{user: user}) do + build_accounts_tag(%{}, user) + end + + def generate_terms(_params), do: %{} + + def build_accounts_tag(acc, %User{} = user) do + account_data = AccountView.render("show.json", %{user: user, for: user}) + Map.put(acc, "#{@account_url_base}/#{user.id}", account_data) + end + + def build_accounts_tag(acc, _), do: acc +end diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index 691725702..cdb827e76 100644 --- a/lib/pleroma/web/push/impl.ex +++ b/lib/pleroma/web/push/impl.ex @@ -16,8 +16,6 @@ defmodule Pleroma.Web.Push.Impl do require Logger import Ecto.Query - defdelegate mastodon_notification_type(activity), to: Activity - @types ["Create", "Follow", "Announce", "Like", "Move"] @doc "Performs sending notifications for user subscriptions" @@ -31,10 +29,10 @@ defmodule Pleroma.Web.Push.Impl do when activity_type in @types do actor = User.get_cached_by_ap_id(notification.activity.data["actor"]) - mastodon_type = mastodon_notification_type(notification.activity) + mastodon_type = notification.type gcm_api_key = Application.get_env(:web_push_encryption, :gcm_api_key) avatar_url = User.avatar_url(actor) - object = Object.normalize(activity) + object = Object.normalize(activity, false) user = User.get_cached_by_id(user_id) direct_conversation_id = Activity.direct_conversation_id(activity, user) @@ -116,7 +114,7 @@ defmodule Pleroma.Web.Push.Impl do end def build_content(notification, actor, object, mastodon_type) do - mastodon_type = mastodon_type || mastodon_notification_type(notification.activity) + mastodon_type = mastodon_type || notification.type %{ title: format_title(notification, mastodon_type), @@ -126,6 +124,13 @@ defmodule Pleroma.Web.Push.Impl do def format_body(activity, actor, object, mastodon_type \\ nil) + def format_body(_activity, actor, %{data: %{"type" => "ChatMessage", "content" => content}}, _) do + case content do + nil -> "@#{actor.nickname}: (Attachment)" + content -> "@#{actor.nickname}: #{Utils.scrub_html_and_truncate(content, 80)}" + end + end + def format_body( %{activity: %{data: %{"type" => "Create"}}}, actor, @@ -151,7 +156,7 @@ defmodule Pleroma.Web.Push.Impl do mastodon_type ) when type in ["Follow", "Like"] do - mastodon_type = mastodon_type || mastodon_notification_type(notification.activity) + mastodon_type = mastodon_type || notification.type case mastodon_type do "follow" -> "@#{actor.nickname} has followed you" @@ -166,15 +171,14 @@ defmodule Pleroma.Web.Push.Impl do "New Direct Message" end - def format_title(%{activity: activity}, mastodon_type) do - mastodon_type = mastodon_type || mastodon_notification_type(activity) - - case mastodon_type do + def format_title(%{type: type}, mastodon_type) do + case mastodon_type || type do "mention" -> "New Mention" "follow" -> "New Follower" "follow_request" -> "New Follow Request" "reblog" -> "New Repeat" "favourite" -> "New Favorite" + "pleroma:chat_mention" -> "New Chat Message" type -> "New #{String.capitalize(type || "event")}" end end diff --git a/lib/pleroma/web/push/subscription.ex b/lib/pleroma/web/push/subscription.ex index 3e401a490..5b5aa0d59 100644 --- a/lib/pleroma/web/push/subscription.ex +++ b/lib/pleroma/web/push/subscription.ex @@ -25,7 +25,7 @@ defmodule Pleroma.Web.Push.Subscription do timestamps() end - @supported_alert_types ~w[follow favourite mention reblog]a + @supported_alert_types ~w[follow favourite mention reblog pleroma:chat_mention]a defp alerts(%{data: %{alerts: alerts}}) do alerts = Map.take(alerts, @supported_alert_types) diff --git a/lib/pleroma/web/rich_media/helpers.ex b/lib/pleroma/web/rich_media/helpers.ex index 9d3d7f978..1729141e9 100644 --- a/lib/pleroma/web/rich_media/helpers.ex +++ b/lib/pleroma/web/rich_media/helpers.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Web.RichMedia.Helpers do alias Pleroma.Object alias Pleroma.Web.RichMedia.Parser - @spec validate_page_url(any()) :: :ok | :error + @spec validate_page_url(URI.t() | binary()) :: :ok | :error defp validate_page_url(page_url) when is_binary(page_url) do validate_tld = Application.get_env(:auto_linker, :opts)[:validate_tld] @@ -18,8 +18,8 @@ defmodule Pleroma.Web.RichMedia.Helpers do |> parse_uri(page_url) end - defp validate_page_url(%URI{host: host, scheme: scheme, authority: authority}) - when scheme == "https" and not is_nil(authority) do + defp validate_page_url(%URI{host: host, scheme: "https", authority: authority}) + when is_binary(authority) do cond do host in Config.get([:rich_media, :ignore_hosts], []) -> :error diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 40980def8..ef5ead2da 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -91,7 +91,7 @@ defmodule Pleroma.Web.RichMedia.Parser do html |> parse_html() |> maybe_parse() - |> Map.put(:url, url) + |> Map.put("url", url) |> clean_parsed_data() |> check_parsed_data() rescue @@ -105,14 +105,14 @@ defmodule Pleroma.Web.RichMedia.Parser do defp maybe_parse(html) do Enum.reduce_while(parsers(), %{}, fn parser, acc -> case parser.parse(html, acc) do - {:ok, data} -> {:halt, data} - {:error, _msg} -> {:cont, acc} + data when data != %{} -> {:halt, data} + _ -> {:cont, acc} end end) end - defp check_parsed_data(%{title: title} = data) - when is_binary(title) and byte_size(title) > 0 do + defp check_parsed_data(%{"title" => title} = data) + when is_binary(title) and title != "" do {:ok, data} end @@ -123,11 +123,7 @@ defmodule Pleroma.Web.RichMedia.Parser do defp clean_parsed_data(data) do data |> Enum.reject(fn {key, val} -> - with {:ok, _} <- Jason.encode(%{key => val}) do - false - else - _ -> true - end + not match?({:ok, _}, Jason.encode(%{key => val})) end) |> Map.new() end diff --git a/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex b/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex index ae0f36702..3d577e254 100644 --- a/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex +++ b/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex @@ -3,22 +3,15 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do - def parse(html, data, prefix, error_message, key_name, value_name \\ "content") do - meta_data = - html - |> get_elements(key_name, prefix) - |> Enum.reduce(data, fn el, acc -> - attributes = normalize_attributes(el, prefix, key_name, value_name) - - Map.merge(acc, attributes) - end) - |> maybe_put_title(html) - - if Enum.empty?(meta_data) do - {:error, error_message} - else - {:ok, meta_data} - end + def parse(data, html, prefix, key_name, value_name \\ "content") do + html + |> get_elements(key_name, prefix) + |> Enum.reduce(data, fn el, acc -> + attributes = normalize_attributes(el, prefix, key_name, value_name) + + Map.merge(acc, attributes) + end) + |> maybe_put_title(html) end defp get_elements(html, key_name, prefix) do @@ -29,19 +22,19 @@ defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do {_tag, attributes, _children} = html_node data = - Enum.into(attributes, %{}, fn {name, value} -> + Map.new(attributes, fn {name, value} -> {name, String.trim_leading(value, "#{prefix}:")} end) - %{String.to_atom(data[key_name]) => data[value_name]} + %{data[key_name] => data[value_name]} end - defp maybe_put_title(%{title: _} = meta, _), do: meta + defp maybe_put_title(%{"title" => _} = meta, _), do: meta defp maybe_put_title(meta, html) when meta != %{} do case get_page_title(html) do "" -> meta - title -> Map.put_new(meta, :title, title) + title -> Map.put_new(meta, "title", title) end end diff --git a/lib/pleroma/web/rich_media/parsers/oembed_parser.ex b/lib/pleroma/web/rich_media/parsers/oembed_parser.ex index 8f32bf91b..6bdeac89c 100644 --- a/lib/pleroma/web/rich_media/parsers/oembed_parser.ex +++ b/lib/pleroma/web/rich_media/parsers/oembed_parser.ex @@ -5,11 +5,11 @@ defmodule Pleroma.Web.RichMedia.Parsers.OEmbed do def parse(html, _data) do with elements = [_ | _] <- get_discovery_data(html), - {:ok, oembed_url} <- get_oembed_url(elements), + oembed_url when is_binary(oembed_url) <- get_oembed_url(elements), {:ok, oembed_data} <- get_oembed_data(oembed_url) do - {:ok, oembed_data} + oembed_data else - _e -> {:error, "No OEmbed data found"} + _e -> %{} end end @@ -17,19 +17,13 @@ defmodule Pleroma.Web.RichMedia.Parsers.OEmbed do html |> Floki.find("link[type='application/json+oembed']") end - defp get_oembed_url(nodes) do - {"link", attributes, _children} = nodes |> hd() - - {:ok, Enum.into(attributes, %{})["href"]} + defp get_oembed_url([{"link", attributes, _children} | _]) do + Enum.find_value(attributes, fn {k, v} -> if k == "href", do: v end) end defp get_oembed_data(url) do - {:ok, %Tesla.Env{body: json}} = Pleroma.HTTP.get(url, [], adapter: [pool: :media]) - - {:ok, data} = Jason.decode(json) - - data = data |> Map.new(fn {k, v} -> {String.to_atom(k), v} end) - - {:ok, data} + with {:ok, %Tesla.Env{body: json}} <- Pleroma.HTTP.get(url, [], adapter: [pool: :media]) do + Jason.decode(json) + end end end diff --git a/lib/pleroma/web/rich_media/parsers/ogp.ex b/lib/pleroma/web/rich_media/parsers/ogp.ex index 3e9012588..b3b3b059c 100644 --- a/lib/pleroma/web/rich_media/parsers/ogp.ex +++ b/lib/pleroma/web/rich_media/parsers/ogp.ex @@ -3,13 +3,8 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.RichMedia.Parsers.OGP do - def parse(html, data) do - Pleroma.Web.RichMedia.Parsers.MetaTagsParser.parse( - html, - data, - "og", - "No OGP metadata found", - "property" - ) + @deprecated "OGP parser is deprecated. Use TwitterCard instead." + def parse(_html, _data) do + %{} end end diff --git a/lib/pleroma/web/rich_media/parsers/twitter_card.ex b/lib/pleroma/web/rich_media/parsers/twitter_card.ex index 09d4b526e..4a04865d2 100644 --- a/lib/pleroma/web/rich_media/parsers/twitter_card.ex +++ b/lib/pleroma/web/rich_media/parsers/twitter_card.ex @@ -5,18 +5,11 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCard do alias Pleroma.Web.RichMedia.Parsers.MetaTagsParser - @spec parse(String.t(), map()) :: {:ok, map()} | {:error, String.t()} + @spec parse(list(), map()) :: map() def parse(html, data) do data - |> parse_name_attrs(html) - |> parse_property_attrs(html) - end - - defp parse_name_attrs(data, html) do - MetaTagsParser.parse(html, data, "twitter", %{}, "name") - end - - defp parse_property_attrs({_, data}, html) do - MetaTagsParser.parse(html, data, "twitter", "No twitter card metadata found", "property") + |> MetaTagsParser.parse(html, "og", "property") + |> MetaTagsParser.parse(html, "twitter", "name") + |> MetaTagsParser.parse(html, "twitter", "property") end end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index c0599a39c..94f77378b 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -160,14 +160,14 @@ defmodule Pleroma.Web.Router do :right_delete_multiple ) - get("/relay", AdminAPIController, :relay_list) - post("/relay", AdminAPIController, :relay_follow) - delete("/relay", AdminAPIController, :relay_unfollow) + get("/relay", RelayController, :index) + post("/relay", RelayController, :follow) + delete("/relay", RelayController, :unfollow) - post("/users/invite_token", AdminAPIController, :create_invite_token) - get("/users/invites", AdminAPIController, :invites) - post("/users/revoke_invite", AdminAPIController, :revoke_invite) - post("/users/email_invite", AdminAPIController, :email_invite) + post("/users/invite_token", InviteController, :create) + get("/users/invites", InviteController, :index) + post("/users/revoke_invite", InviteController, :revoke) + post("/users/email_invite", InviteController, :email) get("/users/:nickname/password_reset", AdminAPIController, :get_password_reset) patch("/users/force_password_reset", AdminAPIController, :force_password_reset) @@ -183,20 +183,20 @@ defmodule Pleroma.Web.Router do patch("/users/confirm_email", AdminAPIController, :confirm_email) patch("/users/resend_confirmation_email", AdminAPIController, :resend_confirmation_email) - get("/reports", AdminAPIController, :list_reports) - get("/reports/:id", AdminAPIController, :report_show) - patch("/reports", AdminAPIController, :reports_update) - post("/reports/:id/notes", AdminAPIController, :report_notes_create) - delete("/reports/:report_id/notes/:id", AdminAPIController, :report_notes_delete) + get("/reports", ReportController, :index) + get("/reports/:id", ReportController, :show) + patch("/reports", ReportController, :update) + post("/reports/:id/notes", ReportController, :notes_create) + delete("/reports/:report_id/notes/:id", ReportController, :notes_delete) - get("/statuses/:id", AdminAPIController, :status_show) - put("/statuses/:id", AdminAPIController, :status_update) - delete("/statuses/:id", AdminAPIController, :status_delete) - get("/statuses", AdminAPIController, :list_statuses) + get("/statuses/:id", StatusController, :show) + put("/statuses/:id", StatusController, :update) + delete("/statuses/:id", StatusController, :delete) + get("/statuses", StatusController, :index) - get("/config", AdminAPIController, :config_show) - post("/config", AdminAPIController, :config_update) - get("/config/descriptions", AdminAPIController, :config_descriptions) + get("/config", ConfigController, :show) + post("/config", ConfigController, :update) + get("/config/descriptions", ConfigController, :descriptions) get("/need_reboot", AdminAPIController, :need_reboot) get("/restart", AdminAPIController, :restart) @@ -205,10 +205,14 @@ defmodule Pleroma.Web.Router do post("/reload_emoji", AdminAPIController, :reload_emoji) get("/stats", AdminAPIController, :stats) - get("/oauth_app", AdminAPIController, :oauth_app_list) - post("/oauth_app", AdminAPIController, :oauth_app_create) - patch("/oauth_app/:id", AdminAPIController, :oauth_app_update) - delete("/oauth_app/:id", AdminAPIController, :oauth_app_delete) + get("/oauth_app", OAuthAppController, :index) + post("/oauth_app", OAuthAppController, :create) + patch("/oauth_app/:id", OAuthAppController, :update) + delete("/oauth_app/:id", OAuthAppController, :delete) + + get("/media_proxy_caches", MediaProxyCacheController, :index) + post("/media_proxy_caches/delete", MediaProxyCacheController, :delete) + post("/media_proxy_caches/purge", MediaProxyCacheController, :purge) end scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do @@ -298,26 +302,31 @@ defmodule Pleroma.Web.Router do scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do pipe_through(:api) - get("/statuses/:id/reactions/:emoji", PleromaAPIController, :emoji_reactions_by) - get("/statuses/:id/reactions", PleromaAPIController, :emoji_reactions_by) + get("/statuses/:id/reactions/:emoji", EmojiReactionController, :index) + get("/statuses/:id/reactions", EmojiReactionController, :index) end scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do scope [] do pipe_through(:authenticated_api) - get("/conversations/:id/statuses", PleromaAPIController, :conversation_statuses) - get("/conversations/:id", PleromaAPIController, :conversation) - post("/conversations/read", PleromaAPIController, :mark_conversations_as_read) - end + post("/chats/by-account-id/:id", ChatController, :create) + get("/chats", ChatController, :index) + get("/chats/:id", ChatController, :show) + get("/chats/:id/messages", ChatController, :messages) + post("/chats/:id/messages", ChatController, :post_chat_message) + delete("/chats/:id/messages/:message_id", ChatController, :delete_message) + post("/chats/:id/read", ChatController, :mark_as_read) + post("/chats/:id/messages/:message_id/read", ChatController, :mark_message_as_read) - scope [] do - pipe_through(:authenticated_api) + get("/conversations/:id/statuses", ConversationController, :statuses) + get("/conversations/:id", ConversationController, :show) + post("/conversations/read", ConversationController, :mark_as_read) + patch("/conversations/:id", ConversationController, :update) - patch("/conversations/:id", PleromaAPIController, :update_conversation) - put("/statuses/:id/reactions/:emoji", PleromaAPIController, :react_with_emoji) - delete("/statuses/:id/reactions/:emoji", PleromaAPIController, :unreact_with_emoji) - post("/notifications/read", PleromaAPIController, :mark_notifications_as_read) + put("/statuses/:id/reactions/:emoji", EmojiReactionController, :create) + delete("/statuses/:id/reactions/:emoji", EmojiReactionController, :delete) + post("/notifications/read", NotificationController, :mark_as_read) patch("/accounts/update_avatar", AccountController, :update_avatar) patch("/accounts/update_banner", AccountController, :update_banner) @@ -458,6 +467,7 @@ defmodule Pleroma.Web.Router do scope "/api/web", Pleroma.Web do pipe_through(:authenticated_api) + # Backend-obscure settings blob for MastoFE, don't parse/reuse elsewhere put("/settings", MastoFEController, :put_settings) end @@ -560,6 +570,10 @@ defmodule Pleroma.Web.Router do get("/notice/:id", OStatus.OStatusController, :notice) get("/notice/:id/embed_player", OStatus.OStatusController, :notice_player) + # Mastodon compatibility routes + get("/users/:nickname/statuses/:id", OStatus.OStatusController, :object) + get("/users/:nickname/statuses/:id/activity", OStatus.OStatusController, :activity) + get("/users/:nickname/feed", Feed.UserController, :feed, as: :user_feed) get("/users/:nickname", Feed.UserController, :feed_redirect, as: :user_feed) @@ -571,13 +585,6 @@ defmodule Pleroma.Web.Router do get("/mailer/unsubscribe/:token", Mailer.SubscriptionController, :unsubscribe) end - scope "/", Pleroma.Web.ActivityPub do - # XXX: not really ostatus - pipe_through(:ostatus) - - get("/users/:nickname/outbox", ActivityPubController, :outbox) - end - pipeline :ap_service_actor do plug(:accepts, ["activity+json", "json"]) end @@ -602,6 +609,7 @@ defmodule Pleroma.Web.Router do get("/api/ap/whoami", ActivityPubController, :whoami) get("/users/:nickname/inbox", ActivityPubController, :read_inbox) + get("/users/:nickname/outbox", ActivityPubController, :outbox) post("/users/:nickname/outbox", ActivityPubController, :update_outbox) post("/api/ap/upload_media", ActivityPubController, :upload_media) @@ -664,6 +672,8 @@ defmodule Pleroma.Web.Router do post("/auth/password", MastodonAPI.AuthController, :password_reset) get("/web/*path", MastoFEController, :index) + + get("/embed/:id", EmbedController, :show) end scope "/proxy/", Pleroma.Web.MediaProxy do @@ -718,7 +728,7 @@ defmodule Pleroma.Web.Router do get("/registration/:token", RedirectController, :registration_page) get("/:maybe_nickname_or_id", RedirectController, :redirector_with_meta) get("/api*path", RedirectController, :api_not_implemented) - get("/*path", RedirectController, :redirector) + get("/*path", RedirectController, :redirector_with_preload) options("/*path", RedirectController, :empty) end diff --git a/lib/pleroma/web/static_fe/static_fe_controller.ex b/lib/pleroma/web/static_fe/static_fe_controller.ex index c3efb6651..a7a891b13 100644 --- a/lib/pleroma/web/static_fe/static_fe_controller.ex +++ b/lib/pleroma/web/static_fe/static_fe_controller.ex @@ -111,8 +111,14 @@ defmodule Pleroma.Web.StaticFE.StaticFEController do %User{} = user -> meta = Metadata.build_tags(%{user: user}) + params = + params + |> Map.take(@page_keys) + |> Map.new(fn {k, v} -> {String.to_existing_atom(k), v} end) + timeline = - ActivityPub.fetch_user_activities(user, nil, Map.take(params, @page_keys)) + user + |> ActivityPub.fetch_user_activities(nil, params) |> Enum.map(&represent/1) prev_page_id = diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index 49a400df7..73ee3e1e1 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.Streamer do require Logger alias Pleroma.Activity + alias Pleroma.Chat.MessageReference alias Pleroma.Config alias Pleroma.Conversation.Participation alias Pleroma.Notification @@ -22,7 +23,7 @@ defmodule Pleroma.Web.Streamer do def registry, do: @registry @public_streams ["public", "public:local", "public:media", "public:local:media"] - @user_streams ["user", "user:notification", "direct"] + @user_streams ["user", "user:notification", "direct", "user:pleroma_chat"] @doc "Expands and authorizes a stream, and registers the process for streaming." @spec get_topic_and_add_socket(stream :: String.t(), User.t() | nil, Map.t() | nil) :: @@ -89,34 +90,20 @@ defmodule Pleroma.Web.Streamer do if should_env_send?(), do: Registry.unregister(@registry, topic) end - def stream(topics, item) when is_list(topics) do + def stream(topics, items) do if should_env_send?() do - Enum.each(topics, fn t -> - spawn(fn -> do_stream(t, item) end) + List.wrap(topics) + |> Enum.each(fn topic -> + List.wrap(items) + |> Enum.each(fn item -> + spawn(fn -> do_stream(topic, item) end) + end) end) end :ok end - def stream(topic, items) when is_list(items) do - if should_env_send?() do - Enum.each(items, fn i -> - spawn(fn -> do_stream(topic, i) end) - end) - - :ok - end - end - - def stream(topic, item) do - if should_env_send?() do - spawn(fn -> do_stream(topic, item) end) - end - - :ok - end - def filtered_by_user?(%User{} = user, %Activity{} = item) do %{block: blocked_ap_ids, mute: muted_ap_ids, reblog_mute: reblog_muted_ap_ids} = User.outgoing_relationships_ap_ids(user, [:block, :mute, :reblog_mute]) @@ -129,6 +116,7 @@ defmodule Pleroma.Web.Streamer do true <- Enum.all?([blocked_ap_ids, muted_ap_ids], &(item.actor not in &1)), true <- item.data["type"] != "Announce" || item.actor not in reblog_muted_ap_ids, + true <- !(item.data["type"] == "Announce" && parent.data["actor"] == user.ap_id), true <- Enum.all?([blocked_ap_ids, muted_ap_ids], &(parent.data["actor"] not in &1)), true <- MapSet.disjoint?(recipients, recipient_blocks), %{host: item_host} <- URI.parse(item.actor), @@ -136,7 +124,7 @@ defmodule Pleroma.Web.Streamer do false <- Pleroma.Web.ActivityPub.MRF.subdomain_match?(domain_blocks, item_host), false <- Pleroma.Web.ActivityPub.MRF.subdomain_match?(domain_blocks, parent_host), true <- thread_containment(item, user), - false <- CommonAPI.thread_muted?(user, item) do + false <- CommonAPI.thread_muted?(user, parent) do false else _ -> true @@ -200,6 +188,19 @@ defmodule Pleroma.Web.Streamer do end) end + defp do_stream(topic, {user, %MessageReference{} = cm_ref}) + when topic in ["user", "user:pleroma_chat"] do + topic = "#{topic}:#{user.id}" + + text = StreamerView.render("chat_update.json", %{chat_message_reference: cm_ref}) + + Registry.dispatch(@registry, topic, fn list -> + Enum.each(list, fn {pid, _auth} -> + send(pid, {:text, text}) + end) + end) + end + defp do_stream("user", item) do Logger.debug("Trying to push to users") diff --git a/lib/pleroma/web/templates/embed/_attachment.html.eex b/lib/pleroma/web/templates/embed/_attachment.html.eex new file mode 100644 index 000000000..7e04e9550 --- /dev/null +++ b/lib/pleroma/web/templates/embed/_attachment.html.eex @@ -0,0 +1,8 @@ +<%= case @mediaType do %> +<% "audio" -> %> + +<% "video" -> %> + +<% _ -> %> +<%= @name %> +<% end %> diff --git a/lib/pleroma/web/templates/embed/show.html.eex b/lib/pleroma/web/templates/embed/show.html.eex new file mode 100644 index 000000000..05a3f0ee3 --- /dev/null +++ b/lib/pleroma/web/templates/embed/show.html.eex @@ -0,0 +1,76 @@ +
+ + +
+ <%= if status_title(@activity) != "" do %> +
open<% end %>> + <%= raw status_title(@activity) %> +
<%= activity_content(@activity) %>
+
+ <% else %> +
<%= activity_content(@activity) %>
+ <% end %> + <%= for %{"name" => name, "url" => [url | _]} <- attachments(@activity) do %> +
+ <%= if sensitive?(@activity) do %> +
+ <%= Gettext.gettext("sensitive media") %> +
+ <%= render("_attachment.html", %{name: name, url: url["href"], + mediaType: fetch_media_type(url)}) %> +
+
+ <% else %> + <%= render("_attachment.html", %{name: name, url: url["href"], + mediaType: fetch_media_type(url)}) %> + <% end %> +
+ <% end %> +
+ +
+
<%= Gettext.gettext("replies") %>
<%= @counts.replies %>
+
<%= Gettext.gettext("announces") %>
<%= @counts.announces %>
+
<%= Gettext.gettext("likes") %>
<%= @counts.likes %>
+
+ +

+ <%= link published(@activity), to: activity_url(@author, @activity) %> +

+
+ + diff --git a/lib/pleroma/web/templates/layout/embed.html.eex b/lib/pleroma/web/templates/layout/embed.html.eex new file mode 100644 index 000000000..8b905f070 --- /dev/null +++ b/lib/pleroma/web/templates/layout/embed.html.eex @@ -0,0 +1,15 @@ + + + + + + <%= Pleroma.Config.get([:instance, :name]) %> + + <%= Phoenix.HTML.raw(assigns[:meta] || "") %> + + + + + <%= render @view_module, @view_template, assigns %> + + diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index fd2aee175..aaca182ec 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -15,6 +15,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do alias Pleroma.User alias Pleroma.Web alias Pleroma.Web.CommonAPI + alias Pleroma.Web.TwitterAPI.UtilView alias Pleroma.Web.WebFinger plug(Pleroma.Web.FederatingPlug when action == :remote_subscribe) @@ -90,17 +91,7 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do def config(%{assigns: %{format: "xml"}} = conn, _params) do instance = Pleroma.Config.get(:instance) - - response = """ - - - #{Keyword.get(instance, :name)} - #{Web.base_url()} - #{Keyword.get(instance, :limit)} - #{!Keyword.get(instance, :registrations_open)} - - - """ + response = UtilView.status_net_config(instance) conn |> put_resp_content_type("application/xml") diff --git a/lib/pleroma/web/twitter_api/views/util_view.ex b/lib/pleroma/web/twitter_api/views/util_view.ex index 52054e020..d3bdb4f62 100644 --- a/lib/pleroma/web/twitter_api/views/util_view.ex +++ b/lib/pleroma/web/twitter_api/views/util_view.ex @@ -5,4 +5,18 @@ defmodule Pleroma.Web.TwitterAPI.UtilView do use Pleroma.Web, :view import Phoenix.HTML.Form + alias Pleroma.Web + + def status_net_config(instance) do + """ + + + #{Keyword.get(instance, :name)} + #{Web.base_url()} + #{Keyword.get(instance, :limit)} + #{!Keyword.get(instance, :registrations_open)} + + + """ + end end diff --git a/lib/pleroma/web/views/embed_view.ex b/lib/pleroma/web/views/embed_view.ex new file mode 100644 index 000000000..5f50bd155 --- /dev/null +++ b/lib/pleroma/web/views/embed_view.ex @@ -0,0 +1,74 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.EmbedView do + use Pleroma.Web, :view + + alias Calendar.Strftime + alias Pleroma.Activity + alias Pleroma.Emoji.Formatter + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.Gettext + alias Pleroma.Web.MediaProxy + alias Pleroma.Web.Metadata.Utils + alias Pleroma.Web.Router.Helpers + + use Phoenix.HTML + + @media_types ["image", "audio", "video"] + + defp fetch_media_type(%{"mediaType" => mediaType}) do + Utils.fetch_media_type(@media_types, mediaType) + end + + defp open_content? do + Pleroma.Config.get( + [:frontend_configurations, :collapse_message_with_subjects], + true + ) + end + + defp full_nickname(user) do + %{host: host} = URI.parse(user.ap_id) + "@" <> user.nickname <> "@" <> host + end + + defp status_title(%Activity{object: %Object{data: %{"name" => name}}}) when is_binary(name), + do: name + + defp status_title(%Activity{object: %Object{data: %{"summary" => summary}}}) + when is_binary(summary), + do: summary + + defp status_title(_), do: nil + + defp activity_content(%Activity{object: %Object{data: %{"content" => content}}}) do + content |> Pleroma.HTML.filter_tags() |> raw() + end + + defp activity_content(_), do: nil + + defp activity_url(%User{local: true}, activity) do + Helpers.o_status_url(Pleroma.Web.Endpoint, :notice, activity) + end + + defp activity_url(%User{local: false}, %Activity{object: %Object{data: data}}) do + data["url"] || data["external_url"] || data["id"] + end + + defp attachments(%Activity{object: %Object{data: %{"attachment" => attachments}}}) do + attachments + end + + defp sensitive?(%Activity{object: %Object{data: %{"sensitive" => sensitive}}}) do + sensitive + end + + defp published(%Activity{object: %Object{data: %{"published" => published}}}) do + published + |> NaiveDateTime.from_iso8601!() + |> Strftime.strftime!("%B %d, %Y, %l:%M %p") + end +end diff --git a/lib/pleroma/web/views/masto_fe_view.ex b/lib/pleroma/web/views/masto_fe_view.ex index c3096006e..f739dacb6 100644 --- a/lib/pleroma/web/views/masto_fe_view.ex +++ b/lib/pleroma/web/views/masto_fe_view.ex @@ -86,7 +86,7 @@ defmodule Pleroma.Web.MastoFEView do "video\/mp4" ] }, - settings: user.settings || @default_settings, + settings: user.mastofe_settings || @default_settings, push_subscription: nil, accounts: %{user.id => render(AccountView, "show.json", user: user, for: user)}, custom_emojis: render(CustomEmojiView, "index.json", custom_emojis: custom_emojis), diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index 237b29ded..476a33245 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -51,6 +51,29 @@ defmodule Pleroma.Web.StreamerView do |> Jason.encode!() end + def render("chat_update.json", %{chat_message_reference: cm_ref}) do + # Explicitly giving the cmr for the object here, so we don't accidentally + # send a later 'last_message' that was inserted between inserting this and + # streaming it out + # + # It also contains the chat with a cache of the correct unread count + Logger.debug("Trying to stream out #{inspect(cm_ref)}") + + representation = + Pleroma.Web.PleromaAPI.ChatView.render( + "show.json", + %{last_message: cm_ref, chat: cm_ref.chat} + ) + + %{ + event: "pleroma:chat_update", + payload: + representation + |> Jason.encode!() + } + |> Jason.encode!() + end + def render("conversation.json", %Participation{} = participation) do %{ event: "conversation", diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex index 49352db2a..8deeabda0 100644 --- a/lib/pleroma/workers/attachments_cleanup_worker.ex +++ b/lib/pleroma/workers/attachments_cleanup_worker.ex @@ -18,13 +18,19 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do }, _job ) do - hrefs = - Enum.flat_map(attachments, fn attachment -> - Enum.map(attachment["url"], & &1["href"]) - end) + attachments + |> Enum.flat_map(fn item -> Enum.map(item["url"], & &1["href"]) end) + |> fetch_objects + |> prepare_objects(actor, Enum.map(attachments, & &1["name"])) + |> filter_objects + |> do_clean - names = Enum.map(attachments, & &1["name"]) + {:ok, :success} + end + + def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: {:ok, :skip} + defp do_clean({object_ids, attachment_urls}) do uploader = Pleroma.Config.get([Pleroma.Upload, :uploader]) prefix = @@ -39,68 +45,70 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do "/" ) - # find all objects for copies of the attachments, name and actor doesn't matter here - object_ids_and_hrefs = - from(o in Object, - where: - fragment( - "to_jsonb(array(select jsonb_array_elements((?)#>'{url}') ->> 'href' where jsonb_typeof((?)#>'{url}') = 'array'))::jsonb \\?| (?)", - o.data, - o.data, - ^hrefs - ) - ) - # The query above can be time consumptive on large instances until we - # refactor how uploads are stored - |> Repo.all(timeout: :infinity) - # we should delete 1 object for any given attachment, but don't delete - # files if there are more than 1 object for it - |> Enum.reduce(%{}, fn %{ - id: id, - data: %{ - "url" => [%{"href" => href}], - "actor" => obj_actor, - "name" => name - } - }, - acc -> - Map.update(acc, href, %{id: id, count: 1}, fn val -> - case obj_actor == actor and name in names do - true -> - # set id of the actor's object that will be deleted - %{val | id: id, count: val.count + 1} - - false -> - # another actor's object, just increase count to not delete file - %{val | count: val.count + 1} - end - end) - end) - |> Enum.map(fn {href, %{id: id, count: count}} -> - # only delete files that have single instance - with 1 <- count do - href - |> String.trim_leading("#{base_url}/#{prefix}") - |> uploader.delete_file() - - {id, href} - else - _ -> {id, nil} - end - end) + Enum.each(attachment_urls, fn href -> + href + |> String.trim_leading("#{base_url}/#{prefix}") + |> uploader.delete_file() + end) - object_ids = Enum.map(object_ids_and_hrefs, fn {id, _} -> id end) + delete_objects(object_ids) + end - from(o in Object, where: o.id in ^object_ids) - |> Repo.delete_all() + defp delete_objects([_ | _] = object_ids) do + Repo.delete_all(from(o in Object, where: o.id in ^object_ids)) + end - object_ids_and_hrefs - |> Enum.filter(fn {_, href} -> not is_nil(href) end) - |> Enum.map(&elem(&1, 1)) - |> Pleroma.Web.MediaProxy.Invalidation.purge() + defp delete_objects(_), do: :ok - {:ok, :success} + # we should delete 1 object for any given attachment, but don't delete + # files if there are more than 1 object for it + defp filter_objects(objects) do + Enum.reduce(objects, {[], []}, fn {href, %{id: id, count: count}}, {ids, hrefs} -> + with 1 <- count do + {ids ++ [id], hrefs ++ [href]} + else + _ -> {ids ++ [id], hrefs} + end + end) end - def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: {:ok, :skip} + defp prepare_objects(objects, actor, names) do + objects + |> Enum.reduce(%{}, fn %{ + id: id, + data: %{ + "url" => [%{"href" => href}], + "actor" => obj_actor, + "name" => name + } + }, + acc -> + Map.update(acc, href, %{id: id, count: 1}, fn val -> + case obj_actor == actor and name in names do + true -> + # set id of the actor's object that will be deleted + %{val | id: id, count: val.count + 1} + + false -> + # another actor's object, just increase count to not delete file + %{val | count: val.count + 1} + end + end) + end) + end + + defp fetch_objects(hrefs) do + from(o in Object, + where: + fragment( + "to_jsonb(array(select jsonb_array_elements((?)#>'{url}') ->> 'href' where jsonb_typeof((?)#>'{url}') = 'array'))::jsonb \\?| (?)", + o.data, + o.data, + ^hrefs + ) + ) + # The query above can be time consumptive on large instances until we + # refactor how uploads are stored + |> Repo.all(timeout: :infinity) + end end diff --git a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex b/lib/pleroma/workers/cron/clear_oauth_token_worker.ex index 341eff054..a4c3b9516 100644 --- a/lib/pleroma/workers/cron/clear_oauth_token_worker.ex +++ b/lib/pleroma/workers/cron/clear_oauth_token_worker.ex @@ -16,6 +16,8 @@ defmodule Pleroma.Workers.Cron.ClearOauthTokenWorker do def perform(_opts, _job) do if Config.get([:oauth2, :clean_expired_tokens], false) do Token.delete_expired_tokens() + else + :ok end end end diff --git a/lib/pleroma/workers/cron/digest_emails_worker.ex b/lib/pleroma/workers/cron/digest_emails_worker.ex index dd13c3b17..7f09ff3cf 100644 --- a/lib/pleroma/workers/cron/digest_emails_worker.ex +++ b/lib/pleroma/workers/cron/digest_emails_worker.ex @@ -37,6 +37,8 @@ defmodule Pleroma.Workers.Cron.DigestEmailsWorker do ) |> Repo.all() |> send_emails + else + :ok end end diff --git a/lib/pleroma/workers/cron/new_users_digest_worker.ex b/lib/pleroma/workers/cron/new_users_digest_worker.ex index 9bd0a5621..5c816b3fe 100644 --- a/lib/pleroma/workers/cron/new_users_digest_worker.ex +++ b/lib/pleroma/workers/cron/new_users_digest_worker.ex @@ -55,7 +55,11 @@ defmodule Pleroma.Workers.Cron.NewUsersDigestWorker do |> Repo.all() |> Enum.map(&Pleroma.Emails.NewUsersDigestEmail.new_users(&1, users_and_statuses)) |> Enum.each(&Pleroma.Emails.Mailer.deliver/1) + else + :ok end + else + :ok end end end diff --git a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex b/lib/pleroma/workers/cron/purge_expired_activities_worker.ex index b8953dd7f..84b3b84de 100644 --- a/lib/pleroma/workers/cron/purge_expired_activities_worker.ex +++ b/lib/pleroma/workers/cron/purge_expired_activities_worker.ex @@ -23,6 +23,8 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker do def perform(_opts, _job) do if Config.get([ActivityExpiration, :enabled]) do Enum.each(ActivityExpiration.due_expirations(@interval), &delete_activity/1) + else + :ok end end diff --git a/mix.exs b/mix.exs index 3215086ca..dc25741cf 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ defmodule Pleroma.Mixfile do [ app: :pleroma, version: version("2.0.50"), - elixir: "~> 1.8", + elixir: "~> 1.9", elixirc_paths: elixirc_paths(Mix.env()), compilers: [:phoenix, :gettext] ++ Mix.compilers(), elixirc_options: [warnings_as_errors: warnings_as_errors(Mix.env())], @@ -117,7 +117,7 @@ defmodule Pleroma.Mixfile do defp deps do [ {:phoenix, "~> 1.4.8"}, - {:tzdata, "~> 0.5.21"}, + {:tzdata, "~> 1.0.3"}, {:plug_cowboy, "~> 2.0"}, {:phoenix_pubsub, "~> 1.1"}, {:phoenix_ecto, "~> 4.0"}, @@ -159,7 +159,10 @@ defmodule Pleroma.Mixfile do {:cors_plug, "~> 1.5"}, {:ex_doc, "~> 0.21", only: :dev, runtime: false}, {:web_push_encryption, "~> 0.2.1"}, - {:swoosh, "~> 0.23.2"}, + {:swoosh, + git: "https://github.com/swoosh/swoosh", + ref: "c96e0ca8a00d8f211ec1f042a4626b09f249caa5", + override: true}, {:phoenix_swoosh, "~> 0.2"}, {:gen_smtp, "~> 0.13"}, {:websocket_client, git: "https://github.com/jeremyong/websocket_client.git", only: :test}, @@ -232,32 +235,37 @@ defmodule Pleroma.Mixfile do defp version(version) do identifier_filter = ~r/[^0-9a-z\-]+/i - # Pre-release version, denoted from patch version with a hyphen - {tag, tag_err} = - System.cmd("git", ["describe", "--tags", "--abbrev=0"], stderr_to_stdout: true) - - {describe, describe_err} = System.cmd("git", ["describe", "--tags", "--abbrev=8"]) - {commit_hash, commit_hash_err} = System.cmd("git", ["rev-parse", "--short", "HEAD"]) + {_cmdgit, cmdgit_err} = System.cmd("sh", ["-c", "command -v git"]) git_pre_release = - cond do - tag_err == 0 and describe_err == 0 -> - describe - |> String.trim() - |> String.replace(String.trim(tag), "") - |> String.trim_leading("-") - |> String.trim() + if cmdgit_err == 0 do + {tag, tag_err} = + System.cmd("git", ["describe", "--tags", "--abbrev=0"], stderr_to_stdout: true) + + {describe, describe_err} = System.cmd("git", ["describe", "--tags", "--abbrev=8"]) + {commit_hash, commit_hash_err} = System.cmd("git", ["rev-parse", "--short", "HEAD"]) - commit_hash_err == 0 -> - "0-g" <> String.trim(commit_hash) + # Pre-release version, denoted from patch version with a hyphen + cond do + tag_err == 0 and describe_err == 0 -> + describe + |> String.trim() + |> String.replace(String.trim(tag), "") + |> String.trim_leading("-") + |> String.trim() - true -> - "" + commit_hash_err == 0 -> + "0-g" <> String.trim(commit_hash) + + true -> + nil + end end # Branch name as pre-release version component, denoted with a dot branch_name = - with {branch_name, 0} <- System.cmd("git", ["rev-parse", "--abbrev-ref", "HEAD"]), + with 0 <- cmdgit_err, + {branch_name, 0} <- System.cmd("git", ["rev-parse", "--abbrev-ref", "HEAD"]), branch_name <- String.trim(branch_name), branch_name <- System.get_env("PLEROMA_BUILD_BRANCH") || branch_name, true <- @@ -271,7 +279,7 @@ defmodule Pleroma.Mixfile do branch_name else - _ -> "stable" + _ -> "" end build_name = diff --git a/mix.lock b/mix.lock index 962f5d0f4..a1d0bf0d2 100644 --- a/mix.lock +++ b/mix.lock @@ -12,7 +12,7 @@ "calendar": {:hex, :calendar, "0.17.6", "ec291cb2e4ba499c2e8c0ef5f4ace974e2f9d02ae9e807e711a9b0c7850b9aee", [:mix], [{:tzdata, "~> 0.5.20 or ~> 0.1.201603 or ~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "738d0e17a93c2ccfe4ddc707bdc8e672e9074c8569498483feb1c4530fb91b2b"}, "captcha": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/elixir-captcha.git", "e0f16822d578866e186a0974d65ad58cddc1e2ab", [ref: "e0f16822d578866e186a0974d65ad58cddc1e2ab"]}, "castore": {:hex, :castore, "0.1.5", "591c763a637af2cc468a72f006878584bc6c306f8d111ef8ba1d4c10e0684010", [:mix], [], "hexpm", "6db356b2bc6cc22561e051ff545c20ad064af57647e436650aa24d7d06cd941a"}, - "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "805abd97539caf89ec6d4732c91e62ba9da0cda51ac462380bbd28ee697a8c42"}, + "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"}, "comeonin": {:hex, :comeonin, "5.3.1", "7fe612b739c78c9c1a75186ef2d322ce4d25032d119823269d0aa1e2f1e20025", [:mix], [], "hexpm", "d6222483060c17f0977fad1b7401ef0c5863c985a64352755f366aee3799c245"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, @@ -53,12 +53,12 @@ "gen_state_machine": {:hex, :gen_state_machine, "2.0.5", "9ac15ec6e66acac994cc442dcc2c6f9796cf380ec4b08267223014be1c728a95", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.17.4", "f13088e1ec10ce01665cf25f5ff779e7df3f2dc71b37084976cf89d1aa124d5c", [:mix], [], "hexpm", "3c75b5ea8288e2ee7ea503ff9e30dfe4d07ad3c054576a6e60040e79a801e14d"}, "gun": {:git, "https://github.com/ninenines/gun.git", "e1a69b36b180a574c0ac314ced9613fdd52312cc", [ref: "e1a69b36b180a574c0ac314ced9613fdd52312cc"]}, - "hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "e0100f8ef7d1124222c11ad362c857d3df7cb5f4204054f9f0f4a728666591fc"}, + "hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"}, "html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"}, "html_sanitize_ex": {:hex, :html_sanitize_ex, "1.3.0", "f005ad692b717691203f940c686208aa3d8ffd9dd4bb3699240096a51fa9564e", [:mix], [{:mochiweb, "~> 2.15", [hex: :mochiweb, repo: "hexpm", optional: false]}], "hexpm"}, "http_signatures": {:git, "https://git.pleroma.social/pleroma/http_signatures.git", "293d77bb6f4a67ac8bde1428735c3b42f22cbb30", [ref: "293d77bb6f4a67ac8bde1428735c3b42f22cbb30"]}, "httpoison": {:hex, :httpoison, "1.6.2", "ace7c8d3a361cebccbed19c283c349b3d26991eff73a1eaaa8abae2e3c8089b6", [:mix], [{:hackney, "~> 1.15 and >= 1.15.2", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "aa2c74bd271af34239a3948779612f87df2422c2fdcfdbcec28d9c105f0773fe"}, - "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"}, + "idna": {:hex, :idna, "6.0.1", "1d038fb2e7668ce41fbf681d2c45902e52b3cb9e9c77b55334353b222c2ee50c", [:rebar3], [{:unicode_util_compat, "0.5.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a02c8a1c4fd601215bb0b0324c8a6986749f807ce35f25449ec9e69758708122"}, "inet_cidr": {:hex, :inet_cidr, "1.0.4", "a05744ab7c221ca8e395c926c3919a821eb512e8f36547c062f62c4ca0cf3d6e", [:mix], [], "hexpm", "64a2d30189704ae41ca7dbdd587f5291db5d1dda1414e0774c29ffc81088c1bc"}, "jason": {:hex, :jason, "1.2.1", "12b22825e22f468c02eb3e4b9985f3d0cb8dc40b9bd704730efa11abd2708c44", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b659b8571deedf60f79c5a608e15414085fa141344e2716fbd6988a084b5f993"}, "joken": {:hex, :joken, "2.2.0", "2daa1b12be05184aff7b5ace1d43ca1f81345962285fff3f88db74927c954d3a", [:mix], [{:jose, "~> 1.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "b4f92e30388206f869dd25d1af628a1d99d7586e5cf0672f64d4df84c4d2f5e9"}, @@ -106,17 +106,17 @@ "recon": {:hex, :recon, "2.5.0", "2f7fcbec2c35034bade2f9717f77059dc54eb4e929a3049ca7ba6775c0bd66cd", [:mix, :rebar3], [], "hexpm", "72f3840fedd94f06315c523f6cecf5b4827233bed7ae3fe135b2a0ebeab5e196"}, "remote_ip": {:git, "https://git.pleroma.social/pleroma/remote_ip.git", "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8", [ref: "b647d0deecaa3acb140854fe4bda5b7e1dc6d1c8"]}, "sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm", "13104d7897e38ed7f044c4de953a6c28597d1c952075eb2e328bc6d6f2bfc496"}, + "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"}, - "swoosh": {:hex, :swoosh, "0.23.5", "bfd9404bbf5069b1be2ffd317923ce57e58b332e25dbca2a35dedd7820dfee5a", [:mix], [{:cowboy, "~> 1.0.1 or ~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}], "hexpm", "e3928e1d2889a308aaf3e42755809ac21cffd77cb58eef01cbfdab4ce2fd1e21"}, + "swoosh": {:git, "https://github.com/swoosh/swoosh", "c96e0ca8a00d8f211ec1f042a4626b09f249caa5", [ref: "c96e0ca8a00d8f211ec1f042a4626b09f249caa5"]}, "syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"}, - "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm", "4738382e36a0a9a2b6e25d67c960e40e1a2c95560b9f936d8e29de8cd858480f"}, + "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"}, "tesla": {:git, "https://git.pleroma.social/pleroma/elixir-libraries/tesla.git", "61b7503cef33f00834f78ddfafe0d5d9dec2270b", [ref: "61b7503cef33f00834f78ddfafe0d5d9dec2270b"]}, "timex": {:hex, :timex, "3.6.1", "efdf56d0e67a6b956cc57774353b0329c8ab7726766a11547e529357ffdc1d56", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "f354efb2400dd7a80fd9eb6c8419068c4f632da4ac47f3d8822d6e33f08bc852"}, "trailing_format_plug": {:hex, :trailing_format_plug, "0.0.7", "64b877f912cf7273bed03379936df39894149e35137ac9509117e59866e10e45", [:mix], [{:plug, "> 0.12.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "bd4fde4c15f3e993a999e019d64347489b91b7a9096af68b2bdadd192afa693f"}, - "tzdata": {:hex, :tzdata, "0.5.22", "f2ba9105117ee0360eae2eca389783ef7db36d533899b2e84559404dbc77ebb8", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "cd66c8a1e6a9e121d1f538b01bef459334bb4029a1ffb4eeeb5e4eae0337e7b6"}, + "tzdata": {:hex, :tzdata, "1.0.3", "73470ad29dde46e350c60a66e6b360d3b99d2d18b74c4c349dbebbc27a09a3eb", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a6e1ee7003c4d04ecbd21dd3ec690d4c6662db5d3bbdd7262d53cdf5e7c746c1"}, "ueberauth": {:hex, :ueberauth, "0.6.2", "25a31111249d60bad8b65438b2306a4dc91f3208faa62f5a8c33e8713989b2e8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "db9fbfb5ac707bc4f85a297758406340bf0358b4af737a88113c1a9eee120ac7"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"}, "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"}, "web_push_encryption": {:hex, :web_push_encryption, "0.2.3", "a0ceab85a805a30852f143d22d71c434046fbdbafbc7292e7887cec500826a80", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:poison, "~> 3.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "9315c8f37c108835cf3f8e9157d7a9b8f420a34f402d1b1620a31aed5b93ecdf"}, "websocket_client": {:git, "https://github.com/jeremyong/websocket_client.git", "9a6f65d05ebf2725d62fb19262b21f1805a59fbf", []}, diff --git a/priv/gettext/it/LC_MESSAGES/errors.po b/priv/gettext/it/LC_MESSAGES/errors.po new file mode 100644 index 000000000..726be628b --- /dev/null +++ b/priv/gettext/it/LC_MESSAGES/errors.po @@ -0,0 +1,580 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-06-19 14:33+0000\n" +"PO-Revision-Date: 2020-06-19 20:38+0000\n" +"Last-Translator: Ben Is \n" +"Language-Team: Italian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.0.4\n" + +## This file is a PO Template file. +## +## `msgid`s here are often extracted from source code. +## Add new translations manually only if they're dynamic +## translations that can't be statically extracted. +## +## Run `mix gettext.extract` to bring this file up to +## date. Leave `msgstr`s empty as changing them here as no +## effect: edit them in PO (`.po`) files instead. +## From Ecto.Changeset.cast/4 +msgid "can't be blank" +msgstr "non può essere nullo" + +## From Ecto.Changeset.unique_constraint/3 +msgid "has already been taken" +msgstr "" + +## From Ecto.Changeset.put_change/3 +msgid "is invalid" +msgstr "" + +## From Ecto.Changeset.validate_format/3 +msgid "has invalid format" +msgstr "" + +## From Ecto.Changeset.validate_subset/3 +msgid "has an invalid entry" +msgstr "" + +## From Ecto.Changeset.validate_exclusion/3 +msgid "is reserved" +msgstr "" + +## From Ecto.Changeset.validate_confirmation/3 +msgid "does not match confirmation" +msgstr "" + +## From Ecto.Changeset.no_assoc_constraint/3 +msgid "is still associated with this entry" +msgstr "" + +msgid "are still associated with this entry" +msgstr "" + +## From Ecto.Changeset.validate_length/3 +msgid "should be %{count} character(s)" +msgid_plural "should be %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have %{count} item(s)" +msgid_plural "should have %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at least %{count} character(s)" +msgid_plural "should be at least %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at least %{count} item(s)" +msgid_plural "should have at least %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should be at most %{count} character(s)" +msgid_plural "should be at most %{count} character(s)" +msgstr[0] "" +msgstr[1] "" + +msgid "should have at most %{count} item(s)" +msgid_plural "should have at most %{count} item(s)" +msgstr[0] "" +msgstr[1] "" + +## From Ecto.Changeset.validate_number/3 +msgid "must be less than %{number}" +msgstr "" + +msgid "must be greater than %{number}" +msgstr "" + +msgid "must be less than or equal to %{number}" +msgstr "" + +msgid "must be greater than or equal to %{number}" +msgstr "" + +msgid "must be equal to %{number}" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:421 +#, elixir-format +msgid "Account not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:249 +#, elixir-format +msgid "Already voted" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:360 +#, elixir-format +msgid "Bad request" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:425 +#, elixir-format +msgid "Can't delete object" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:196 +#, elixir-format +msgid "Can't delete this post" +msgstr "" + +#: lib/pleroma/web/controller_helper.ex:95 +#: lib/pleroma/web/controller_helper.ex:101 +#, elixir-format +msgid "Can't display this activity" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:227 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:254 +#, elixir-format +msgid "Can't find user" +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:114 +#, elixir-format +msgid "Can't get favorites" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:437 +#, elixir-format +msgid "Can't like object" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:556 +#, elixir-format +msgid "Cannot post an empty status without attachments" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:504 +#, elixir-format +msgid "Comment must be up to %{max_size} characters" +msgstr "" + +#: lib/pleroma/config/config_db.ex:222 +#, elixir-format +msgid "Config with params %{params} not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:95 +#, elixir-format +msgid "Could not delete" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:141 +#, elixir-format +msgid "Could not favorite" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:370 +#, elixir-format +msgid "Could not pin" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:112 +#, elixir-format +msgid "Could not repeat" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:188 +#, elixir-format +msgid "Could not unfavorite" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:380 +#, elixir-format +msgid "Could not unpin" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:126 +#, elixir-format +msgid "Could not unrepeat" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:428 +#: lib/pleroma/web/common_api/common_api.ex:437 +#, elixir-format +msgid "Could not update state" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:202 +#, elixir-format +msgid "Error." +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:106 +#, elixir-format +msgid "Invalid CAPTCHA" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:117 +#: lib/pleroma/web/oauth/oauth_controller.ex:569 +#, elixir-format +msgid "Invalid credentials" +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:38 +#, elixir-format +msgid "Invalid credentials." +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:265 +#, elixir-format +msgid "Invalid indices" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1147 +#, elixir-format +msgid "Invalid parameters" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:411 +#, elixir-format +msgid "Invalid password." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:187 +#, elixir-format +msgid "Invalid request" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:109 +#, elixir-format +msgid "Kocaptcha service unavailable" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:113 +#, elixir-format +msgid "Missing parameters" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:540 +#, elixir-format +msgid "No such conversation" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:439 +#: lib/pleroma/web/admin_api/admin_api_controller.ex:465 lib/pleroma/web/admin_api/admin_api_controller.ex:507 +#, elixir-format +msgid "No such permission_group" +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:74 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:485 lib/pleroma/web/admin_api/admin_api_controller.ex:1135 +#: lib/pleroma/web/feed/user_controller.ex:73 lib/pleroma/web/ostatus/ostatus_controller.ex:143 +#, elixir-format +msgid "Not found" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:241 +#, elixir-format +msgid "Poll's author can't vote" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:37 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:49 +#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:50 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:290 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71 +#, elixir-format +msgid "Record not found" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:1153 +#: lib/pleroma/web/feed/user_controller.ex:79 lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:32 +#: lib/pleroma/web/ostatus/ostatus_controller.ex:149 +#, elixir-format +msgid "Something went wrong" +msgstr "" + +#: lib/pleroma/web/common_api/activity_draft.ex:107 +#, elixir-format +msgid "The message visibility must be direct" +msgstr "" + +#: lib/pleroma/web/common_api/utils.ex:566 +#, elixir-format +msgid "The status is over the character limit" +msgstr "" + +#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:31 +#, elixir-format +msgid "This resource requires authentication." +msgstr "" + +#: lib/pleroma/plugs/rate_limiter/rate_limiter.ex:206 +#, elixir-format +msgid "Throttled" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:266 +#, elixir-format +msgid "Too many choices" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:442 +#, elixir-format +msgid "Unhandled activity type" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:536 +#, elixir-format +msgid "You can't revoke your own admin status." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:218 +#: lib/pleroma/web/oauth/oauth_controller.ex:309 +#, elixir-format +msgid "Your account is currently disabled" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:180 +#: lib/pleroma/web/oauth/oauth_controller.ex:332 +#, elixir-format +msgid "Your login is missing a confirmed e-mail address" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:389 +#, elixir-format +msgid "can't read inbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:472 +#, elixir-format +msgid "can't update outbox of %{nickname} as %{as_nickname}" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:388 +#, elixir-format +msgid "conversation is already muted" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:316 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:491 +#, elixir-format +msgid "error" +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:29 +#, elixir-format +msgid "mascots can only be images" +msgstr "" + +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:60 +#, elixir-format +msgid "not found" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:395 +#, elixir-format +msgid "Bad OAuth request." +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:115 +#, elixir-format +msgid "CAPTCHA already used" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:112 +#, elixir-format +msgid "CAPTCHA expired" +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:55 +#, elixir-format +msgid "Failed" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:411 +#, elixir-format +msgid "Failed to authenticate: %{message}." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:442 +#, elixir-format +msgid "Failed to set up user account." +msgstr "" + +#: lib/pleroma/plugs/oauth_scopes_plug.ex:38 +#, elixir-format +msgid "Insufficient permissions: %{permissions}." +msgstr "" + +#: lib/pleroma/plugs/uploaded_media.ex:94 +#, elixir-format +msgid "Internal Error" +msgstr "" + +#: lib/pleroma/web/oauth/fallback_controller.ex:22 +#: lib/pleroma/web/oauth/fallback_controller.ex:29 +#, elixir-format +msgid "Invalid Username/Password" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:118 +#, elixir-format +msgid "Invalid answer data" +msgstr "" + +#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:128 +#, elixir-format +msgid "Nodeinfo schema version not handled" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:169 +#, elixir-format +msgid "This action is outside the authorized scopes" +msgstr "" + +#: lib/pleroma/web/oauth/fallback_controller.ex:14 +#, elixir-format +msgid "Unknown error, please check the details and try again." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:116 +#: lib/pleroma/web/oauth/oauth_controller.ex:155 +#, elixir-format +msgid "Unlisted redirect_uri." +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:391 +#, elixir-format +msgid "Unsupported OAuth provider: %{provider}." +msgstr "" + +#: lib/pleroma/uploaders/uploader.ex:72 +#, elixir-format +msgid "Uploader callback timeout" +msgstr "" + +#: lib/pleroma/web/uploader_controller.ex:23 +#, elixir-format +msgid "bad request" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:103 +#, elixir-format +msgid "CAPTCHA Error" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:200 +#, elixir-format +msgid "Could not add reaction emoji" +msgstr "" + +#: lib/pleroma/web/common_api/common_api.ex:211 +#, elixir-format +msgid "Could not remove reaction emoji" +msgstr "" + +#: lib/pleroma/web/twitter_api/twitter_api.ex:129 +#, elixir-format +msgid "Invalid CAPTCHA (Missing parameter: %{name})" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:92 +#, elixir-format +msgid "List not found" +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:124 +#, elixir-format +msgid "Missing parameter: %{name}" +msgstr "" + +#: lib/pleroma/web/oauth/oauth_controller.ex:207 +#: lib/pleroma/web/oauth/oauth_controller.ex:322 +#, elixir-format +msgid "Password reset is required" +msgstr "" + +#: lib/pleroma/tests/auth_test_controller.ex:9 +#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6 lib/pleroma/web/admin_api/admin_api_controller.ex:6 +#: lib/pleroma/web/controller_helper.ex:6 lib/pleroma/web/fallback_redirect_controller.ex:6 +#: lib/pleroma/web/feed/tag_controller.ex:6 lib/pleroma/web/feed/user_controller.ex:6 +#: lib/pleroma/web/mailer/subscription_controller.ex:2 lib/pleroma/web/masto_fe_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/app_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/auth_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/custom_emoji_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/domain_block_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/filter_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/follow_request_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/instance_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/marker_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/mastodon_api_controller.ex:14 lib/pleroma/web/mastodon_api/controllers/media_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/notification_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/report_controller.ex:8 lib/pleroma/web/mastodon_api/controllers/scheduled_activity_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/search_controller.ex:6 lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7 lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6 +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6 lib/pleroma/web/media_proxy/media_proxy_controller.ex:6 +#: lib/pleroma/web/mongooseim/mongoose_im_controller.ex:6 lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:6 +#: lib/pleroma/web/oauth/fallback_controller.ex:6 lib/pleroma/web/oauth/mfa_controller.ex:10 +#: lib/pleroma/web/oauth/oauth_controller.ex:6 lib/pleroma/web/ostatus/ostatus_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:2 +#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6 lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6 +#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7 lib/pleroma/web/static_fe/static_fe_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/password_controller.ex:10 lib/pleroma/web/twitter_api/controllers/remote_follow_controller.ex:6 +#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6 lib/pleroma/web/twitter_api/twitter_api_controller.ex:6 +#: lib/pleroma/web/uploader_controller.ex:6 lib/pleroma/web/web_finger/web_finger_controller.ex:6 +#, elixir-format +msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped." +msgstr "" + +#: lib/pleroma/plugs/ensure_authenticated_plug.ex:28 +#, elixir-format +msgid "Two-factor authentication enabled, you must use a access token." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:210 +#, elixir-format +msgid "Unexpected error occurred while adding file to pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:138 +#, elixir-format +msgid "Unexpected error occurred while creating pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:278 +#, elixir-format +msgid "Unexpected error occurred while removing file from pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:250 +#, elixir-format +msgid "Unexpected error occurred while updating file in pack." +msgstr "" + +#: lib/pleroma/web/pleroma_api/controllers/emoji_api_controller.ex:179 +#, elixir-format +msgid "Unexpected error occurred while updating pack metadata." +msgstr "" + +#: lib/pleroma/plugs/user_is_admin_plug.ex:40 +#, elixir-format +msgid "User is not an admin or OAuth admin scope is not granted." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61 +#, elixir-format +msgid "Web push subscription is disabled on this Pleroma instance" +msgstr "" + +#: lib/pleroma/web/admin_api/admin_api_controller.ex:502 +#, elixir-format +msgid "You can't revoke your own admin/moderator status." +msgstr "" + +#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:105 +#, elixir-format +msgid "authorization required for timeline view" +msgstr "" diff --git a/priv/gettext/nl/LC_MESSAGES/errors.po b/priv/gettext/nl/LC_MESSAGES/errors.po index 7e12ff96c..3118f6b5d 100644 --- a/priv/gettext/nl/LC_MESSAGES/errors.po +++ b/priv/gettext/nl/LC_MESSAGES/errors.po @@ -3,14 +3,16 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-15 09:37+0000\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2020-06-02 07:36+0000\n" +"Last-Translator: Fristi \n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Translate Toolkit 2.5.1\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.0.4\n" ## This file is a PO Template file. ## @@ -23,142 +25,142 @@ msgstr "" ## effect: edit them in PO (`.po`) files instead. ## From Ecto.Changeset.cast/4 msgid "can't be blank" -msgstr "" +msgstr "kan niet leeg zijn" ## From Ecto.Changeset.unique_constraint/3 msgid "has already been taken" -msgstr "" +msgstr "is al bezet" ## From Ecto.Changeset.put_change/3 msgid "is invalid" -msgstr "" +msgstr "is ongeldig" ## From Ecto.Changeset.validate_format/3 msgid "has invalid format" -msgstr "" +msgstr "heeft een ongeldig formaat" ## From Ecto.Changeset.validate_subset/3 msgid "has an invalid entry" -msgstr "" +msgstr "heeft een ongeldige entry" ## From Ecto.Changeset.validate_exclusion/3 msgid "is reserved" -msgstr "" +msgstr "is gereserveerd" ## From Ecto.Changeset.validate_confirmation/3 msgid "does not match confirmation" -msgstr "" +msgstr "komt niet overeen met bevestiging" ## From Ecto.Changeset.no_assoc_constraint/3 msgid "is still associated with this entry" -msgstr "" +msgstr "is nog geassocieerd met deze entry" msgid "are still associated with this entry" -msgstr "" +msgstr "zijn nog geassocieerd met deze entry" ## From Ecto.Changeset.validate_length/3 msgid "should be %{count} character(s)" msgid_plural "should be %{count} character(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dient %{count} karakter te bevatten" +msgstr[1] "dient %{count} karakters te bevatten" msgid "should have %{count} item(s)" msgid_plural "should have %{count} item(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dient %{count} item te bevatten" +msgstr[1] "dient %{count} items te bevatten" msgid "should be at least %{count} character(s)" msgid_plural "should be at least %{count} character(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dient ten minste %{count} karakter te bevatten" +msgstr[1] "dient ten minste %{count} karakters te bevatten" msgid "should have at least %{count} item(s)" msgid_plural "should have at least %{count} item(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dient ten minste %{count} item te bevatten" +msgstr[1] "dient ten minste %{count} items te bevatten" msgid "should be at most %{count} character(s)" msgid_plural "should be at most %{count} character(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dient niet meer dan %{count} karakter te bevatten" +msgstr[1] "dient niet meer dan %{count} karakters te bevatten" msgid "should have at most %{count} item(s)" msgid_plural "should have at most %{count} item(s)" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "dient niet meer dan %{count} item te bevatten" +msgstr[1] "dient niet meer dan %{count} items te bevatten" ## From Ecto.Changeset.validate_number/3 msgid "must be less than %{number}" -msgstr "" +msgstr "dient kleiner te zijn dan %{number}" msgid "must be greater than %{number}" -msgstr "" +msgstr "dient groter te zijn dan %{number}" msgid "must be less than or equal to %{number}" -msgstr "" +msgstr "dient kleiner dan of gelijk te zijn aan %{number}" msgid "must be greater than or equal to %{number}" -msgstr "" +msgstr "dient groter dan of gelijk te zijn aan %{number}" msgid "must be equal to %{number}" -msgstr "" +msgstr "dient gelijk te zijn aan %{number}" #: lib/pleroma/web/common_api/common_api.ex:421 #, elixir-format msgid "Account not found" -msgstr "" +msgstr "Account niet gevonden" #: lib/pleroma/web/common_api/common_api.ex:249 #, elixir-format msgid "Already voted" -msgstr "" +msgstr "Al gestemd" #: lib/pleroma/web/oauth/oauth_controller.ex:360 #, elixir-format msgid "Bad request" -msgstr "" +msgstr "Bad request" #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:425 #, elixir-format msgid "Can't delete object" -msgstr "" +msgstr "Object kan niet verwijderd worden" #: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:196 #, elixir-format msgid "Can't delete this post" -msgstr "" +msgstr "Bericht kan niet verwijderd worden" #: lib/pleroma/web/controller_helper.ex:95 #: lib/pleroma/web/controller_helper.ex:101 #, elixir-format msgid "Can't display this activity" -msgstr "" +msgstr "Activiteit kan niet worden getoond" #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:227 #: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:254 #, elixir-format msgid "Can't find user" -msgstr "" +msgstr "Gebruiker kan niet gevonden worden" #: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:114 #, elixir-format msgid "Can't get favorites" -msgstr "" +msgstr "Favorieten konden niet opgehaald worden" #: lib/pleroma/web/activity_pub/activity_pub_controller.ex:437 #, elixir-format msgid "Can't like object" -msgstr "" +msgstr "Object kan niet geliked worden" #: lib/pleroma/web/common_api/utils.ex:556 #, elixir-format msgid "Cannot post an empty status without attachments" -msgstr "" +msgstr "Status kan niet geplaatst worden zonder tekst of bijlagen" #: lib/pleroma/web/common_api/utils.ex:504 #, elixir-format msgid "Comment must be up to %{max_size} characters" -msgstr "" +msgstr "Opmerking dient maximaal %{max_size} karakters te bevatten" #: lib/pleroma/config/config_db.ex:222 #, elixir-format diff --git a/priv/repo/migrations/20200309123730_create_chats.exs b/priv/repo/migrations/20200309123730_create_chats.exs new file mode 100644 index 000000000..715d798ea --- /dev/null +++ b/priv/repo/migrations/20200309123730_create_chats.exs @@ -0,0 +1,16 @@ +defmodule Pleroma.Repo.Migrations.CreateChats do + use Ecto.Migration + + def change do + create table(:chats) do + add(:user_id, references(:users, type: :uuid)) + # Recipient is an ActivityPub id, to future-proof for group support. + add(:recipient, :string) + add(:unread, :integer, default: 0) + timestamps() + end + + # There's only one chat between a user and a recipient. + create(index(:chats, [:user_id, :recipient], unique: true)) + end +end diff --git a/priv/repo/migrations/20200322174133_user_raw_bio.exs b/priv/repo/migrations/20200322174133_user_raw_bio.exs new file mode 100644 index 000000000..ddf9be4f5 --- /dev/null +++ b/priv/repo/migrations/20200322174133_user_raw_bio.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.UserRawBio do + use Ecto.Migration + + def change do + alter table(:users) do + add_if_not_exists(:raw_bio, :text) + end + end +end diff --git a/priv/repo/migrations/20200323122421_mrf_config_move_from_instance_namespace.exs b/priv/repo/migrations/20200323122421_mrf_config_move_from_instance_namespace.exs new file mode 100644 index 000000000..ef36c4eb7 --- /dev/null +++ b/priv/repo/migrations/20200323122421_mrf_config_move_from_instance_namespace.exs @@ -0,0 +1,39 @@ +defmodule Pleroma.Repo.Migrations.MrfConfigMoveFromInstanceNamespace do + use Ecto.Migration + + alias Pleroma.ConfigDB + + @old_keys [:rewrite_policy, :mrf_transparency, :mrf_transparency_exclusions] + def change do + config = ConfigDB.get_by_params(%{group: :pleroma, key: :instance}) + + if config do + mrf = + config.value + |> Keyword.take(@old_keys) + |> Keyword.new(fn + {:rewrite_policy, policies} -> {:policies, policies} + {:mrf_transparency, transparency} -> {:transparency, transparency} + {:mrf_transparency_exclusions, exclusions} -> {:transparency_exclusions, exclusions} + end) + + if mrf != [] do + {:ok, _} = + %ConfigDB{} + |> ConfigDB.changeset(%{group: :pleroma, key: :mrf, value: mrf}) + |> Pleroma.Repo.insert() + + new_instance = Keyword.drop(config.value, @old_keys) + + if new_instance != [] do + {:ok, _} = + config + |> ConfigDB.changeset(%{value: new_instance}) + |> Pleroma.Repo.update() + else + {:ok, _} = ConfigDB.delete(config) + end + end + end + end +end diff --git a/priv/repo/migrations/20200328193433_populate_user_raw_bio.exs b/priv/repo/migrations/20200328193433_populate_user_raw_bio.exs new file mode 100644 index 000000000..cb35db3f5 --- /dev/null +++ b/priv/repo/migrations/20200328193433_populate_user_raw_bio.exs @@ -0,0 +1,25 @@ +defmodule Pleroma.Repo.Migrations.PopulateUserRawBio do + use Ecto.Migration + import Ecto.Query + alias Pleroma.User + alias Pleroma.Repo + + def change do + {:ok, _} = Application.ensure_all_started(:fast_sanitize) + + User.Query.build(%{local: true}) + |> select([u], struct(u, [:id, :ap_id, :bio])) + |> Repo.stream() + |> Enum.each(fn %{bio: bio} = user -> + if bio do + raw_bio = + bio + |> String.replace(~r(
), "\n") + |> Pleroma.HTML.strip_tags() + + Ecto.Changeset.cast(user, %{raw_bio: raw_bio}, [:raw_bio]) + |> Repo.update() + end + end) + end +end diff --git a/priv/repo/migrations/20200508092434_update_counter_cache_table.exs b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs new file mode 100644 index 000000000..738344868 --- /dev/null +++ b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs @@ -0,0 +1,143 @@ +defmodule Pleroma.Repo.Migrations.UpdateCounterCacheTable do + use Ecto.Migration + + @function_name "update_status_visibility_counter_cache" + @trigger_name "status_visibility_counter_cache_trigger" + + def up do + execute("drop trigger if exists #{@trigger_name} on activities") + execute("drop function if exists #{@function_name}()") + drop_if_exists(unique_index(:counter_cache, [:name])) + drop_if_exists(table(:counter_cache)) + + create_if_not_exists table(:counter_cache) do + add(:instance, :string, null: false) + add(:direct, :bigint, null: false, default: 0) + add(:private, :bigint, null: false, default: 0) + add(:unlisted, :bigint, null: false, default: 0) + add(:public, :bigint, null: false, default: 0) + end + + create_if_not_exists(unique_index(:counter_cache, [:instance])) + + """ + CREATE OR REPLACE FUNCTION #{@function_name}() + RETURNS TRIGGER AS + $$ + DECLARE + hostname character varying(255); + visibility_new character varying(64); + visibility_old character varying(64); + actor character varying(255); + BEGIN + IF TG_OP = 'DELETE' THEN + actor := OLD.actor; + ELSE + actor := NEW.actor; + END IF; + hostname := split_part(actor, '/', 3); + IF TG_OP = 'INSERT' THEN + visibility_new := activity_visibility(NEW.actor, NEW.recipients, NEW.data); + IF NEW.data->>'type' = 'Create' + AND visibility_new IN ('public', 'unlisted', 'private', 'direct') THEN + EXECUTE format('INSERT INTO "counter_cache" ("instance", %1$I) VALUES ($1, 1) + ON CONFLICT ("instance") DO + UPDATE SET %1$I = "counter_cache".%1$I + 1', visibility_new) + USING hostname; + END IF; + RETURN NEW; + ELSIF TG_OP = 'UPDATE' THEN + visibility_new := activity_visibility(NEW.actor, NEW.recipients, NEW.data); + visibility_old := activity_visibility(OLD.actor, OLD.recipients, OLD.data); + IF (NEW.data->>'type' = 'Create') + AND (OLD.data->>'type' = 'Create') + AND visibility_new != visibility_old + AND visibility_new IN ('public', 'unlisted', 'private', 'direct') THEN + EXECUTE format('UPDATE "counter_cache" SET + %1$I = greatest("counter_cache".%1$I - 1, 0), + %2$I = "counter_cache".%2$I + 1 + WHERE "instance" = $1', visibility_old, visibility_new) + USING hostname; + END IF; + RETURN NEW; + ELSIF TG_OP = 'DELETE' THEN + IF OLD.data->>'type' = 'Create' THEN + visibility_old := activity_visibility(OLD.actor, OLD.recipients, OLD.data); + EXECUTE format('UPDATE "counter_cache" SET + %1$I = greatest("counter_cache".%1$I - 1, 0) + WHERE "instance" = $1', visibility_old) + USING hostname; + END IF; + RETURN OLD; + END IF; + END; + $$ + LANGUAGE 'plpgsql'; + """ + |> execute() + + execute("DROP TRIGGER IF EXISTS #{@trigger_name} ON activities") + + """ + CREATE TRIGGER #{@trigger_name} + BEFORE + INSERT + OR UPDATE of recipients, data + OR DELETE + ON activities + FOR EACH ROW + EXECUTE PROCEDURE #{@function_name}(); + """ + |> execute() + end + + def down do + execute("DROP TRIGGER IF EXISTS #{@trigger_name} ON activities") + execute("DROP FUNCTION IF EXISTS #{@function_name}()") + drop_if_exists(unique_index(:counter_cache, [:instance])) + drop_if_exists(table(:counter_cache)) + + create_if_not_exists table(:counter_cache) do + add(:name, :string, null: false) + add(:count, :bigint, null: false, default: 0) + end + + create_if_not_exists(unique_index(:counter_cache, [:name])) + + """ + CREATE OR REPLACE FUNCTION #{@function_name}() + RETURNS TRIGGER AS + $$ + DECLARE + BEGIN + IF TG_OP = 'INSERT' THEN + IF NEW.data->>'type' = 'Create' THEN + EXECUTE 'INSERT INTO counter_cache (name, count) VALUES (''status_visibility_' || activity_visibility(NEW.actor, NEW.recipients, NEW.data) || ''', 1) ON CONFLICT (name) DO UPDATE SET count = counter_cache.count + 1'; + END IF; + RETURN NEW; + ELSIF TG_OP = 'UPDATE' THEN + IF (NEW.data->>'type' = 'Create') and (OLD.data->>'type' = 'Create') and activity_visibility(NEW.actor, NEW.recipients, NEW.data) != activity_visibility(OLD.actor, OLD.recipients, OLD.data) THEN + EXECUTE 'INSERT INTO counter_cache (name, count) VALUES (''status_visibility_' || activity_visibility(NEW.actor, NEW.recipients, NEW.data) || ''', 1) ON CONFLICT (name) DO UPDATE SET count = counter_cache.count + 1'; + EXECUTE 'update counter_cache SET count = counter_cache.count - 1 where count > 0 and name = ''status_visibility_' || activity_visibility(OLD.actor, OLD.recipients, OLD.data) || ''';'; + END IF; + RETURN NEW; + ELSIF TG_OP = 'DELETE' THEN + IF OLD.data->>'type' = 'Create' THEN + EXECUTE 'update counter_cache SET count = counter_cache.count - 1 where count > 0 and name = ''status_visibility_' || activity_visibility(OLD.actor, OLD.recipients, OLD.data) || ''';'; + END IF; + RETURN OLD; + END IF; + END; + $$ + LANGUAGE 'plpgsql'; + """ + |> execute() + + """ + CREATE TRIGGER #{@trigger_name} BEFORE INSERT OR UPDATE of recipients, data OR DELETE ON activities + FOR EACH ROW + EXECUTE PROCEDURE #{@function_name}(); + """ + |> execute() + end +end diff --git a/priv/repo/migrations/20200520155351_add_recipients_contain_blocked_domains_function.exs b/priv/repo/migrations/20200520155351_add_recipients_contain_blocked_domains_function.exs new file mode 100644 index 000000000..14e873125 --- /dev/null +++ b/priv/repo/migrations/20200520155351_add_recipients_contain_blocked_domains_function.exs @@ -0,0 +1,33 @@ +defmodule Pleroma.Repo.Migrations.AddRecipientsContainBlockedDomainsFunction do + use Ecto.Migration + @disable_ddl_transaction true + + def up do + statement = """ + CREATE OR REPLACE FUNCTION recipients_contain_blocked_domains(recipients varchar[], blocked_domains varchar[]) RETURNS boolean AS $$ + DECLARE + recipient_domain varchar; + recipient varchar; + BEGIN + FOREACH recipient IN ARRAY recipients LOOP + recipient_domain = split_part(recipient, '/', 3)::varchar; + + IF recipient_domain = ANY(blocked_domains) THEN + RETURN TRUE; + END IF; + END LOOP; + + RETURN FALSE; + END; + $$ LANGUAGE plpgsql; + """ + + execute(statement) + end + + def down do + execute( + "drop function if exists recipients_contain_blocked_domains(recipients varchar[], blocked_domains varchar[])" + ) + end +end diff --git a/priv/repo/migrations/20200526144426_add_apps_indexes.exs b/priv/repo/migrations/20200526144426_add_apps_indexes.exs new file mode 100644 index 000000000..5cb6a0473 --- /dev/null +++ b/priv/repo/migrations/20200526144426_add_apps_indexes.exs @@ -0,0 +1,7 @@ +defmodule Pleroma.Repo.Migrations.AddAppsIndexes do + use Ecto.Migration + + def change do + create(index(:apps, [:client_id, :client_secret])) + end +end diff --git a/priv/repo/migrations/20200527104138_change_notification_user_index.exs b/priv/repo/migrations/20200527104138_change_notification_user_index.exs new file mode 100644 index 000000000..4dcfe6de9 --- /dev/null +++ b/priv/repo/migrations/20200527104138_change_notification_user_index.exs @@ -0,0 +1,8 @@ +defmodule Pleroma.Repo.Migrations.ChangeNotificationUserIndex do + use Ecto.Migration + + def change do + drop_if_exists(index(:notifications, [:user_id])) + create_if_not_exists(index(:notifications, [:user_id, "id desc nulls last"])) + end +end diff --git a/priv/repo/migrations/20200527163635_delete_notifications_from_invisible_users.exs b/priv/repo/migrations/20200527163635_delete_notifications_from_invisible_users.exs new file mode 100644 index 000000000..9e95a8111 --- /dev/null +++ b/priv/repo/migrations/20200527163635_delete_notifications_from_invisible_users.exs @@ -0,0 +1,18 @@ +defmodule Pleroma.Repo.Migrations.DeleteNotificationsFromInvisibleUsers do + use Ecto.Migration + + import Ecto.Query + alias Pleroma.Repo + + def up do + Pleroma.Notification + |> join(:inner, [n], activity in assoc(n, :activity)) + |> where( + [n, a], + fragment("? in (SELECT ap_id FROM users WHERE invisible = true)", a.actor) + ) + |> Repo.delete_all() + end + + def down, do: :ok +end diff --git a/priv/repo/migrations/20200602094828_add_type_to_notifications.exs b/priv/repo/migrations/20200602094828_add_type_to_notifications.exs new file mode 100644 index 000000000..19c733628 --- /dev/null +++ b/priv/repo/migrations/20200602094828_add_type_to_notifications.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.AddTypeToNotifications do + use Ecto.Migration + + def change do + alter table(:notifications) do + add(:type, :string) + end + end +end diff --git a/priv/repo/migrations/20200602125218_backfill_notification_types.exs b/priv/repo/migrations/20200602125218_backfill_notification_types.exs new file mode 100644 index 000000000..996d721ee --- /dev/null +++ b/priv/repo/migrations/20200602125218_backfill_notification_types.exs @@ -0,0 +1,10 @@ +defmodule Pleroma.Repo.Migrations.BackfillNotificationTypes do + use Ecto.Migration + + def up do + Pleroma.MigrationHelper.NotificationBackfill.fill_in_notification_types() + end + + def down do + end +end diff --git a/priv/repo/migrations/20200602150528_create_chat_message_reference.exs b/priv/repo/migrations/20200602150528_create_chat_message_reference.exs new file mode 100644 index 000000000..6f9148b7c --- /dev/null +++ b/priv/repo/migrations/20200602150528_create_chat_message_reference.exs @@ -0,0 +1,20 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Repo.Migrations.CreateChatMessageReference do + use Ecto.Migration + + def change do + create table(:chat_message_references, primary_key: false) do + add(:id, :uuid, primary_key: true) + add(:chat_id, references(:chats, on_delete: :delete_all), null: false) + add(:object_id, references(:objects, on_delete: :delete_all), null: false) + add(:seen, :boolean, default: false, null: false) + + timestamps() + end + + create(index(:chat_message_references, [:chat_id, "id desc"])) + end +end diff --git a/priv/repo/migrations/20200603105113_add_unique_index_to_chat_message_references.exs b/priv/repo/migrations/20200603105113_add_unique_index_to_chat_message_references.exs new file mode 100644 index 000000000..fdf85132e --- /dev/null +++ b/priv/repo/migrations/20200603105113_add_unique_index_to_chat_message_references.exs @@ -0,0 +1,7 @@ +defmodule Pleroma.Repo.Migrations.AddUniqueIndexToChatMessageReferences do + use Ecto.Migration + + def change do + create(unique_index(:chat_message_references, [:object_id, :chat_id])) + end +end diff --git a/priv/repo/migrations/20200603120448_remove_unread_from_chats.exs b/priv/repo/migrations/20200603120448_remove_unread_from_chats.exs new file mode 100644 index 000000000..6322137d5 --- /dev/null +++ b/priv/repo/migrations/20200603120448_remove_unread_from_chats.exs @@ -0,0 +1,9 @@ +defmodule Pleroma.Repo.Migrations.RemoveUnreadFromChats do + use Ecto.Migration + + def change do + alter table(:chats) do + remove(:unread, :integer, default: 0) + end + end +end diff --git a/priv/repo/migrations/20200603122732_add_seen_index_to_chat_message_references.exs b/priv/repo/migrations/20200603122732_add_seen_index_to_chat_message_references.exs new file mode 100644 index 000000000..a5065d612 --- /dev/null +++ b/priv/repo/migrations/20200603122732_add_seen_index_to_chat_message_references.exs @@ -0,0 +1,12 @@ +defmodule Pleroma.Repo.Migrations.AddSeenIndexToChatMessageReferences do + use Ecto.Migration + + def change do + create( + index(:chat_message_references, [:chat_id], + where: "seen = false", + name: "unseen_messages_count_index" + ) + ) + end +end diff --git a/priv/repo/migrations/20200604150318_migrate_seen_to_unread_in_chat_message_references.exs b/priv/repo/migrations/20200604150318_migrate_seen_to_unread_in_chat_message_references.exs new file mode 100644 index 000000000..fd6bc7bc7 --- /dev/null +++ b/priv/repo/migrations/20200604150318_migrate_seen_to_unread_in_chat_message_references.exs @@ -0,0 +1,30 @@ +defmodule Pleroma.Repo.Migrations.MigrateSeenToUnreadInChatMessageReferences do + use Ecto.Migration + + def change do + drop( + index(:chat_message_references, [:chat_id], + where: "seen = false", + name: "unseen_messages_count_index" + ) + ) + + alter table(:chat_message_references) do + add(:unread, :boolean, default: true) + end + + execute("update chat_message_references set unread = not seen") + + alter table(:chat_message_references) do + modify(:unread, :boolean, default: true, null: false) + remove(:seen, :boolean, default: false, null: false) + end + + create( + index(:chat_message_references, [:chat_id], + where: "unread = true", + name: "unread_messages_count_index" + ) + ) + end +end diff --git a/priv/repo/migrations/20200606105430_change_type_to_enum_for_notifications.exs b/priv/repo/migrations/20200606105430_change_type_to_enum_for_notifications.exs new file mode 100644 index 000000000..9ea34436b --- /dev/null +++ b/priv/repo/migrations/20200606105430_change_type_to_enum_for_notifications.exs @@ -0,0 +1,36 @@ +defmodule Pleroma.Repo.Migrations.ChangeTypeToEnumForNotifications do + use Ecto.Migration + + def up do + """ + create type notification_type as enum ( + 'follow', + 'follow_request', + 'mention', + 'move', + 'pleroma:emoji_reaction', + 'pleroma:chat_mention', + 'reblog', + 'favourite' + ) + """ + |> execute() + + """ + alter table notifications + alter column type type notification_type using (type::notification_type) + """ + |> execute() + end + + def down do + alter table(:notifications) do + modify(:type, :string) + end + + """ + drop type notification_type + """ + |> execute() + end +end diff --git a/priv/repo/migrations/20200607112923_change_chat_id_to_flake.exs b/priv/repo/migrations/20200607112923_change_chat_id_to_flake.exs new file mode 100644 index 000000000..f14e269ca --- /dev/null +++ b/priv/repo/migrations/20200607112923_change_chat_id_to_flake.exs @@ -0,0 +1,23 @@ +defmodule Pleroma.Repo.Migrations.ChangeChatIdToFlake do + use Ecto.Migration + + def up do + execute(""" + alter table chats + drop constraint chats_pkey cascade, + alter column id drop default, + alter column id set data type uuid using cast( lpad( to_hex(id), 32, '0') as uuid), + add primary key (id) + """) + + execute(""" + alter table chat_message_references + alter column chat_id set data type uuid using cast( lpad( to_hex(chat_id), 32, '0') as uuid), + add constraint chat_message_references_chat_id_fkey foreign key (chat_id) references chats(id) on delete cascade + """) + end + + def down do + :ok + end +end diff --git a/priv/repo/migrations/20200630162024_rename_user_settings_col.exs b/priv/repo/migrations/20200630162024_rename_user_settings_col.exs new file mode 100644 index 000000000..2355eb681 --- /dev/null +++ b/priv/repo/migrations/20200630162024_rename_user_settings_col.exs @@ -0,0 +1,11 @@ +defmodule Pleroma.Repo.Migrations.RenameUserSettingsCol do + use Ecto.Migration + + def up do + rename(table(:users), :settings, to: :mastofe_settings) + end + + def down do + rename(table(:users), :mastofe_settings, to: :settings) + end +end diff --git a/priv/repo/optional_migrations/rum_indexing/20190510135645_add_fts_index_to_objects_two.exs b/priv/repo/optional_migrations/rum_indexing/20190510135645_add_fts_index_to_objects_two.exs index 6227769dc..757afa129 100644 --- a/priv/repo/optional_migrations/rum_indexing/20190510135645_add_fts_index_to_objects_two.exs +++ b/priv/repo/optional_migrations/rum_indexing/20190510135645_add_fts_index_to_objects_two.exs @@ -10,8 +10,8 @@ defmodule Pleroma.Repo.Migrations.AddFtsIndexToObjectsTwo do execute("CREATE FUNCTION objects_fts_update() RETURNS trigger AS $$ begin - new.fts_content := to_tsvector('english', new.data->>'content'); - return new; + new.fts_content := to_tsvector('english', new.data->>'content'); + return new; end $$ LANGUAGE plpgsql") execute("create index if not exists objects_fts on objects using RUM (fts_content rum_tsvector_addon_ops, inserted_at) with (attach = 'inserted_at', to = 'fts_content');") diff --git a/priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE b/priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE new file mode 100644 index 000000000..eb5294eaf --- /dev/null +++ b/priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE @@ -0,0 +1 @@ +If you are an instance admin and you want to modify the instace static files, this is probably not the right place to do it. This directory is checked in version control, so don't be surprised if you get merge conflicts after modifying anything here. Please use instance static directory instead, it has the same directory structure and files placed there will override files placed here. See https://docs.pleroma.social/backend/configuration/static_dir/ for more info diff --git a/priv/static/adminfe/app.796ca6d4.css b/priv/static/adminfe/app.6684eb28.css similarity index 100% rename from priv/static/adminfe/app.796ca6d4.css rename to priv/static/adminfe/app.6684eb28.css diff --git a/priv/static/adminfe/chunk-0558.af0d89cd.css b/priv/static/adminfe/chunk-070d.d2dd6533.css similarity index 100% rename from priv/static/adminfe/chunk-0558.af0d89cd.css rename to priv/static/adminfe/chunk-070d.d2dd6533.css diff --git a/priv/static/adminfe/chunk-0cbc.60bba79b.css b/priv/static/adminfe/chunk-0cbc.60bba79b.css new file mode 100644 index 000000000..c6280f7ef --- /dev/null +++ b/priv/static/adminfe/chunk-0cbc.60bba79b.css @@ -0,0 +1 @@ +.select-field[data-v-78fa3c24]{width:350px}@media only screen and (max-width:480px){.select-field[data-v-78fa3c24]{width:100%;margin-bottom:5px}}.el-dialog__body{padding:20px}.create-account-form-item{margin-bottom:20px}.create-account-form-item-without-margin{margin-bottom:0}@media only screen and (max-width:480px){.create-user-dialog{width:85%}.create-account-form-item{margin-bottom:20px}.el-dialog__body{padding:20px}}.moderate-user-button{text-align:left;width:350px;padding:10px}.moderate-user-button-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.moderate-user-button{width:100%}}.actions-button{text-align:left;width:350px;padding:10px}.actions-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 15px 10px}.actions-container .el-dropdown{margin-left:10px}.active-tag{color:#409eff;font-weight:700}.active-tag .el-icon-check{color:#409eff;float:right;margin:7px 0 0 15px}.el-dropdown-link:hover{cursor:pointer;color:#409eff}.create-account>.el-icon-plus{margin-right:5px}.password-reset-token{margin:0 0 14px}.password-reset-token-dialog{width:50%}.reset-password-link{text-decoration:underline}.users-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.users-container h1{margin:10px 0 0 15px;height:40px}.users-container .el-table__row:hover{cursor:pointer}.users-container .pagination{margin:25px 0;text-align:center}.users-container .reboot-button{margin:0 15px 0 0;padding:10px;width:145px}.users-container .search{width:350px;float:right;margin-left:10px}.users-container .filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px}.users-container .user-count{color:grey;font-size:28px}@media only screen and (max-width:480px){.password-reset-token-dialog{width:85%}.users-container h1{margin:0}.users-container .actions-button{width:100%}.users-container .actions-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 10px 7px}.users-container .el-icon-arrow-down{font-size:12px}.users-container .search{width:100%;margin-left:0}.users-container .filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:82px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 10px}.users-container .el-tag{width:30px;display:inline-block;margin-bottom:4px;font-weight:700}.users-container .el-tag.el-tag--danger,.users-container .el-tag.el-tag--success{padding-left:8px}.users-container .reboot-button{margin:0}.users-container .users-header-container{margin:7px 10px 12px}.users-container .user-count{color:grey;font-size:22px}}@media only screen and (max-width:801px) and (min-width:481px){.actions-button,.search{width:49%}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-6b68.0cc00484.css b/priv/static/adminfe/chunk-143c.43ada4fc.css similarity index 53% rename from priv/static/adminfe/chunk-6b68.0cc00484.css rename to priv/static/adminfe/chunk-143c.43ada4fc.css index 7061b3d03..b580e0699 100644 --- a/priv/static/adminfe/chunk-6b68.0cc00484.css +++ b/priv/static/adminfe/chunk-143c.43ada4fc.css @@ -1 +1 @@ -.actions-button[data-v-3850612b]{text-align:left;width:350px;padding:10px}.actions-button-container[data-v-3850612b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-dropdown[data-v-3850612b]{float:right}.el-icon-edit[data-v-3850612b]{margin-right:5px}.tag-container[data-v-3850612b]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tag-text[data-v-3850612b]{padding-right:20px}.no-hover[data-v-3850612b]:hover{color:#606266;background-color:#fff;cursor:auto} \ No newline at end of file +.actions-button[data-v-2d9f3c5e]{text-align:left;width:350px;padding:10px}.actions-button-container[data-v-2d9f3c5e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-dropdown[data-v-2d9f3c5e]{float:right}.el-icon-edit[data-v-2d9f3c5e]{margin-right:5px}.tag-container[data-v-2d9f3c5e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.tag-text[data-v-2d9f3c5e]{padding-right:20px}.no-hover[data-v-2d9f3c5e]:hover{color:#606266;background-color:#fff;cursor:auto} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-1609.408dae86.css b/priv/static/adminfe/chunk-1609.408dae86.css new file mode 100644 index 000000000..483d88545 --- /dev/null +++ b/priv/static/adminfe/chunk-1609.408dae86.css @@ -0,0 +1 @@ +.router-link{text-decoration:none}.moderation-log-container[data-v-60b585cf]{margin:0 15px}h1[data-v-60b585cf]{margin:0}.el-timeline[data-v-60b585cf]{margin:25px 45px 0 0;padding:0}.moderation-log-date-panel[data-v-60b585cf]{width:350px}.moderation-log-header-container[data-v-60b585cf]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:10px 0 15px}.moderation-log-header-container[data-v-60b585cf],.moderation-log-nav-container[data-v-60b585cf]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.moderation-log-search[data-v-60b585cf]{width:350px}.moderation-log-user-select[data-v-60b585cf]{margin:0 0 20px;width:350px}.reboot-button[data-v-60b585cf]{padding:10px;margin:0;width:145px}.search-container[data-v-60b585cf]{text-align:right}.pagination[data-v-60b585cf]{text-align:center}@media only screen and (max-width:480px){h1[data-v-60b585cf]{font-size:24px}.moderation-log-date-panel[data-v-60b585cf]{width:100%}.moderation-log-user-select[data-v-60b585cf]{margin:0 0 10px;width:55%}.moderation-log-search[data-v-60b585cf]{width:40%}}@media only screen and (max-width:801px) and (min-width:481px){.moderation-log-date-panel[data-v-60b585cf]{width:55%}.moderation-log-user-select[data-v-60b585cf]{margin:0 0 10px;width:55%}.moderation-log-search[data-v-60b585cf]{width:40%}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-176e.5d7d957b.css b/priv/static/adminfe/chunk-176e.5d7d957b.css new file mode 100644 index 000000000..0bedf3773 --- /dev/null +++ b/priv/static/adminfe/chunk-176e.5d7d957b.css @@ -0,0 +1 @@ +.statuses-container{padding:0 15px}.statuses-container h1{margin:10px 0 15px}.statuses-container .status-container{margin:0 0 10px}.statuses-header-container .el-button.is-plain:focus,.statuses-header-container .el-button.is-plain:hover{border-color:#dcdfe6;color:#606266;cursor:default}.checkbox-container{margin-bottom:15px}.filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:22px 0 15px}.reboot-button{padding:10px;margin:0;width:145px}.select-instance{width:396px}.statuses-header,.statuses-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.statuses-pagination{padding:15px 0;text-align:center}@media only screen and (max-width:480px){.checkbox-container{margin-bottom:10px}.filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:10px 0}.select-field{width:100%;margin-bottom:5px}.select-instance{width:100%}.statuses-header-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.statuses-header-container .el-button-group{width:100%}.statuses-header-container .el-button{padding:10px 6.5px;width:50%}.statuses-header-container .el-button-group>.el-button:first-child{border-bottom-left-radius:0}.statuses-header-container .el-button-group>.el-button:not(:first-child):not(:last-child).private-button{border-top-right-radius:4px}.statuses-header-container .el-button-group>.el-button:not(:first-child):not(:last-child).public-button{border-bottom-left-radius:4px;border-top:#fff}.statuses-header-container .el-button-group>.el-button:last-child{border-top-right-radius:0;border-top:#fff}.statuses-header-container .reboot-button{margin:10px 0 0}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-22d2.813009b9.css b/priv/static/adminfe/chunk-22d2.813009b9.css deleted file mode 100644 index f0a98583e..000000000 --- a/priv/static/adminfe/chunk-22d2.813009b9.css +++ /dev/null @@ -1 +0,0 @@ -.status-card{margin-bottom:10px}.status-card .account{text-decoration:underline;line-height:26px;font-size:13px}.status-card .image{width:20%}.status-card .image img{width:100%}.status-card .show-more-button{margin-left:5px}.status-card .status-account{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.status-card .status-avatar-img{display:inline-block;width:15px;height:15px;margin-right:5px}.status-card .status-account-name{display:inline-block;margin:0;height:22px}.status-card .status-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.status-card .status-checkbox{margin-right:7px}.status-card .status-content{font-size:15px;line-height:26px}.status-card .status-deleted{font-style:italic;margin-top:3px}.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.status-card .status-without-content{font-style:italic}@media only screen and (max-width:480px){.el-message{min-width:80%}.el-message-box{width:80%}.status-card .el-card__header{padding:10px 17px}.status-card .el-tag{margin:3px 4px 3px 0}.status-card .status-account-container{margin-bottom:5px}.status-card .status-actions-button{margin:3px 0}.status-card .status-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.moderate-user-button{text-align:left;width:350px;padding:10px}.moderate-user-button-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.moderate-user-button{width:100%}}.security-settings-container{display:-webkit-box;display:-ms-flexbox;display:flex}.security-settings-container label{width:15%;height:36px}.security-settings-modal .el-dialog__body{padding-top:10px}.security-settings-modal .el-form-item,.security-settings-modal .password-alert{margin-bottom:15px}.security-settings-modal .password-input{margin-bottom:0}.security-settings-submit-button{float:right}@media (max-width:800px){.security-settings-modal .el-dialog{width:90%}}.security-settings-modal .el-alert .el-alert__description{word-break:break-word;font-size:1em}.security-settings-modal .form-text{display:block;margin-top:.25rem;color:#909399}header[data-v-d4bc7d00]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;margin:22px 0;padding-left:15px}header h1[data-v-d4bc7d00]{margin:0 0 0 10px}table[data-v-d4bc7d00]{margin:10px 0 0 15px}table .name-col[data-v-d4bc7d00]{width:150px}.avatar-name-container[data-v-d4bc7d00]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table--border[data-v-d4bc7d00]:after,.el-table--group[data-v-d4bc7d00]:after,.el-table[data-v-d4bc7d00]:before{background-color:transparent}.image[data-v-d4bc7d00]{width:20%}.image img[data-v-d4bc7d00]{width:100%}.left-header-container[data-v-d4bc7d00]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.no-statuses[data-v-d4bc7d00]{margin-left:28px;color:#606266}.poll ul[data-v-d4bc7d00]{list-style-type:none;padding:0;width:30%}.reboot-button[data-v-d4bc7d00]{padding:10px;margin-left:10px}.recent-statuses-container[data-v-d4bc7d00]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:67%}.recent-statuses-header[data-v-d4bc7d00]{margin-top:10px}.security-setting-button[data-v-d4bc7d00]{margin-top:20px;width:100%}.statuses[data-v-d4bc7d00]{padding:0 20px 0 0}.show-private[data-v-d4bc7d00]{width:200px;text-align:left;line-height:67px;margin-right:20px}.show-private-statuses[data-v-d4bc7d00]{margin-left:28px;margin-bottom:20px}.recent-statuses[data-v-d4bc7d00]{margin-left:28px}.user-page-header[data-v-d4bc7d00]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0 15px 0 20px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.user-page-header h1[data-v-d4bc7d00]{display:inline}.user-profile-card[data-v-d4bc7d00]{margin:0 20px;width:30%;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content}.user-profile-container[data-v-d4bc7d00]{display:-webkit-box;display:-ms-flexbox;display:flex}.user-profile-table[data-v-d4bc7d00]{margin:0}.user-profile-tag[data-v-d4bc7d00]{margin:0 4px 4px 0}@media only screen and (max-width:480px){.avatar-name-container[data-v-d4bc7d00]{margin-bottom:10px}.recent-statuses[data-v-d4bc7d00]{margin:20px 10px 15px}.recent-statuses-container[data-v-d4bc7d00]{width:100%;margin:0 10px}.show-private-statuses[data-v-d4bc7d00]{margin:0 10px 20px}.user-page-header[data-v-d4bc7d00]{padding:0;margin:7px 15px 15px 10px}.user-page-header-container .el-dropdown[data-v-d4bc7d00]{width:95%;margin:0 15px 15px 10px}.user-profile-card[data-v-d4bc7d00]{margin:0 10px;width:95%}.user-profile-card td[data-v-d4bc7d00]{width:80px}.user-profile-container[data-v-d4bc7d00]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}@media only screen and (max-width:801px) and (min-width:481px){.recent-statuses[data-v-d4bc7d00]{margin:20px 10px 15px 0}.recent-statuses-container[data-v-d4bc7d00]{width:97%;margin:0 20px}.show-private-statuses[data-v-d4bc7d00]{margin:0 10px 20px 0}.user-page-header[data-v-d4bc7d00]{padding:0;margin:7px 15px 20px 20px}.user-profile-card[data-v-d4bc7d00]{margin:0 20px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.user-profile-container[data-v-d4bc7d00]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-3384.2278f87c.css b/priv/static/adminfe/chunk-3384.2278f87c.css deleted file mode 100644 index 96e3273eb..000000000 --- a/priv/static/adminfe/chunk-3384.2278f87c.css +++ /dev/null @@ -1 +0,0 @@ -.copy-popover{width:330px}.emoji-buttons{place-self:center;min-width:200px}.emoji-container-grid{display:grid;grid-template-columns:75px auto auto 200px;grid-column-gap:15px;margin-bottom:10px}.emoji-preview-img{max-width:100%;place-self:center}.emoji-info{place-self:center}.copy-pack-container{place-self:center stretch}.copy-pack-select{width:100%}.remote-emoji-container-grid{display:grid;grid-template-columns:75px auto auto 160px;grid-column-gap:15px;margin-bottom:10px}@media only screen and (max-width:480px){.emoji-container-flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border:1px solid #dcdfe6;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;padding:15px;margin:0 15px 15px 0}.emoji-info,.emoji-preview-img{margin-bottom:10px}.emoji-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;width:100%}.emoji-buttons button{padding:10px 5px;width:47%}}@media only screen and (max-width:801px) and (min-width:481px){.emoji-container-grid{grid-column-gap:10px}.emoji-buttons .el-button+.el-button{margin-left:5px}.remote-emoji-container-grid{grid-column-gap:10px}}.add-new-emoji{height:36px;font-size:14px;font-weight:700;color:#606266}.text{line-height:20px;margin-right:15px}.upload-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.upload-button{margin-left:10px}.upload-file-url{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.new-emoji-uploader-form label.el-form-item__label{padding:0}}.download-archive{width:250px}.download-pack-button-container{width:265px}.download-pack-button-container .el-link,.download-pack-button-container .el-link span,.download-pack-button-container .el-link span .download-archive{width:inherit}.download-shared-pack{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.download-shared-pack-button{margin-left:10px}.el-collapse-item__content{padding-bottom:0}.el-collapse-item__header{height:36px;font-size:14px;font-weight:700;color:#606266}.emoji-pack-card{margin-top:5px}.emoji-pack-metadata .el-form-item{margin-bottom:10px}.has-background .el-collapse-item__header{background:#f6f6f6}.no-background .el-collapse-item__header{background:#fff}.pack-button-container{margin:0 0 18px 120px}.save-pack-button-container{margin-bottom:8px;width:265px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.delete-pack-button{width:45%}.download-pack-button-container{width:100%}.download-shared-pack{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.download-shared-pack-button{margin-left:0;margin-top:10px;padding:10px}.pack-button-container{width:100%;margin:0 0 22px}.remote-pack-metadata .el-form-item__content{line-height:24px;margin-top:4px}.save-pack-button{width:54%}.save-pack-button-container{margin-bottom:8px;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.save-pack-button-container button{padding:10px 5px}.save-pack-button-container .el-button+.el-button{margin-left:3px}}.emoji-header-container{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:0 15px 22px}.create-pack,.emoji-header-container,.emoji-packs-header-button-container{display:-webkit-box;display:-ms-flexbox;display:flex}.create-pack{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.create-pack-button{margin-left:10px}.emoji-packs-form{margin:0 30px}.emoji-packs-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:10px 15px 15px}.import-pack-button{margin-left:10px}h1{margin:0}.line{width:100%;height:0;border:1px solid #eee;margin-bottom:22px}.reboot-button{padding:10px;margin:0;width:145px}@media only screen and (min-width:1824px){.emoji-packs{max-width:1824px;margin:auto}}@media only screen and (max-width:480px){.create-pack{height:82px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.create-pack-button{margin-left:0}.divider{margin:15px 0}.el-message{min-width:80%}.el-message-box{width:80%}.emoji-header-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.emoji-packs-form{margin:0 7px}.emoji-packs-form label{padding-right:8px}.emoji-packs-form .el-form-item{margin-bottom:15px}.emoji-packs-header{margin:15px}.emoji-packs-header-button-container{height:82px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.emoji-packs-header-button-container .el-button+.el-button{margin:7px 0 0}.emoji-packs-header-button-container .el-button+.el-button,.reload-emoji-button{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-4011.c4799067.css b/priv/static/adminfe/chunk-4011.c4799067.css deleted file mode 100644 index 1fb099c0c..000000000 --- a/priv/static/adminfe/chunk-4011.c4799067.css +++ /dev/null @@ -1 +0,0 @@ -a{text-decoration:underline}.center-label label{text-align:center}.center-label label span{float:left}.code{background-color:rgba(173,190,214,.48);border-radius:3px;font-family:monospace;padding:0 3px}.delete-setting-button{margin-left:5px}.description>p{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;line-height:20px;margin:0 0 14px}.description>p code{display:inline;padding:2px 3px;font-size:14px}.description-container{overflow-wrap:break-word;margin-bottom:0}.divider{margin:0 0 18px}.divider.thick-line{height:2px}.docs-search-container{float:right;margin-right:30px}.editable-keyword-container{width:100%}.el-form-item .rate-limit{margin-right:0}.el-input-group__prepend{padding-left:10px;padding-right:10px}.el-tabs__header{z-index:3000}.esshd-list{margin:0}.expl,.expl>p{color:#666;font-size:13px;line-height:22px;margin:5px 0 0;overflow-wrap:break-word;overflow:hidden;text-overflow:ellipsis}.expl>p code,.expl code{display:inline;line-height:22px;font-size:13px;padding:2px 3px}.follow-relay{width:350px;margin-right:7px}.form-container{margin-bottom:80px}.grouped-settings-header{margin:0 0 14px}.highlight{background-color:#e6e6e6}.icons-button-container{width:100%;margin-bottom:10px}.icons-button-desc{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;margin-left:5px}.icon-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:95%}.icon-values-container{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 10px 10px 0}.icon-key-input{width:30%;margin-right:8px}.icon-minus-button{width:36px;height:36px}.icon-value-input{width:70%;margin-left:8px}.icons-container,.input-container{display:-webkit-box;display:-ms-flexbox;display:flex}.input-container{-webkit-box-align:start;-ms-flex-align:start;align-items:start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.input-container .el-form-item{margin-right:30px;width:100%}.input-container .el-select,.keyword-container{width:100%}label{overflow:hidden;text-overflow:ellipsis}.label-font{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700}.limit-button-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.limit-expl{margin-left:10px}.limit-input{width:47%;margin:0 0 5px 1%}.line{width:100%;height:0;border:1px solid #eee;margin-bottom:18px}.mascot{margin-bottom:15px}.mascot-container{width:100%}.mascot-input{margin-bottom:7px}.mascot-name-container{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:7px}.mascot-name-input{margin-right:10px}.multiple-select-container{width:100%}.name-input{width:30%;margin-right:8px}.pattern-input{width:20%;margin-right:8px}.proxy-url-input{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px;width:100%}.proxy-url-host-input{width:35%;margin-right:8px}.proxy-url-value-input{width:35%;margin-left:8px;margin-right:10px}.prune-options{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.prune-options .el-radio{margin-top:11px}.rate-limit .el-form-item__content{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.rate-limit-container,.rate-limit-content{width:100%}.rate-limit-label{float:right}.rate-limit-label-container{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;height:36px;width:100%;margin-right:10px}.reboot-button{width:145px;text-align:left;padding:10px;float:right;margin:0 30px 0 0}.reboot-button-container{width:100%;position:fixed;top:60px;right:0;z-index:2000}.relays-container{margin:0 15px}.replacement-input{width:80%;margin-left:8px;margin-right:10px}.scale-input{width:47%;margin:0 1% 5px 0}.setting-input{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.settings-container{max-width:1824px;margin:auto}.settings-container .el-tabs{margin-top:20px}.settings-delete-button{margin-left:5px}.settings-docs-button{width:163px;text-align:left;padding:10px}.settings-header{margin:10px 15px 15px}.header-sidebar-opened{max-width:1585px}.header-sidebar-closed{max-width:1728px}.settings-header-container{height:87px}.settings-search-input{width:350px;margin-left:5px}.single-input{margin-right:10px}.socks5-checkbox{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;margin-left:10px}.socks5-checkbox-container{width:40%;height:36px;margin-right:5px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ssl-tls-opts{margin:36px 0 0}.submit-button{float:right;margin:0 30px 22px 0}.submit-button-container{width:100%;position:fixed;bottom:0;right:0;z-index:2000}.switch-input{height:36px}.text{line-height:20px;margin-right:15px}.upload-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.value-input{width:70%;margin-left:8px;margin-right:10px}@media only screen and (min-width:1824px){.header-sidebar-closed{max-width:1772px}.header-sidebar-opened{max-width:1630px}.reboot-button-container{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}.reboot-sidebar-opened{max-width:1630px}.reboot-sidebar-closed{max-width:1772px}.sidebar-closed{max-width:1586px}.sidebar-opened{max-width:1442px}.submit-button-container{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}}@media only screen and (max-width:480px){.crontab,.crontab label{width:100%}.delete-setting-button{margin:4px 0 0 5px;height:28px}.delete-setting-button-container{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p{line-height:18px;margin:0 5px 7px 15px}.description>p code{display:inline;line-height:18px;padding:2px 3px;font-size:14px}.divider{margin:0 0 10px}.divider .thick-line{height:2px}.follow-relay{width:70%;margin-right:5px}.follow-relay input{width:100%}.follow-relay-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}h1{font-size:24px}.input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container{width:100%}.input-container .el-form-item:first-child{margin:0;padding:0 15px 10px}.input-container .el-form-item.crontab-container:first-child{margin:0;padding:0}.input-container .el-form-item:first-child .mascot-form-item,.input-container .el-form-item:first-child .rate-limit{padding:0}.input-container .settings-delete-button{margin-top:4px;float:right}.input-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.label-with-margin{margin-left:15px}.limit-input{width:45%}.nav-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px}.proxy-url-input{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;margin-bottom:0}.proxy-url-host-input{width:100%;margin-bottom:5px}.proxy-url-value-input{width:100%;margin-left:0}.prune-options{height:80px}.prune-options,.rate-limit .el-form-item__content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.rate-limit-label{float:left}.reboot-button{margin:0 15px 0 0}.reboot-button-container{top:57px}.scale-input{width:45%}.setting-label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.settings-header{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:inline-block;margin:10px 15px 15px}.docs-search-container{float:right}.settings-search-input{width:100%;margin-left:0}.settings-search-input-container{margin:0 15px 15px}.settings-menu{width:163px;margin-right:5px}.socks5-checkbox-container{width:100%}.submit-button{margin:0 15px 22px 0}.el-input__inner{padding:0 5px}.el-form-item__label:not(.no-top-margin){padding-bottom:5px;line-height:22px;margin-top:7px;width:100%}.el-form-item__label:not(.no-top-margin) span{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-message{min-width:80%}.el-select__tags{overflow:hidden}.expl,.expl>p{line-height:16px}.icon-key-input{width:40%;margin-right:4px}.icon-minus-button{width:28px;height:28px;margin-top:4px}.icon-values-container{margin:0 7px 7px 0}.icon-value-input{width:60%;margin-left:4px}.icons-button-container{line-height:24px}.line{margin-bottom:10px}.mascot-form-item .el-form-item__label:not(.no-top-margin){margin:0;padding:0}.mascot-container{margin-bottom:5px}.name-input{width:40%;margin-right:5px}p.expl{line-height:20px}.pattern-input{width:40%;margin-right:4px}.relays-container{margin:0 10px}.replacement-input{width:60%;margin-left:4px;margin-right:5px}.settings-header-container{height:45px}.value-input{width:60%;margin-left:5px;margin-right:8px}}@media only screen and (max-width:818px) and (min-width:481px){.delete-setting-button{margin:4px 0 0 10px;height:28px}.delete-setting-button-container{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p{line-height:18px;margin:0 15px 10px 0}.icon-minus-button{width:28px;height:28px;margin-top:4px}.input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container .el-form-item__label span{margin-left:10px}.input-row,.nav-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.nav-container{height:36px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px 30px 15px 15px}.rate-limit-label-container{width:250px}.settings-delete-button{float:right}.settings-header-container{height:36px}.settings-search-input{width:250px;margin:0 0 15px 15px}}a[data-v-667428a6]{text-decoration:underline}.center-label label[data-v-667428a6]{text-align:center}.center-label label span[data-v-667428a6]{float:left}.code[data-v-667428a6]{background-color:rgba(173,190,214,.48);border-radius:3px;font-family:monospace;padding:0 3px}.delete-setting-button[data-v-667428a6]{margin-left:5px}.description>p[data-v-667428a6]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;line-height:20px;margin:0 0 14px}.description>p code[data-v-667428a6]{display:inline;padding:2px 3px;font-size:14px}.description-container[data-v-667428a6]{overflow-wrap:break-word;margin-bottom:0}.divider[data-v-667428a6]{margin:0 0 18px}.divider.thick-line[data-v-667428a6]{height:2px}.docs-search-container[data-v-667428a6]{float:right;margin-right:30px}.editable-keyword-container[data-v-667428a6]{width:100%}.el-form-item .rate-limit[data-v-667428a6]{margin-right:0}.el-input-group__prepend[data-v-667428a6]{padding-left:10px;padding-right:10px}.el-tabs__header[data-v-667428a6]{z-index:3000}.esshd-list[data-v-667428a6]{margin:0}.expl>p[data-v-667428a6],.expl[data-v-667428a6]{color:#666;font-size:13px;line-height:22px;margin:5px 0 0;overflow-wrap:break-word;overflow:hidden;text-overflow:ellipsis}.expl>p code[data-v-667428a6],.expl code[data-v-667428a6]{display:inline;line-height:22px;font-size:13px;padding:2px 3px}.follow-relay[data-v-667428a6]{width:350px;margin-right:7px}.form-container[data-v-667428a6]{margin-bottom:80px}.grouped-settings-header[data-v-667428a6]{margin:0 0 14px}.highlight[data-v-667428a6]{background-color:#e6e6e6}.icons-button-container[data-v-667428a6]{width:100%;margin-bottom:10px}.icons-button-desc[data-v-667428a6]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;margin-left:5px}.icon-container[data-v-667428a6]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:95%}.icon-values-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 10px 10px 0}.icon-key-input[data-v-667428a6]{width:30%;margin-right:8px}.icon-minus-button[data-v-667428a6]{width:36px;height:36px}.icon-value-input[data-v-667428a6]{width:70%;margin-left:8px}.icons-container[data-v-667428a6],.input-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex}.input-container[data-v-667428a6]{-webkit-box-align:start;-ms-flex-align:start;align-items:start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.input-container .el-form-item[data-v-667428a6]{margin-right:30px;width:100%}.input-container .el-select[data-v-667428a6],.keyword-container[data-v-667428a6]{width:100%}label[data-v-667428a6]{overflow:hidden;text-overflow:ellipsis}.label-font[data-v-667428a6]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700}.limit-button-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.limit-expl[data-v-667428a6]{margin-left:10px}.limit-input[data-v-667428a6]{width:47%;margin:0 0 5px 1%}.line[data-v-667428a6]{width:100%;height:0;border:1px solid #eee;margin-bottom:18px}.mascot[data-v-667428a6]{margin-bottom:15px}.mascot-container[data-v-667428a6]{width:100%}.mascot-input[data-v-667428a6]{margin-bottom:7px}.mascot-name-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:7px}.mascot-name-input[data-v-667428a6]{margin-right:10px}.multiple-select-container[data-v-667428a6]{width:100%}.name-input[data-v-667428a6]{width:30%;margin-right:8px}.pattern-input[data-v-667428a6]{width:20%;margin-right:8px}.proxy-url-input[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px;width:100%}.proxy-url-host-input[data-v-667428a6]{width:35%;margin-right:8px}.proxy-url-value-input[data-v-667428a6]{width:35%;margin-left:8px;margin-right:10px}.prune-options[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.prune-options .el-radio[data-v-667428a6]{margin-top:11px}.rate-limit .el-form-item__content[data-v-667428a6]{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.rate-limit-container[data-v-667428a6],.rate-limit-content[data-v-667428a6]{width:100%}.rate-limit-label[data-v-667428a6]{float:right}.rate-limit-label-container[data-v-667428a6]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;height:36px;width:100%;margin-right:10px}.reboot-button[data-v-667428a6]{width:145px;text-align:left;padding:10px;float:right;margin:0 30px 0 0}.reboot-button-container[data-v-667428a6]{width:100%;position:fixed;top:60px;right:0;z-index:2000}.relays-container[data-v-667428a6]{margin:0 15px}.replacement-input[data-v-667428a6]{width:80%;margin-left:8px;margin-right:10px}.scale-input[data-v-667428a6]{width:47%;margin:0 1% 5px 0}.setting-input[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.settings-container[data-v-667428a6]{max-width:1824px;margin:auto}.settings-container .el-tabs[data-v-667428a6]{margin-top:20px}.settings-delete-button[data-v-667428a6]{margin-left:5px}.settings-docs-button[data-v-667428a6]{width:163px;text-align:left;padding:10px}.settings-header[data-v-667428a6]{margin:10px 15px 15px}.header-sidebar-opened[data-v-667428a6]{max-width:1585px}.header-sidebar-closed[data-v-667428a6]{max-width:1728px}.settings-header-container[data-v-667428a6]{height:87px}.settings-search-input[data-v-667428a6]{width:350px;margin-left:5px}.single-input[data-v-667428a6]{margin-right:10px}.socks5-checkbox[data-v-667428a6]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;margin-left:10px}.socks5-checkbox-container[data-v-667428a6]{width:40%;height:36px;margin-right:5px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ssl-tls-opts[data-v-667428a6]{margin:36px 0 0}.submit-button[data-v-667428a6]{float:right;margin:0 30px 22px 0}.submit-button-container[data-v-667428a6]{width:100%;position:fixed;bottom:0;right:0;z-index:2000}.switch-input[data-v-667428a6]{height:36px}.text[data-v-667428a6]{line-height:20px;margin-right:15px}.upload-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.value-input[data-v-667428a6]{width:70%;margin-left:8px;margin-right:10px}@media only screen and (min-width:1824px){.header-sidebar-closed[data-v-667428a6]{max-width:1772px}.header-sidebar-opened[data-v-667428a6]{max-width:1630px}.reboot-button-container[data-v-667428a6]{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}.reboot-sidebar-opened[data-v-667428a6]{max-width:1630px}.reboot-sidebar-closed[data-v-667428a6]{max-width:1772px}.sidebar-closed[data-v-667428a6]{max-width:1586px}.sidebar-opened[data-v-667428a6]{max-width:1442px}.submit-button-container[data-v-667428a6]{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}}@media only screen and (max-width:480px){.crontab[data-v-667428a6],.crontab label[data-v-667428a6]{width:100%}.delete-setting-button[data-v-667428a6]{margin:4px 0 0 5px;height:28px}.delete-setting-button-container[data-v-667428a6]{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p[data-v-667428a6]{line-height:18px;margin:0 5px 7px 15px}.description>p code[data-v-667428a6]{display:inline;line-height:18px;padding:2px 3px;font-size:14px}.divider[data-v-667428a6]{margin:0 0 10px}.divider .thick-line[data-v-667428a6]{height:2px}.follow-relay[data-v-667428a6]{width:70%;margin-right:5px}.follow-relay input[data-v-667428a6]{width:100%}.follow-relay-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}h1[data-v-667428a6]{font-size:24px}.input[data-v-667428a6]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container[data-v-667428a6]{width:100%}.input-container .el-form-item[data-v-667428a6]:first-child{margin:0;padding:0 15px 10px}.input-container .el-form-item.crontab-container[data-v-667428a6]:first-child{margin:0;padding:0}.input-container .el-form-item:first-child .mascot-form-item[data-v-667428a6],.input-container .el-form-item:first-child .rate-limit[data-v-667428a6]{padding:0}.input-container .settings-delete-button[data-v-667428a6]{margin-top:4px;float:right}.input-row[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.label-with-margin[data-v-667428a6]{margin-left:15px}.limit-input[data-v-667428a6]{width:45%}.nav-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px}.proxy-url-input[data-v-667428a6]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;margin-bottom:0}.proxy-url-host-input[data-v-667428a6]{width:100%;margin-bottom:5px}.proxy-url-value-input[data-v-667428a6]{width:100%;margin-left:0}.prune-options[data-v-667428a6]{height:80px}.prune-options[data-v-667428a6],.rate-limit .el-form-item__content[data-v-667428a6]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.rate-limit-label[data-v-667428a6]{float:left}.reboot-button[data-v-667428a6]{margin:0 15px 0 0}.reboot-button-container[data-v-667428a6]{top:57px}.scale-input[data-v-667428a6]{width:45%}.setting-label[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.settings-header[data-v-667428a6]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:inline-block;margin:10px 15px 15px}.docs-search-container[data-v-667428a6]{float:right}.settings-search-input[data-v-667428a6]{width:100%;margin-left:0}.settings-search-input-container[data-v-667428a6]{margin:0 15px 15px}.settings-menu[data-v-667428a6]{width:163px;margin-right:5px}.socks5-checkbox-container[data-v-667428a6]{width:100%}.submit-button[data-v-667428a6]{margin:0 15px 22px 0}.el-input__inner[data-v-667428a6]{padding:0 5px}.el-form-item__label[data-v-667428a6]:not(.no-top-margin){padding-bottom:5px;line-height:22px;margin-top:7px;width:100%}.el-form-item__label:not(.no-top-margin) span[data-v-667428a6]{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-message[data-v-667428a6]{min-width:80%}.el-select__tags[data-v-667428a6]{overflow:hidden}.expl>p[data-v-667428a6],.expl[data-v-667428a6]{line-height:16px}.icon-key-input[data-v-667428a6]{width:40%;margin-right:4px}.icon-minus-button[data-v-667428a6]{width:28px;height:28px;margin-top:4px}.icon-values-container[data-v-667428a6]{margin:0 7px 7px 0}.icon-value-input[data-v-667428a6]{width:60%;margin-left:4px}.icons-button-container[data-v-667428a6]{line-height:24px}.line[data-v-667428a6]{margin-bottom:10px}.mascot-form-item .el-form-item__label[data-v-667428a6]:not(.no-top-margin){margin:0;padding:0}.mascot-container[data-v-667428a6]{margin-bottom:5px}.name-input[data-v-667428a6]{width:40%;margin-right:5px}p.expl[data-v-667428a6]{line-height:20px}.pattern-input[data-v-667428a6]{width:40%;margin-right:4px}.relays-container[data-v-667428a6]{margin:0 10px}.replacement-input[data-v-667428a6]{width:60%;margin-left:4px;margin-right:5px}.settings-header-container[data-v-667428a6]{height:45px}.value-input[data-v-667428a6]{width:60%;margin-left:5px;margin-right:8px}}@media only screen and (max-width:818px) and (min-width:481px){.delete-setting-button[data-v-667428a6]{margin:4px 0 0 10px;height:28px}.delete-setting-button-container[data-v-667428a6]{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p[data-v-667428a6]{line-height:18px;margin:0 15px 10px 0}.icon-minus-button[data-v-667428a6]{width:28px;height:28px;margin-top:4px}.input[data-v-667428a6]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container .el-form-item__label span[data-v-667428a6]{margin-left:10px}.input-row[data-v-667428a6],.nav-container[data-v-667428a6]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.nav-container[data-v-667428a6]{height:36px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px 30px 15px 15px}.rate-limit-label-container[data-v-667428a6]{width:250px}.settings-delete-button[data-v-667428a6]{float:right}.settings-header-container[data-v-667428a6]{height:36px}.settings-search-input[data-v-667428a6]{width:250px;margin:0 0 15px 15px}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-43ca.0de86b6d.css b/priv/static/adminfe/chunk-43ca.0de86b6d.css new file mode 100644 index 000000000..817a6be44 --- /dev/null +++ b/priv/static/adminfe/chunk-43ca.0de86b6d.css @@ -0,0 +1 @@ +a{text-decoration:underline}.center-label label{text-align:center}.center-label label span{float:left}.code{background-color:rgba(173,190,214,.48);border-radius:3px;font-family:monospace;padding:0 3px}.delete-setting-button{margin-left:5px}.description-container{overflow-wrap:break-word}.description-container .el-form-item__content{line-height:20px}.divider{margin:0 0 18px}.divider.thick-line{height:2px}.docs-search-container{float:right;margin-right:30px}.editable-keyword-container{width:100%}.el-form-item .rate-limit{margin-right:0}.el-input-group__prepend{padding-left:10px;padding-right:10px}.el-tabs__header{z-index:2002}.esshd-list{margin:0}.expl,.expl>p{color:#666;font-size:13px;line-height:22px;margin:5px 0 0;overflow-wrap:break-word;overflow:hidden;text-overflow:ellipsis}.expl>p code,.expl code{display:inline;line-height:22px;font-size:13px;padding:2px 3px}.follow-relay{width:350px;margin-right:7px}.form-container{margin-bottom:80px}.grouped-settings-header{margin:0 0 14px}.highlight{background-color:#e6e6e6}.icons-button-container{width:100%;margin-bottom:10px}.icons-button-desc{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;margin-left:5px}.icon-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:95%}.icon-values-container{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 10px 10px 0}.icon-key-input{width:30%;margin-right:8px}.icon-minus-button{width:36px;height:36px}.icon-value-input{width:70%;margin-left:8px}.icons-container,.input-container{display:-webkit-box;display:-ms-flexbox;display:flex}.input-container{-webkit-box-align:start;-ms-flex-align:start;align-items:start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.input-container .el-form-item{margin-right:30px;width:100%}.input-container .el-select,.keyword-container{width:100%}label{overflow:hidden;text-overflow:ellipsis}.label-font{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700}.limit-button-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.limit-expl{margin-left:10px}.limit-input{width:47%;margin:0 0 5px 1%}.line{width:100%;height:0;border:1px solid #eee;margin-bottom:18px}.mascot{margin-bottom:15px}.mascot-container{width:100%}.mascot-input{margin-bottom:7px}.mascot-name-container{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:7px}.mascot-name-input{margin-right:10px}.multiple-select-container{width:100%}.name-input{width:30%;margin-right:8px}.no-top-margin{margin-top:0}.pattern-input{width:20%;margin-right:8px}.proxy-url-input{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px;width:100%}.proxy-url-host-input{width:35%;margin-right:8px}.proxy-url-value-input{width:35%;margin-left:8px;margin-right:10px}.prune-options{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.prune-options .el-radio{margin-top:11px}.rate-limit .el-form-item__content{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.rate-limit-container,.rate-limit-content{width:100%}.rate-limit-label{float:right}.rate-limit-label-container{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;height:36px;width:100%;margin-right:10px}.reboot-button{width:145px;text-align:left;padding:10px;float:right;margin:0 30px 0 0}.reboot-button-container{width:100%;position:fixed;top:60px;right:0;z-index:2000}.relays-container{margin:0 15px}.replacement-input{width:80%;margin-left:8px;margin-right:10px}.scale-input{width:47%;margin:0 1% 5px 0}.setting-input{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.setting-label{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;line-height:20px;margin:0 0 14px}.settings-container{max-width:1824px;margin:auto}.settings-container .el-tabs{margin-top:20px}.settings-delete-button{margin-left:5px}.settings-docs-button{width:163px;text-align:left;padding:10px}.settings-header{margin:10px 15px 15px}.header-sidebar-opened{max-width:1585px}.header-sidebar-closed{max-width:1728px}.settings-header-container{height:87px}.settings-search-input{width:350px;margin-left:5px}.single-input{margin-right:10px}.socks5-checkbox{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;margin-left:10px}.socks5-checkbox-container{width:40%;height:36px;margin-right:5px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ssl-tls-opts{margin:36px 0 0}.submit-button{float:right;margin:0 30px 22px 0}.submit-button-container{width:100%;position:fixed;bottom:0;right:0;z-index:2000}.switch-input{height:36px}.text{line-height:20px;margin-right:15px}.upload-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.value-input{width:70%;margin-left:8px;margin-right:10px}@media only screen and (min-width:1824px){.header-sidebar-closed{max-width:1772px}.header-sidebar-opened{max-width:1630px}.reboot-button-container{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}.reboot-sidebar-opened{max-width:1630px}.reboot-sidebar-closed{max-width:1772px}.sidebar-closed{max-width:1586px}.sidebar-opened{max-width:1442px}.submit-button-container{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}}@media only screen and (max-width:480px){.crontab,.crontab label{width:100%}.delete-setting-button{margin:4px 0 0 5px;height:28px}.delete-setting-button-container{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p{line-height:18px;margin:0 5px 7px 15px}.description>p code{display:inline;line-height:18px;padding:2px 3px;font-size:14px}.divider{margin:0 0 10px}.divider .thick-line{height:2px}.follow-relay{width:70%;margin-right:5px}.follow-relay input{width:100%}.follow-relay-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}h1{font-size:24px}.input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container{width:100%}.input-container .el-form-item:first-child{margin:0;padding:0 15px 10px}.input-container .el-form-item.crontab-container:first-child{margin:0;padding:0}.input-container .el-form-item:first-child .mascot-form-item,.input-container .el-form-item:first-child .rate-limit{padding:0}.input-container .settings-delete-button{margin-top:4px;float:right}.input-row{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.label-with-margin{margin-left:15px}.limit-input{width:45%}.nav-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px}.proxy-url-input{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;margin-bottom:0}.proxy-url-host-input{width:100%;margin-bottom:5px}.proxy-url-value-input{width:100%;margin-left:0}.prune-options{height:80px}.prune-options,.rate-limit .el-form-item__content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.rate-limit-label{float:left}.reboot-button{margin:0 15px 0 0}.reboot-button-container{top:57px}.scale-input{width:45%}.settings-header{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:inline-block;margin:10px 15px 15px}.docs-search-container{float:right}.settings-search-input{width:100%;margin-left:0}.settings-search-input-container{margin:0 15px 15px}.settings-menu{width:163px;margin-right:5px}.socks5-checkbox-container{width:100%}.submit-button{margin:0 15px 22px 0}.el-input__inner{padding:0 5px}.el-form-item__label:not(.no-top-margin){padding-bottom:5px;line-height:22px;margin-top:7px;width:100%}.el-form-item__label:not(.no-top-margin) span{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-message{min-width:80%}.el-select__tags{overflow:hidden}.expl,.expl>p{line-height:16px}.icon-key-input{width:40%;margin-right:4px}.icon-minus-button{width:28px;height:28px;margin-top:4px}.icon-values-container{margin:0 7px 7px 0}.icon-value-input{width:60%;margin-left:4px}.icons-button-container{line-height:24px}.line{margin-bottom:10px}.mascot-form-item .el-form-item__label:not(.no-top-margin){margin:0;padding:0}.mascot-container{margin-bottom:5px}.name-input{width:40%;margin-right:5px}p.expl{line-height:20px}.pattern-input{width:40%;margin-right:4px}.relays-container{margin:0 10px}.replacement-input{width:60%;margin-left:4px;margin-right:5px}.settings-header-container{height:45px}.value-input{width:60%;margin-left:5px;margin-right:8px}}@media only screen and (max-width:818px) and (min-width:481px){.delete-setting-button{margin:4px 0 0 10px;height:28px}.delete-setting-button-container{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p{line-height:18px;margin:0 15px 10px 0}.icon-minus-button{width:28px;height:28px;margin-top:4px}.input{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container .el-form-item__label span{margin-left:10px}.input-row,.nav-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.nav-container{height:36px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px 30px 15px 15px}.rate-limit-label-container{width:250px}.settings-delete-button{float:right}.settings-header-container{height:36px}.settings-search-input{width:250px;margin:0 0 15px 15px}}a[data-v-2b61d370]{text-decoration:underline}.center-label label[data-v-2b61d370]{text-align:center}.center-label label span[data-v-2b61d370]{float:left}.code[data-v-2b61d370]{background-color:rgba(173,190,214,.48);border-radius:3px;font-family:monospace;padding:0 3px}.delete-setting-button[data-v-2b61d370]{margin-left:5px}.description-container[data-v-2b61d370]{overflow-wrap:break-word}.description-container .el-form-item__content[data-v-2b61d370]{line-height:20px}.divider[data-v-2b61d370]{margin:0 0 18px}.divider.thick-line[data-v-2b61d370]{height:2px}.docs-search-container[data-v-2b61d370]{float:right;margin-right:30px}.editable-keyword-container[data-v-2b61d370]{width:100%}.el-form-item .rate-limit[data-v-2b61d370]{margin-right:0}.el-input-group__prepend[data-v-2b61d370]{padding-left:10px;padding-right:10px}.el-tabs__header[data-v-2b61d370]{z-index:2002}.esshd-list[data-v-2b61d370]{margin:0}.expl>p[data-v-2b61d370],.expl[data-v-2b61d370]{color:#666;font-size:13px;line-height:22px;margin:5px 0 0;overflow-wrap:break-word;overflow:hidden;text-overflow:ellipsis}.expl>p code[data-v-2b61d370],.expl code[data-v-2b61d370]{display:inline;line-height:22px;font-size:13px;padding:2px 3px}.follow-relay[data-v-2b61d370]{width:350px;margin-right:7px}.form-container[data-v-2b61d370]{margin-bottom:80px}.grouped-settings-header[data-v-2b61d370]{margin:0 0 14px}.highlight[data-v-2b61d370]{background-color:#e6e6e6}.icons-button-container[data-v-2b61d370]{width:100%;margin-bottom:10px}.icons-button-desc[data-v-2b61d370]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;margin-left:5px}.icon-container[data-v-2b61d370]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:95%}.icon-values-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;margin:0 10px 10px 0}.icon-key-input[data-v-2b61d370]{width:30%;margin-right:8px}.icon-minus-button[data-v-2b61d370]{width:36px;height:36px}.icon-value-input[data-v-2b61d370]{width:70%;margin-left:8px}.icons-container[data-v-2b61d370],.input-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex}.input-container[data-v-2b61d370]{-webkit-box-align:start;-ms-flex-align:start;align-items:start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.input-container .el-form-item[data-v-2b61d370]{margin-right:30px;width:100%}.input-container .el-select[data-v-2b61d370],.keyword-container[data-v-2b61d370]{width:100%}label[data-v-2b61d370]{overflow:hidden;text-overflow:ellipsis}.label-font[data-v-2b61d370]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700}.limit-button-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.limit-expl[data-v-2b61d370]{margin-left:10px}.limit-input[data-v-2b61d370]{width:47%;margin:0 0 5px 1%}.line[data-v-2b61d370]{width:100%;height:0;border:1px solid #eee;margin-bottom:18px}.mascot[data-v-2b61d370]{margin-bottom:15px}.mascot-container[data-v-2b61d370]{width:100%}.mascot-input[data-v-2b61d370]{margin-bottom:7px}.mascot-name-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:7px}.mascot-name-input[data-v-2b61d370]{margin-right:10px}.multiple-select-container[data-v-2b61d370]{width:100%}.name-input[data-v-2b61d370]{width:30%;margin-right:8px}.no-top-margin[data-v-2b61d370]{margin-top:0}.pattern-input[data-v-2b61d370]{width:20%;margin-right:8px}.proxy-url-input[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:10px;width:100%}.proxy-url-host-input[data-v-2b61d370]{width:35%;margin-right:8px}.proxy-url-value-input[data-v-2b61d370]{width:35%;margin-left:8px;margin-right:10px}.prune-options[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.prune-options .el-radio[data-v-2b61d370]{margin-top:11px}.rate-limit .el-form-item__content[data-v-2b61d370]{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.rate-limit-container[data-v-2b61d370],.rate-limit-content[data-v-2b61d370]{width:100%}.rate-limit-label[data-v-2b61d370]{float:right}.rate-limit-label-container[data-v-2b61d370]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;height:36px;width:100%;margin-right:10px}.reboot-button[data-v-2b61d370]{width:145px;text-align:left;padding:10px;float:right;margin:0 30px 0 0}.reboot-button-container[data-v-2b61d370]{width:100%;position:fixed;top:60px;right:0;z-index:2000}.relays-container[data-v-2b61d370]{margin:0 15px}.replacement-input[data-v-2b61d370]{width:80%;margin-left:8px;margin-right:10px}.scale-input[data-v-2b61d370]{width:47%;margin:0 1% 5px 0}.setting-input[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.setting-label[data-v-2b61d370]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;line-height:20px;margin:0 0 14px}.settings-container[data-v-2b61d370]{max-width:1824px;margin:auto}.settings-container .el-tabs[data-v-2b61d370]{margin-top:20px}.settings-delete-button[data-v-2b61d370]{margin-left:5px}.settings-docs-button[data-v-2b61d370]{width:163px;text-align:left;padding:10px}.settings-header[data-v-2b61d370]{margin:10px 15px 15px}.header-sidebar-opened[data-v-2b61d370]{max-width:1585px}.header-sidebar-closed[data-v-2b61d370]{max-width:1728px}.settings-header-container[data-v-2b61d370]{height:87px}.settings-search-input[data-v-2b61d370]{width:350px;margin-left:5px}.single-input[data-v-2b61d370]{margin-right:10px}.socks5-checkbox[data-v-2b61d370]{font-size:14px;color:#606266;font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei;font-weight:700;margin-left:10px}.socks5-checkbox-container[data-v-2b61d370]{width:40%;height:36px;margin-right:5px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ssl-tls-opts[data-v-2b61d370]{margin:36px 0 0}.submit-button[data-v-2b61d370]{float:right;margin:0 30px 22px 0}.submit-button-container[data-v-2b61d370]{width:100%;position:fixed;bottom:0;right:0;z-index:2000}.switch-input[data-v-2b61d370]{height:36px}.text[data-v-2b61d370]{line-height:20px;margin-right:15px}.upload-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.value-input[data-v-2b61d370]{width:70%;margin-left:8px;margin-right:10px}@media only screen and (min-width:1824px){.header-sidebar-closed[data-v-2b61d370]{max-width:1772px}.header-sidebar-opened[data-v-2b61d370]{max-width:1630px}.reboot-button-container[data-v-2b61d370]{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}.reboot-sidebar-opened[data-v-2b61d370]{max-width:1630px}.reboot-sidebar-closed[data-v-2b61d370]{max-width:1772px}.sidebar-closed[data-v-2b61d370]{max-width:1586px}.sidebar-opened[data-v-2b61d370]{max-width:1442px}.submit-button-container[data-v-2b61d370]{width:100%;max-width:inherit;margin-left:auto;margin-right:auto;right:auto}}@media only screen and (max-width:480px){.crontab[data-v-2b61d370],.crontab label[data-v-2b61d370]{width:100%}.delete-setting-button[data-v-2b61d370]{margin:4px 0 0 5px;height:28px}.delete-setting-button-container[data-v-2b61d370]{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p[data-v-2b61d370]{line-height:18px;margin:0 5px 7px 15px}.description>p code[data-v-2b61d370]{display:inline;line-height:18px;padding:2px 3px;font-size:14px}.divider[data-v-2b61d370]{margin:0 0 10px}.divider .thick-line[data-v-2b61d370]{height:2px}.follow-relay[data-v-2b61d370]{width:70%;margin-right:5px}.follow-relay input[data-v-2b61d370]{width:100%}.follow-relay-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}h1[data-v-2b61d370]{font-size:24px}.input[data-v-2b61d370]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container[data-v-2b61d370]{width:100%}.input-container .el-form-item[data-v-2b61d370]:first-child{margin:0;padding:0 15px 10px}.input-container .el-form-item.crontab-container[data-v-2b61d370]:first-child{margin:0;padding:0}.input-container .el-form-item:first-child .mascot-form-item[data-v-2b61d370],.input-container .el-form-item:first-child .rate-limit[data-v-2b61d370]{padding:0}.input-container .settings-delete-button[data-v-2b61d370]{margin-top:4px;float:right}.input-row[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.label-with-margin[data-v-2b61d370]{margin-left:15px}.limit-input[data-v-2b61d370]{width:45%}.nav-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px}.proxy-url-input[data-v-2b61d370]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;margin-bottom:0}.proxy-url-host-input[data-v-2b61d370]{width:100%;margin-bottom:5px}.proxy-url-value-input[data-v-2b61d370]{width:100%;margin-left:0}.prune-options[data-v-2b61d370]{height:80px}.prune-options[data-v-2b61d370],.rate-limit .el-form-item__content[data-v-2b61d370]{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.rate-limit-label[data-v-2b61d370]{float:left}.reboot-button[data-v-2b61d370]{margin:0 15px 0 0}.reboot-button-container[data-v-2b61d370]{top:57px}.scale-input[data-v-2b61d370]{width:45%}.settings-header[data-v-2b61d370]{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;display:inline-block;margin:10px 15px 15px}.docs-search-container[data-v-2b61d370]{float:right}.settings-search-input[data-v-2b61d370]{width:100%;margin-left:0}.settings-search-input-container[data-v-2b61d370]{margin:0 15px 15px}.settings-menu[data-v-2b61d370]{width:163px;margin-right:5px}.socks5-checkbox-container[data-v-2b61d370]{width:100%}.submit-button[data-v-2b61d370]{margin:0 15px 22px 0}.el-input__inner[data-v-2b61d370]{padding:0 5px}.el-form-item__label[data-v-2b61d370]:not(.no-top-margin){padding-bottom:5px;line-height:22px;margin-top:7px;width:100%}.el-form-item__label:not(.no-top-margin) span[data-v-2b61d370]{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-message[data-v-2b61d370]{min-width:80%}.el-select__tags[data-v-2b61d370]{overflow:hidden}.expl>p[data-v-2b61d370],.expl[data-v-2b61d370]{line-height:16px}.icon-key-input[data-v-2b61d370]{width:40%;margin-right:4px}.icon-minus-button[data-v-2b61d370]{width:28px;height:28px;margin-top:4px}.icon-values-container[data-v-2b61d370]{margin:0 7px 7px 0}.icon-value-input[data-v-2b61d370]{width:60%;margin-left:4px}.icons-button-container[data-v-2b61d370]{line-height:24px}.line[data-v-2b61d370]{margin-bottom:10px}.mascot-form-item .el-form-item__label[data-v-2b61d370]:not(.no-top-margin){margin:0;padding:0}.mascot-container[data-v-2b61d370]{margin-bottom:5px}.name-input[data-v-2b61d370]{width:40%;margin-right:5px}p.expl[data-v-2b61d370]{line-height:20px}.pattern-input[data-v-2b61d370]{width:40%;margin-right:4px}.relays-container[data-v-2b61d370]{margin:0 10px}.replacement-input[data-v-2b61d370]{width:60%;margin-left:4px;margin-right:5px}.settings-header-container[data-v-2b61d370]{height:45px}.value-input[data-v-2b61d370]{width:60%;margin-left:5px;margin-right:8px}}@media only screen and (max-width:818px) and (min-width:481px){.delete-setting-button[data-v-2b61d370]{margin:4px 0 0 10px;height:28px}.delete-setting-button-container[data-v-2b61d370]{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto}.description>p[data-v-2b61d370]{line-height:18px;margin:0 15px 10px 0}.icon-minus-button[data-v-2b61d370]{width:28px;height:28px;margin-top:4px}.input[data-v-2b61d370]{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.input-container .el-form-item__label span[data-v-2b61d370]{margin-left:10px}.input-row[data-v-2b61d370],.nav-container[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.nav-container[data-v-2b61d370]{height:36px;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px 30px 15px 15px}.rate-limit-label-container[data-v-2b61d370]{width:250px}.settings-delete-button[data-v-2b61d370]{float:right}.settings-header-container[data-v-2b61d370]{height:36px}.settings-search-input[data-v-2b61d370]{width:250px;margin:0 0 15px 15px}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-0961.d3692214.css b/priv/static/adminfe/chunk-4e7e.5afe1978.css similarity index 100% rename from priv/static/adminfe/chunk-0961.d3692214.css rename to priv/static/adminfe/chunk-4e7e.5afe1978.css diff --git a/priv/static/adminfe/chunk-5882.f65db7f2.css b/priv/static/adminfe/chunk-5882.f65db7f2.css new file mode 100644 index 000000000..b5e2a00b0 --- /dev/null +++ b/priv/static/adminfe/chunk-5882.f65db7f2.css @@ -0,0 +1 @@ +.moderate-user-button{text-align:left;width:350px;padding:10px}.moderate-user-button-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.moderate-user-button{width:100%}}.security-settings-container{display:-webkit-box;display:-ms-flexbox;display:flex}.security-settings-container label{width:15%;height:36px}.security-settings-modal .el-dialog__body{padding-top:10px}.security-settings-modal .el-form-item,.security-settings-modal .password-alert{margin-bottom:15px}.security-settings-modal .password-input{margin-bottom:0}.security-settings-submit-button{float:right}@media (max-width:800px){.security-settings-modal .el-dialog{width:90%}}.security-settings-modal .el-alert .el-alert__description{word-break:break-word;font-size:1em}.security-settings-modal .form-text{display:block;margin-top:.25rem;color:#909399}header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;margin:22px 0;padding-left:15px}header h1{margin:0 0 0 10px}table{margin:10px 0 0 15px}table .name-col{width:150px}.avatar-name-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.avatar-name-container .el-icon-top-right{font-size:2em;line-height:36px;color:#606266}.invalid{color:grey}.el-table--border:after,.el-table--group:after,.el-table:before{background-color:transparent}.image{width:20%}.image img{width:100%}.invalid-user-tag{font-size:14px;width:inherit;height:auto;text-align:center;word-wrap:break-word;white-space:normal}.left-header-container{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.no-statuses{margin-left:28px;color:#606266}.password-reset-token{margin:0 0 14px}.password-reset-token-dialog{width:50%}.poll ul{list-style-type:none;padding:0;width:30%}.reboot-button{padding:10px;margin-left:10px}.recent-statuses-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:67%}.recent-statuses-header{margin-top:10px}.reset-password-link{text-decoration:underline}.security-setting-button{margin-top:20px;width:100%}.statuses{padding:0 20px 0 0}.show-private{width:200px;text-align:left;line-height:67px;margin-right:20px}.show-private-statuses{margin-left:28px;margin-bottom:20px}.recent-statuses{margin-left:28px}.user-page-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:22px 15px 22px 20px;padding:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.user-page-header h1{display:inline}.user-profile-card{margin:0 20px;width:30%;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content}.user-profile-container{display:-webkit-box;display:-ms-flexbox;display:flex}.user-profile-table{margin:0;width:inherit}.user-profile-tag{margin:0 4px 4px 0}@media only screen and (max-width:480px){.avatar-name-container{margin-bottom:10px}.el-timeline-item__wrapper{padding-left:18px}.password-reset-token-dialog{width:85%}.recent-statuses{margin:20px 10px 15px}.recent-statuses-container{width:100%;margin:0}.show-private-statuses{margin:0 10px 20px}.status-container{margin:0 10px}.statuses{padding-right:10px;margin-left:8px}.user-page-header{padding:0;margin:7px 15px 15px 10px}.user-page-header-container .el-dropdown{width:95%;margin:0 15px 15px 10px}.user-profile-card{margin:0 10px;width:95%}.user-profile-card td{width:80px}.user-profile-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}@media only screen and (max-width:801px) and (min-width:481px){.recent-statuses{margin:20px 10px 15px 0}.recent-statuses-container{width:97%;margin:0 20px}.show-private-statuses{margin:0 10px 20px 0}.user-page-header{padding:0;margin:7px 15px 20px 20px}.user-profile-card{margin:0 20px;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.user-profile-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-6e81.0e80d020.css b/priv/static/adminfe/chunk-6e81.ca3b222f.css similarity index 100% rename from priv/static/adminfe/chunk-6e81.0e80d020.css rename to priv/static/adminfe/chunk-6e81.ca3b222f.css diff --git a/priv/static/adminfe/chunk-7506.f01f6c2a.css b/priv/static/adminfe/chunk-7506.f01f6c2a.css new file mode 100644 index 000000000..93d3eac84 --- /dev/null +++ b/priv/static/adminfe/chunk-7506.f01f6c2a.css @@ -0,0 +1 @@ +.moderate-user-button{text-align:left;width:350px;padding:10px}.moderate-user-button-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.moderate-user-button{width:100%}}.avatar-name-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.avatar-name-container .el-icon-top-right{font-size:2em;line-height:36px;color:#606266}.avatar-name-header{display:-webkit-box;display:-ms-flexbox;display:flex;height:40px;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.invalid{color:grey}.no-statuses{margin-left:28px;color:#606266}.password-reset-token{margin:0 0 14px}.password-reset-token-dialog{width:50%}.reboot-button{padding:10px;margin-left:6px}.recent-statuses-container-show{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.recent-statuses-container-show .el-timeline-item,.recent-statuses-container-show .recent-statuses{margin-left:20px}.recent-statuses-container-show .show-private-statuses{margin-left:20px;margin-bottom:20px}.reset-password-link{text-decoration:underline}.router-link{text-decoration:none}.status-container{margin:0 15px 0 20px}.statuses{padding:0 20px 0 0}.user-page-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:22px 15px 22px 20px;padding:0;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.user-page-header h1{display:inline;margin:0 0 0 10px}@media only screen and (min-width:1824px){.status-show-container{max-width:1824px;margin:auto}}@media only screen and (max-width:480px){.avatar-name-container{margin-bottom:10px}.el-timeline-item__wrapper{padding-left:18px}.left-header-container{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.password-reset-token-dialog{width:85%}.recent-statuses{margin:20px 10px 15px}.recent-statuses-container-show{width:100%;margin:0 0 0 10px}.recent-statuses-container-show .el-timeline-item,.recent-statuses-container-show .recent-statuses{margin-left:0}.recent-statuses-container-show .show-private-statuses{margin:0 10px 20px 0}.status-card .el-card__body{padding:15px}.status-container{margin:0 10px}.statuses{padding-right:10px;margin-left:0}.statuses .el-timeline-item__wrapper{margin-right:10px}.user-page-header{padding:0;margin:7px 15px 5px 10px}.status-page-header-container{width:100%}.status-page-header-container .el-dropdown{width:-webkit-fill-available;width:-moz-available;width:stretch;margin:0 10px 15px}}@media only screen and (max-width:801px) and (min-width:481px){.recent-statuses-container-show{width:97%;margin:0 20px}.recent-statuses-container-show .el-timeline-item{margin-left:2px}.recent-statuses-container-show .recent-statuses{margin:20px 10px 15px 0}.recent-statuses-container-show .show-private-statuses,.show-private-statuses{margin:0 10px 20px 0}.user-page-header{padding:0;margin:7px 15px 20px 20px}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-7637.941c4edb.css b/priv/static/adminfe/chunk-7637.941c4edb.css deleted file mode 100644 index be1d183a9..000000000 --- a/priv/static/adminfe/chunk-7637.941c4edb.css +++ /dev/null @@ -1 +0,0 @@ -.moderation-log-container[data-v-103bba83]{margin:0 15px}h1[data-v-103bba83]{margin:0}.el-timeline[data-v-103bba83]{margin:25px 45px 0 0;padding:0}.moderation-log-date-panel[data-v-103bba83]{width:350px}.moderation-log-header-container[data-v-103bba83]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:10px 0 15px}.moderation-log-header-container[data-v-103bba83],.moderation-log-nav-container[data-v-103bba83]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.moderation-log-search[data-v-103bba83]{width:350px}.moderation-log-user-select[data-v-103bba83]{margin:0 0 20px;width:350px}.reboot-button[data-v-103bba83]{padding:10px;margin:0;width:145px}.search-container[data-v-103bba83]{text-align:right}.pagination[data-v-103bba83]{text-align:center}@media only screen and (max-width:480px){h1[data-v-103bba83]{font-size:24px}.moderation-log-date-panel[data-v-103bba83]{width:100%}.moderation-log-user-select[data-v-103bba83]{margin:0 0 10px;width:55%}.moderation-log-search[data-v-103bba83]{width:40%}}@media only screen and (max-width:801px) and (min-width:481px){.moderation-log-date-panel[data-v-103bba83]{width:55%}.moderation-log-user-select[data-v-103bba83]{margin:0 0 10px;width:55%}.moderation-log-search[data-v-103bba83]{width:40%}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-0778.d9e7180a.css b/priv/static/adminfe/chunk-7c6b.d9e7180a.css similarity index 100% rename from priv/static/adminfe/chunk-0778.d9e7180a.css rename to priv/static/adminfe/chunk-7c6b.d9e7180a.css diff --git a/priv/static/adminfe/chunk-970d.f59cca8c.css b/priv/static/adminfe/chunk-970d.f59cca8c.css deleted file mode 100644 index 15511f12f..000000000 --- a/priv/static/adminfe/chunk-970d.f59cca8c.css +++ /dev/null @@ -1 +0,0 @@ -a{text-decoration:underline}.note-header{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;height:40px}.note-actor{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.note-actor-name{margin:0;height:22px}.note-avatar-img{width:15px;height:15px;margin-right:5px}.note-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.note-card{margin-bottom:15px}.note-content{font-size:15px}.note-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.el-card__header{padding:10px 17px}.note-header{height:80px}.note-actor-container{margin-bottom:5px}.note-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.status-card{margin-bottom:10px}.status-card .account{text-decoration:underline;line-height:26px;font-size:13px}.status-card .image{width:20%}.status-card .image img{width:100%}.status-card .show-more-button{margin-left:5px}.status-card .status-account{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.status-card .status-avatar-img{display:inline-block;width:15px;height:15px;margin-right:5px}.status-card .status-account-name{display:inline-block;margin:0;height:22px}.status-card .status-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.status-card .status-checkbox{margin-right:7px}.status-card .status-content{font-size:15px;line-height:26px}.status-card .status-deleted{font-style:italic;margin-top:3px}.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.status-card .status-without-content{font-style:italic}@media only screen and (max-width:480px){.el-message{min-width:80%}.el-message-box{width:80%}.status-card .el-card__header{padding:10px 17px}.status-card .el-tag{margin:3px 4px 3px 0}.status-card .status-account-container{margin-bottom:5px}.status-card .status-actions-button{margin:3px 0}.status-card .status-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.account{text-decoration:underline}.avatar-img{vertical-align:bottom;width:15px;height:15px;margin-left:5px}.divider{margin:15px 0}.deactivated{color:grey}.el-card__body{padding:17px}.el-card__header{background-color:#fafafa;padding:10px 20px}.el-collapse{border-bottom:none}.el-collapse-item__header{height:46px;font-size:14px}.el-collapse-item__content{padding-bottom:7px}.el-icon-arrow-right{margin-right:6px}.el-icon-close{padding:10px 5px 10px 10px;cursor:pointer}h4{margin:0;height:17px}.report .report-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;height:40px}.id{color:grey;margin-top:6px}.line{width:100%;height:0;border:.5px solid #ebeef5;margin:15px 0}.new-note p{font-size:14px;font-weight:500;height:17px;margin:13px 0 7px}.note{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.1);box-shadow:0 2px 5px 0 rgba(0,0,0,.1);margin-bottom:10px}.no-notes{font-style:italic;color:grey}.report-row-key{font-weight:500;font-size:14px}.report-title{margin:0}.report-note-form{margin:15px 0 0}.report-post-note{margin:5px 0 0;text-align:right}.reports-pagination{margin:25px 0;text-align:center}.reports-timeline{margin:30px 45px 45px 19px;padding:0}.statuses{margin-top:15px}.submit-button{display:block;margin:7px 0 17px auto}.timestamp{margin:0;font-style:italic;color:grey}@media only screen and (max-width:480px){.report .report-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;height:auto}.report .id{margin:6px 0 0}.report .report-actions-button,.report .report-tag{margin:3px 0 6px}.report .title-container{margin-bottom:7px}.reports-timeline{margin:20px 10px}.reports-timeline .el-timeline-item__wrapper{padding-left:20px}}.select-field[data-v-ecc36f5a]{width:350px}@media only screen and (max-width:480px){.select-field[data-v-ecc36f5a]{width:100%;margin-bottom:5px}}@media only screen and (max-width:801px) and (min-width:481px){.select-field[data-v-ecc36f5a]{width:50%}}.reports-container .reboot-button[data-v-fa601560]{padding:10px;margin:0;width:145px}.reports-container .reports-filter-container[data-v-fa601560]{margin:15px 45px 22px 15px;padding-bottom:0}.reports-container .reports-filter-container[data-v-fa601560],.reports-container .reports-header-container[data-v-fa601560]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.reports-container .reports-header-container[data-v-fa601560]{margin:10px 15px}.reports-container h1[data-v-fa601560]{margin:0}.reports-container .no-reports-message[data-v-fa601560]{color:grey;margin-left:19px}.reports-container .report-count[data-v-fa601560]{color:grey;font-size:28px}@media only screen and (max-width:480px){.reports-container h1[data-v-fa601560]{margin:7px 10px 15px}.reports-container .reboot-button[data-v-fa601560]{margin:0 0 5px 10px;width:145px}.reports-container .report-count[data-v-fa601560]{font-size:22px}.reports-container .reports-filter-container[data-v-fa601560]{margin:0 10px}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-c5f4.0827b1ce.css b/priv/static/adminfe/chunk-c5f4.0827b1ce.css new file mode 100644 index 000000000..eb59ca31a --- /dev/null +++ b/priv/static/adminfe/chunk-c5f4.0827b1ce.css @@ -0,0 +1 @@ +.copy-popover{width:330px}.copy-to-local-pack-button{margin-top:15px;float:right}.emoji-buttons{place-self:center;min-width:200px}.emoji-container-grid{display:grid;grid-template-columns:75px auto auto 200px;grid-column-gap:15px;margin-bottom:10px}.emoji-preview-img{max-width:100%;place-self:center}.emoji-info{place-self:center}.copy-pack-container{place-self:center stretch}.copy-pack-select{width:100%}.remote-emoji-container-grid{display:grid;grid-template-columns:75px auto auto 160px;grid-column-gap:15px;margin-bottom:10px}@media only screen and (max-width:480px){.emoji-container-flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border:1px solid #dcdfe6;-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-shadow:0 2px 12px 0 rgba(0,0,0,.1);border-radius:4px;padding:15px;margin:0 15px 15px 0}.emoji-info,.emoji-preview-img{margin-bottom:10px}.emoji-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;width:100%}.emoji-buttons button{padding:10px 5px;width:47%}}@media only screen and (max-width:801px) and (min-width:481px){.emoji-container-grid{grid-column-gap:10px}.emoji-buttons .el-button+.el-button{margin-left:5px}.remote-emoji-container-grid{grid-column-gap:10px}}.add-new-emoji{height:36px;font-size:14px;font-weight:700;color:#606266}.text{line-height:20px;margin-right:15px}.upload-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.upload-button{margin-left:10px}.upload-file-url{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.new-emoji-uploader-form label.el-form-item__label{padding:0}}.download-archive{width:250px}.download-pack-button-container{width:265px}.download-pack-button-container .el-link,.download-pack-button-container .el-link span,.download-pack-button-container .el-link span .download-archive{width:inherit}.download-shared-pack{display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:10px}.download-shared-pack-button{margin-left:10px}.el-collapse-item__content{padding-bottom:0}.el-collapse-item__header{height:36px;font-size:14px;font-weight:700;color:#606266}.emoji-pack-card{margin-top:5px}.emoji-pack-metadata .el-form-item{margin-bottom:10px}.has-background .el-collapse-item__header{background:#f6f6f6}.no-background .el-collapse-item__header{background:#fff}.pack-button-container{margin:0 0 18px 120px}.save-pack-button-container{margin-bottom:8px;width:265px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.delete-pack-button{width:45%}.download-pack-button-container{width:100%}.download-shared-pack{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.download-shared-pack-button{margin-left:0;margin-top:10px;padding:10px}.pack-button-container{width:100%;margin:0 0 22px}.remote-pack-metadata .el-form-item__content{line-height:24px;margin-top:4px}.save-pack-button{width:54%}.save-pack-button-container{margin-bottom:8px;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.save-pack-button-container button{padding:10px 5px}.save-pack-button-container .el-button+.el-button{margin-left:3px}}.emoji-header-container{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:0 15px 22px}.create-pack,.emoji-header-container,.emoji-packs-header-button-container{display:-webkit-box;display:-ms-flexbox;display:flex}.create-pack{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.create-pack-button{margin-left:10px}.emoji-packs-form{margin:0 30px}.emoji-packs-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:10px 15px 15px}.import-pack-button{margin-left:10px;width:30%;max-width:700px}h1{margin:0}.line{width:100%;height:0;border:1px solid #eee;margin-bottom:22px}.reboot-button{padding:10px;margin:0;width:145px}@media only screen and (min-width:1824px){.emoji-packs{max-width:1824px;margin:auto}}@media only screen and (max-width:480px){.create-pack{height:82px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.create-pack-button{margin-left:0}.divider{margin:15px 0}.el-message{min-width:80%}.el-message-box{width:80%}.emoji-header-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.emoji-packs-form{margin:0 7px}.emoji-packs-form label{padding-right:8px}.emoji-packs-form .el-form-item{margin-bottom:15px}.emoji-packs-header{margin:15px}.emoji-packs-header-button-container{height:82px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.emoji-packs-header-button-container .el-button+.el-button{margin:7px 0 0;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.import-pack-button{width:90%}.reload-emoji-button{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-commons.7f6d2d11.css b/priv/static/adminfe/chunk-commons.7f6d2d11.css new file mode 100644 index 000000000..42f5e0ee9 --- /dev/null +++ b/priv/static/adminfe/chunk-commons.7f6d2d11.css @@ -0,0 +1 @@ +.status-card{margin-bottom:10px;cursor:pointer}.status-card .account{line-height:26px;font-size:13px;color:#606266}.status-card .account:hover{text-decoration:underline}.status-card .deactivated{color:grey;line-height:28px;vertical-align:middle}.status-card .image{width:20%}.status-card .image img{width:100%}.status-card .router-link{text-decoration:none}.status-card .show-more-button{margin-left:5px}.status-card .status-account{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.status-card .status-avatar-img{display:inline-block;width:15px;height:15px;margin-right:5px}.status-card .status-account-name{display:inline-block;margin:0;font-size:15px;font-weight:500}.status-card .status-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.status-card .status-card-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.status-card .status-checkbox{margin-right:7px}.status-card .status-content{font-size:15px;line-height:26px}.status-card .status-created-at{font-size:13px;color:#606266}.status-card .status-deleted{font-style:italic;margin-top:3px}.status-card .status-footer,.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.status-card .status-tags{display:inline}.status-card .status-without-content{font-style:italic}@media only screen and (max-width:480px){.el-message{min-width:80%}.el-message-box{width:80%}.status-card .el-card__header{padding:10px 17px}.status-card .el-tag{margin:3px 0}.status-card .status-account-container{margin-bottom:5px}.status-card .status-actions-button{margin:3px 0}.status-card .status-actions{width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.status-card .status-footer{margin-top:10px}.status-card .status-footer,.status-card .status-header{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-d38a.cabdc22e.css b/priv/static/adminfe/chunk-d38a.cabdc22e.css deleted file mode 100644 index 4a2bf472b..000000000 --- a/priv/static/adminfe/chunk-d38a.cabdc22e.css +++ /dev/null @@ -1 +0,0 @@ -.select-field[data-v-4bc96860]{width:350px}@media only screen and (max-width:480px){.select-field[data-v-4bc96860]{width:100%;margin-bottom:5px}}.el-dialog__body{padding:20px}.create-account-form-item{margin-bottom:20px}.create-account-form-item-without-margin{margin-bottom:0}@media only screen and (max-width:480px){.create-user-dialog{width:85%}.create-account-form-item{margin-bottom:20px}.el-dialog__body{padding:20px}}.moderate-user-button{text-align:left;width:350px;padding:10px}.moderate-user-button-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media only screen and (max-width:480px){.moderate-user-button{width:100%}}.actions-button{text-align:left;width:350px;padding:10px}.actions-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0 15px 10px}.actions-container .el-dropdown{margin-left:10px}.active-tag{color:#409eff;font-weight:700}.active-tag .el-icon-check{color:#409eff;float:right;margin:7px 0 0 15px}.el-dropdown-link:hover{cursor:pointer;color:#409eff}.create-account>.el-icon-plus{margin-right:5px}.users-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.password-reset-token{margin:0 0 14px}.password-reset-token-dialog{width:50%}.reset-password-link{text-decoration:underline}.users-container h1{margin:10px 0 0 15px;height:40px}.users-container .pagination{margin:25px 0;text-align:center}.users-container .reboot-button{margin:0 15px 0 0;padding:10px;width:145px}.users-container .search{width:350px;float:right;margin-left:10px}.users-container .filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:15px}.users-container .user-count{color:grey;font-size:28px}@media only screen and (max-width:480px){.password-reset-token-dialog{width:85%}.users-container h1{margin:0}.users-container .actions-button{width:100%}.users-container .actions-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 10px 7px}.users-container .el-icon-arrow-down{font-size:12px}.users-container .search{width:100%;margin-left:0}.users-container .filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:82px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 10px}.users-container .el-tag{width:30px;display:inline-block;margin-bottom:4px;font-weight:700}.users-container .el-tag.el-tag--danger,.users-container .el-tag.el-tag--success{padding-left:8px}.users-container .reboot-button{margin:0}.users-container .users-header-container{margin:7px 10px 12px}.users-container .user-count{color:grey;font-size:22px}}@media only screen and (max-width:801px) and (min-width:481px){.actions-button,.search{width:49%}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-e404.a56021ae.css b/priv/static/adminfe/chunk-e404.a56021ae.css new file mode 100644 index 000000000..7d8596ef6 --- /dev/null +++ b/priv/static/adminfe/chunk-e404.a56021ae.css @@ -0,0 +1 @@ +a{text-decoration:underline}.note-header{-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline;height:40px}.note-actor{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.note-actor-name{margin:0;height:28px}.note-avatar-img{width:15px;height:15px;margin-right:5px}.note-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.note-card{margin-bottom:15px}.note-content,.note-header{font-size:15px}.note-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:28px;font-weight:500}@media only screen and (max-width:480px){.el-card__header{padding:10px 17px}.note-header{height:65px}.note-actor{margin-bottom:5px}.note-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}}h4{margin:0;height:17px}.account{line-height:26px;font-size:13px;color:#606266}.account:hover{text-decoration:underline}.avatar-img{vertical-align:bottom;width:15px;height:15px}.divider{margin:15px 0}.deactivated{color:grey}.el-card__body{padding:17px}.el-card__header{background-color:#fafafa;padding:10px 20px}.el-collapse{border-bottom:none}.el-collapse-item__header{height:46px;font-size:14px}.el-collapse-item__content{padding-bottom:7px}.el-icon-arrow-right{margin-right:6px}.el-icon-close{padding:10px 5px 10px 10px;cursor:pointer}.id{color:grey;margin-top:6px}.line{width:100%;height:0;border:.5px solid #ebeef5;margin:15px 0}.new-note p{font-size:14px;font-weight:500;height:17px;margin:13px 0 7px}.note{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,.1);box-shadow:0 2px 5px 0 rgba(0,0,0,.1);margin-bottom:10px}.no-notes{font-style:italic;color:grey}.report .report-header-container{height:40px}.report-account,.report .report-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.report-account{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2}.report-account-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.report-account-name{font-size:15px;font-weight:500}.report-row-key{font-size:14px;font-weight:500;padding-right:5px}.report-title{margin:0}.report-note-form{margin:15px 0 0}.report-post-note{margin:5px 0 0;text-align:right}.reports-pagination{margin:25px 0;text-align:center}.reports-timeline{margin:30px 45px 45px 19px;padding:0}.router-link{text-decoration:none}.reported-statuses{margin-top:15px}.submit-button{display:block;margin:7px 0 17px auto}.timestamp{margin:0;font-style:italic;color:grey}@media only screen and (max-width:480px){.report .report-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;height:auto}.report .id{margin:6px 0 0}.report .report-actions-button,.report .report-tag{margin:3px 0 6px}.report .title-container{margin-bottom:7px}.reports-timeline{margin:20px 10px}.reports-timeline .el-timeline-item__wrapper{padding-left:20px}}.select-field[data-v-ecc36f5a]{width:350px}@media only screen and (max-width:480px){.select-field[data-v-ecc36f5a]{width:100%;margin-bottom:5px}}@media only screen and (max-width:801px) and (min-width:481px){.select-field[data-v-ecc36f5a]{width:50%}}.reports-container .reboot-button[data-v-fa601560]{padding:10px;margin:0;width:145px}.reports-container .reports-filter-container[data-v-fa601560]{margin:15px 45px 22px 15px;padding-bottom:0}.reports-container .reports-filter-container[data-v-fa601560],.reports-container .reports-header-container[data-v-fa601560]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.reports-container .reports-header-container[data-v-fa601560]{margin:10px 15px}.reports-container h1[data-v-fa601560]{margin:0}.reports-container .no-reports-message[data-v-fa601560]{color:grey;margin-left:19px}.reports-container .report-count[data-v-fa601560]{color:grey;font-size:28px}@media only screen and (max-width:480px){.reports-container h1[data-v-fa601560]{margin:7px 10px 15px}.reports-container .reboot-button[data-v-fa601560]{margin:0 0 5px 10px;width:145px}.reports-container .report-count[data-v-fa601560]{font-size:22px}.reports-container .reports-filter-container[data-v-fa601560]{margin:0 10px}} \ No newline at end of file diff --git a/priv/static/adminfe/chunk-e458.f88bafea.css b/priv/static/adminfe/chunk-e458.f88bafea.css deleted file mode 100644 index 085bdf076..000000000 --- a/priv/static/adminfe/chunk-e458.f88bafea.css +++ /dev/null @@ -1 +0,0 @@ -.status-card{margin-bottom:10px}.status-card .account{text-decoration:underline;line-height:26px;font-size:13px}.status-card .image{width:20%}.status-card .image img{width:100%}.status-card .show-more-button{margin-left:5px}.status-card .status-account{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.status-card .status-avatar-img{display:inline-block;width:15px;height:15px;margin-right:5px}.status-card .status-account-name{display:inline-block;margin:0;height:22px}.status-card .status-body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.status-card .status-checkbox{margin-right:7px}.status-card .status-content{font-size:15px;line-height:26px}.status-card .status-deleted{font-style:italic;margin-top:3px}.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.status-card .status-without-content{font-style:italic}@media only screen and (max-width:480px){.el-message{min-width:80%}.el-message-box{width:80%}.status-card .el-card__header{padding:10px 17px}.status-card .el-tag{margin:3px 4px 3px 0}.status-card .status-account-container{margin-bottom:5px}.status-card .status-actions-button{margin:3px 0}.status-card .status-actions{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.status-card .status-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.statuses-container{padding:0 15px}.statuses-container h1{margin:10px 0 15px}.statuses-container .status-container{margin:0 0 10px}.checkbox-container{margin-bottom:15px}.filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:22px 0 15px}.reboot-button{padding:10px;margin:0;width:145px}.select-instance{width:396px}.statuses-header,.statuses-header-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.statuses-pagination{padding:15px 0;text-align:center}@media only screen and (max-width:480px){.checkbox-container{margin-bottom:10px}.filter-container{display:-webkit-box;display:-ms-flexbox;display:flex;height:36px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:10px 0}.select-field{width:100%;margin-bottom:5px}.select-instance{width:100%}.statuses-header-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.statuses-header-container .el-button{padding:10px 6.5px}.statuses-header-container .reboot-button{margin:10px 0 0}} \ No newline at end of file diff --git a/priv/static/adminfe/index.html b/priv/static/adminfe/index.html index a236dd0f7..c8f62d0c7 100644 --- a/priv/static/adminfe/index.html +++ b/priv/static/adminfe/index.html @@ -1 +1 @@ -Admin FE
\ No newline at end of file +Admin FE
\ No newline at end of file diff --git a/priv/static/adminfe/static/js/app.203f69f8.js b/priv/static/adminfe/static/js/app.203f69f8.js deleted file mode 100644 index d06fdf71d..000000000 --- a/priv/static/adminfe/static/js/app.203f69f8.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["app"],{"+aF5":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-pdf",use:"icon-pdf-usage",viewBox:"0 0 1024 1024",content:''});o.a.add(i);t.default=i},"0Fbn":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-people",use:"icon-people-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"1+ww":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});o.a.add(i);t.default=i},"18BR":function(e,t,n){"use strict";var a=n("CzPo");n.n(a).a},"28eg":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-exit-fullscreen",use:"icon-exit-fullscreen-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"3PhE":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"5TQQ":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-theme",use:"icon-theme-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"6xvN":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"94Jb":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});o.a.add(i);t.default=i},"9i3r":function(e,t,n){"use strict";n.d(t,"a",function(){return a});var a=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"localhost";return e.match(/https?:\/\//)?e:function(e){return e.startsWith("localhost:")||e.startsWith("127.0.0.1:")}(e)?"http://".concat(e):"https://".concat(e)}},CzPo:function(e,t,n){},EqXK:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-shopping",use:"icon-shopping-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},F3lI:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-bug",use:"icon-bug-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"F9+T":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-international",use:"icon-international-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},FDDl:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-qq",use:"icon-qq-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},GPBF:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},HIWW:function(e,t,n){"use strict";var a=n("MoCq");n.n(a).a},Hnev:function(e,t,n){"use strict";var a=n("UqWv");n.n(a).a},ICep:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-guide 2",use:"icon-guide 2-usage",viewBox:"0 0 1000 1000",content:''});o.a.add(i);t.default=i},JYDz:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-language",use:"icon-language-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},Kcm3:function(e,t,n){},Kj24:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},LxGF:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-peoples",use:"icon-peoples-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},MEYL:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-money",use:"icon-money-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},MMMJ:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},MoCq:function(e,t,n){},MokB:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-list",use:"icon-list-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},P8iQ:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-settings",use:"icon-settings-usage",viewBox:"0 0 490.2 490.2",content:'\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n'});o.a.add(i);t.default=i},"R/8a":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-message",use:"icon-message-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"R/Hx":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},SZWj:function(e,t,n){"use strict";var a=n("Xm3t");n.n(a).a},TfVu:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});o.a.add(i);t.default=i},Tfa4:function(e,t,n){},"Uf/o":function(e,t,n){var a={"./404.svg":"oUrx","./bug.svg":"F3lI","./chart.svg":"yCkv","./clipboard.svg":"vDVG","./component.svg":"VtY+","./dashboard.svg":"94Jb","./documentation.svg":"kPu2","./drag.svg":"m7++","./edit.svg":"qkZ8","./email.svg":"y7eQ","./example.svg":"MMMJ","./excel.svg":"ZZmv","./exit-fullscreen.svg":"28eg","./eye-open.svg":"1+ww","./eye.svg":"TfVu","./form.svg":"6xvN","./fullscreen.svg":"mSHS","./guide 2.svg":"ICep","./guide.svg":"ZoO1","./icon.svg":"nZHn","./international.svg":"F9+T","./language.svg":"JYDz","./link.svg":"GPBF","./list.svg":"MokB","./lock.svg":"qwAt","./message.svg":"R/8a","./money.svg":"MEYL","./nested.svg":"3PhE","./password.svg":"Kj24","./pdf.svg":"+aF5","./people.svg":"0Fbn","./peoples.svg":"LxGF","./qq.svg":"FDDl","./search.svg":"jo2x","./settings.svg":"P8iQ","./shopping.svg":"EqXK","./size.svg":"hkRB","./star.svg":"cIpu","./tab.svg":"j7e1","./table.svg":"R/Hx","./theme.svg":"5TQQ","./tree.svg":"k80C","./user.svg":"s7Vf","./wechat.svg":"gNoN","./zip.svg":"iqZD"};function r(e){var t=s(e);return n(t)}function s(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=s,e.exports=r,r.id="Uf/o"},UqWv:function(e,t,n){},"VtY+":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-component",use:"icon-component-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},Vtdi:function(e,t,n){"use strict";n.r(t);var a={};n.r(a),n.d(a,"parseTime",function(){return me}),n.d(a,"formatTime",function(){return fe}),n.d(a,"timeAgo",function(){return ta}),n.d(a,"numberFormatter",function(){return na}),n.d(a,"toThousandFilter",function(){return aa});var r=n("Kw5r"),s=n("p46w"),o=n.n(s),i=(n("9d8Q"),n("XJYT")),c=n.n(i),u=(n("D66Q"),n("sg+I"),{name:"App"}),l=n("KHd+"),p=Object(l.a)(u,function(){var e=this.$createElement,t=this._self._c||e;return t("div",{attrs:{id:"app"}},[t("router-view")],1)},[],!1,null,null,null);p.options.__file="App.vue";var d=p.exports,h=n("L2JU"),m=n("o0o1"),f=n.n(m),v=n("yXPU"),g=n.n(v),w=n("t3Un"),b=n("X4fA"),y=n("9i3r");function x(e,t){return T.apply(this,arguments)}function T(){return(T=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/need_reboot",method:"get",headers:S(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function k(e,t){return E.apply(this,arguments)}function E(){return(E=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/restart",method:"get",headers:S(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var S=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},_={state:{sidebar:{opened:!o.a.get("sidebarStatus")||!!+o.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop",language:o.a.get("language")||"en",needReboot:!1,size:o.a.get("size")||"medium",invitesEnabled:!1},mutations:{TOGGLE_SIDEBAR:function(e){e.sidebar.opened=!e.sidebar.opened,e.sidebar.withoutAnimation=!1,e.sidebar.opened?o.a.set("sidebarStatus",1):o.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(e,t){o.a.set("sidebarStatus",0),e.sidebar.opened=!1,e.sidebar.withoutAnimation=t},TOGGLE_DEVICE:function(e,t){e.device=t},SET_INVITES_ENABLED:function(e,t){e.invitesEnabled=t},SET_LANGUAGE:function(e,t){e.language=t,o.a.set("language",t)},TOGGLE_REBOOT:function(e,t){e.needReboot=t},SET_SIZE:function(e,t){e.size=t,o.a.set("size",t)}},actions:{closeSideBar:function(e,t){(0,e.commit)("CLOSE_SIDEBAR",t.withoutAnimation)},NeedReboot:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,x(a.authHost,a.token);case 3:r=e.sent,n("TOGGLE_REBOOT",r.data.need_reboot);case 5:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),RestartApplication:function(){var e=g()(f.a.mark(function e(t){var n,a;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,k(a.authHost,a.token);case 3:n("TOGGLE_REBOOT",!1);case 4:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),SetInvitesEnabled:function(e,t){(0,e.commit)("SET_INVITES_ENABLED",t)},setLanguage:function(e,t){(0,e.commit)("SET_LANGUAGE",t)},setSize:function(e,t){(0,e.commit)("SET_SIZE",t)},toggleDevice:function(e,t){(0,e.commit)("TOGGLE_DEVICE",t)},toggleSideBar:function(e){(0,e.commit)("TOGGLE_SIDEBAR")}}},O={state:{logs:[]},mutations:{ADD_ERROR_LOG:function(e,t){e.logs.push(t)}},actions:{addErrorLog:function(e,t){(0,e.commit)("ADD_ERROR_LOG",t)}}},L=n("MVZn"),A=n.n(L),I=n("LvDl"),C=n.n(I);function R(e,t,n){return D.apply(this,arguments)}function D(){return(D=g()(f.a.mark(function e(t,n,a){var r,s,o=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>3&&void 0!==o[3]?o[3]:1,s=new URLSearchParams(C.a.omitBy(A()({},a,{page:r}),C.a.isUndefined)).toString(),e.next=4,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/moderation_log?".concat(s),method:"get",headers:M(n)});case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}},e)}))).apply(this,arguments)}function V(e,t){return z.apply(this,arguments)}function z(){return(z=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/users?filters=is_admin",method:"get",headers:M(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function P(e,t){return j.apply(this,arguments)}function j(){return(j=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/users?filters=is_moderator",method:"get",headers:M(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var M=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},B={state:{fetchedLog:[],logItemsCount:0,admins:[],moderators:[],logLoading:!0,adminsLoading:!0},mutations:{SET_LOG_LOADING:function(e,t){e.logLoading=t},SET_ADMINS_LOADING:function(e,t){e.adminsLoading=t},SET_MODERATION_LOG:function(e,t){e.fetchedLog=t},SET_MODERATION_LOG_COUNT:function(e,t){e.logItemsCount=t},SET_ADMINS:function(e,t){e.admins=t},SET_MODERATORS:function(e,t){e.moderators=t}},actions:{FetchModerationLog:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,r=o.length>1&&void 0!==o[1]?o[1]:{},e.next=4,R(a.authHost,a.token,r);case 4:s=e.sent,n("SET_MODERATION_LOG",s.data.items),n("SET_MODERATION_LOG_COUNT",s.data.total),n("SET_LOG_LOADING",!1);case 8:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),FetchAdmins:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,V(a.authHost,a.token);case 3:return r=e.sent,e.next=6,P(a.authHost,a.token);case 6:s=e.sent,n("SET_ADMINS",r.data),n("SET_MODERATORS",s.data),n("SET_ADMINS_LOADING",!1);case 10:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()}};function H(e,t,n,a){return U.apply(this,arguments)}function U(){return(U=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/invite_token",method:"post",headers:K(r),data:n&&n.length>0?{max_use:t,expires_at:n}:{max_use:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function F(e,t,n,a){return N.apply(this,arguments)}function N(){return(N=g()(f.a.mark(function e(t,n,a,r){var s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s=n.length>0?{email:t,name:n}:{email:t},e.next=3,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/email_invite",method:"post",headers:K(r),data:s});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function G(e,t){return Y.apply(this,arguments)}function Y(){return(Y=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/users/invites",method:"get",headers:K(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function $(e,t,n){return q.apply(this,arguments)}function q(){return(q=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/revoke_invite",method:"post",headers:K(a),data:{token:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var K=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},W=n("mSNy"),Z={state:{inviteTokens:[],loading:!1,newToken:{}},mutations:{SET_LOADING:function(e,t){e.loading=t},SET_NEW_TOKEN:function(e,t){e.newToken=t},SET_TOKENS:function(e,t){e.inviteTokens=t}},actions:{FetchInviteTokens:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,n("SET_LOADING",!0),e.next=4,G(a.authHost,a.token);case 4:r=e.sent,n("SET_TOKENS",r.data.invites.reverse()),n("SET_LOADING",!1);case 7:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),GenerateInviteToken:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=n.maxUse,i=n.expiresAt,e.prev=2,e.next=5,H(o,i,s.authHost,s.token);case 5:c=e.sent,u=c.data,a("SET_NEW_TOKEN",{token:u.token,maxUse:u.max_use,expiresAt:u.expires_at}),e.next=13;break;case 10:return e.prev=10,e.t0=e.catch(2),e.abrupt("return");case 13:r("FetchInviteTokens");case 14:case"end":return e.stop()}},e,null,[[2,10]])}));return function(t,n){return e.apply(this,arguments)}}(),InviteUserViaEmail:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t.commit,t.dispatch,a=t.getters,r=n.email,s=n.name,e.prev=2,e.next=5,F(r,s,a.authHost,a.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:Object(i.Message)({message:W.a.t("invites.emailSent"),type:"success",duration:5e3});case 11:case"end":return e.stop()}},e,null,[[2,7]])}));return function(t,n){return e.apply(this,arguments)}}(),RemoveNewToken:function(e){(0,e.commit)("SET_NEW_TOKEN",{})},RevokeToken:function(){var e=g()(f.a.mark(function e(t,n){var a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t.commit,a=t.dispatch,r=t.getters,e.prev=1,e.next=4,$(n,r.authHost,r.token);case 4:e.next=9;break;case 6:return e.prev=6,e.t0=e.catch(1),e.abrupt("return");case 9:a("FetchInviteTokens");case 10:case"end":return e.stop()}},e,null,[[1,6]])}));return function(t,n){return e.apply(this,arguments)}}()}},J=n("RIqP"),Q=n.n(J);function X(e,t){return ee.apply(this,arguments)}function ee(){return(ee=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/v1/instance/peers",method:"get",headers:te(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var te=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},ne={state:{fetchedPeers:[],loading:!0},mutations:{SET_PEERS:function(e,t){e.fetchedPeers=t},SET_LOADING:function(e,t){e.loading=t}},actions:{FetchPeers:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,X(a.authHost,a.token);case 3:r=e.sent,n("SET_PEERS",Q()(r.data).sort()),n("SET_LOADING",!1);case 6:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()}},ae=n("jE9Z"),re={name:"Hamburger",props:{isActive:{type:Boolean,default:!1},toggleClick:{type:Function,default:null}}},se=(n("18BR"),Object(l.a)(re,function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticStyle:{padding:"0 15px"},on:{click:this.toggleClick}},[t("svg",{staticClass:"hamburger",class:{"is-active":this.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[t("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},[],!1,null,"69c6c5c4",null));se.options.__file="index.vue";var oe={components:{Hamburger:se.exports},computed:A()({},Object(h.b)(["sidebar","name","avatar","device"])),methods:{toggleSideBar:function(){this.$store.dispatch("toggleSideBar")},logout:function(){this.$store.dispatch("LogOut").then(function(){location.reload()})}}},ie=(n("fhHp"),Object(l.a)(oe,function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"navbar"},[n("hamburger",{staticClass:"hamburger-container",attrs:{"toggle-click":e.toggleSideBar,"is-active":e.sidebar.opened}}),e._v(" "),n("div",{staticClass:"right-menu"},[n("el-dropdown",{staticClass:"avatar-container right-menu-item hover-effect",attrs:{trigger:"click"}},[n("div",{staticClass:"avatar-wrapper"},[n("img",{staticClass:"user-avatar",attrs:{src:e.avatar+"?imageView2/1/w/80/h/80"}})]),e._v(" "),n("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[n("el-dropdown-item",[n("span",{staticStyle:{display:"block"},on:{click:e.logout}},[e._v(e._s(e.$t("navbar.logOut")))])])],1)],1)],1)],1)},[],!1,null,"28de7ff2",null));ie.options.__file="Navbar.vue";var ce=ie.exports,ue=n("33yf"),le=n.n(ue);function pe(e){return this.$te("route."+e)?this.$t("route."+e):e}var de=n("cDf5"),he=n.n(de);function me(e,t){if(0===arguments.length)return null;var n,a=t||"{y}-{m}-{d} {h}:{i}:{s}";"object"===he()(e)?n=e:("string"==typeof e&&/^[0-9]+$/.test(e)&&(e=parseInt(e)),"number"==typeof e&&10===e.toString().length&&(e*=1e3),n=new Date(e));var r={y:n.getFullYear(),m:n.getMonth()+1,d:n.getDate(),h:n.getHours(),i:n.getMinutes(),s:n.getSeconds(),a:n.getDay()};return a.replace(/{(y|m|d|h|i|s|a)+}/g,function(e,t){var n=r[t];return"a"===t?["日","一","二","三","四","五","六"][n]:(e.length>0&&n<10&&(n="0"+n),n||0)})}function fe(e,t){e=1e3*+e;var n=new Date(e),a=(Date.now()-n)/1e3;return a<30?"刚刚":a<3600?Math.ceil(a/60)+"分钟前":a<86400?Math.ceil(a/3600)+"小时前":a<172800?"1天前":t?me(e,t):n.getMonth()+1+"月"+n.getDate()+"日"+n.getHours()+"时"+n.getMinutes()+"分"}function ve(e){return/^(https?:|mailto:|tel:)/.test(e)}var ge={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(e,t){var n=t.props,a=n.icon,r=n.title,s=[];return a&&s.push(e("svg-icon",{attrs:{"icon-class":a}})),r&&s.push(e("span",{slot:"title"},[r])),s}},we=Object(l.a)(ge,void 0,void 0,!1,null,null,null);we.options.__file="Item.vue";var be=we.exports,ye={props:{to:{type:String,required:!0}},methods:{linkProps:function(e){return ve(e)?{is:"a",href:e,target:"_blank",rel:"noopener"}:{is:"router-link",to:e}}}},xe=Object(l.a)(ye,function(){var e=this.$createElement;return(this._self._c||e)("component",this._b({},"component",this.linkProps(this.to),!1),[this._t("default")],2)},[],!1,null,null,null);xe.options.__file="Link.vue";var Te={name:"SidebarItem",components:{Item:be,AppLink:xe.exports},mixins:[{computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var e=this,t=this.$refs.subMenu;if(t){var n=t.handleMouseleave;t.handleMouseleave=function(t){"mobile"!==e.device&&n(t)}}}}}],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return{onlyOneChild:null}},computed:{invitesEnabled:function(){return"/invites"!==this.basePath||this.$store.state.app.invitesEnabled}},methods:{hasOneShowingChild:function(e,t){var n=this,a=e.filter(function(e){return!e.hidden&&(n.onlyOneChild=e,!0)});return 1===a.length||0===a.length&&(this.onlyOneChild=A()({},t,{path:"",noShowingChildren:!0}),!0)},resolvePath:function(e){return this.isExternalLink(e)?e:le.a.resolve(this.basePath,e)},isExternalLink:function(e){return ve(e)},generateTitle:pe}},ke=Object(l.a)(Te,function(){var e=this,t=e.$createElement,n=e._self._c||t;return!e.item.hidden&&e.item.children&&e.invitesEnabled?n("div",{staticClass:"menu-wrapper"},[!e.hasOneShowingChild(e.item.children,e.item)||e.onlyOneChild.children&&!e.onlyOneChild.noShowingChildren||e.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:e.resolvePath(e.item.path)}},[n("template",{slot:"title"},[e.item.meta?n("item",{attrs:{icon:e.item.meta.icon,title:e.generateTitle(e.item.meta.title)}}):e._e()],1),e._v(" "),e._l(e.item.children,function(t){return[t.hidden?e._e():[t.children&&t.children.length>0?n("sidebar-item",{key:t.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:t,"base-path":e.resolvePath(t.path)}}):n("app-link",{key:t.name,attrs:{to:e.resolvePath(t.path)}},[n("el-menu-item",{attrs:{index:e.resolvePath(t.path)}},[t.meta?n("item",{attrs:{icon:t.meta.icon,title:e.generateTitle(t.meta.title)}}):e._e()],1)],1)]]})],2):[n("app-link",{attrs:{to:e.resolvePath(e.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!e.isNest},attrs:{index:e.resolvePath(e.onlyOneChild.path)}},[e.onlyOneChild.meta?n("item",{attrs:{icon:e.onlyOneChild.meta.icon||e.item.meta.icon,title:e.generateTitle(e.onlyOneChild.meta.title)}}):e._e()],1)],1)]],2):e._e()},[],!1,null,null,null);ke.options.__file="SidebarItem.vue";var Ee=ke.exports,Se=n("zx4i"),_e=n.n(Se),Oe={components:{SidebarItem:Ee},computed:A()({},Object(h.b)(["permission_routers","sidebar"]),{variables:function(){return _e.a},isCollapse:function(){return!this.sidebar.opened}})},Le=Object(l.a)(Oe,function(){var e=this.$createElement,t=this._self._c||e;return t("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[t("el-menu",{attrs:{"default-active":this.$route.path,collapse:this.isCollapse,"background-color":this.variables.menuBg,"text-color":this.variables.menuText,"active-text-color":this.variables.menuActiveText,mode:"vertical"}},this._l(this.permission_routers,function(e){return t("sidebar-item",{key:e.path,attrs:{item:e,"base-path":e.path}})}),1)],1)},[],!1,null,null,null);Le.options.__file="index.vue";var Ae=Le.exports,Ie={name:"ScrollPane",data:function(){return{left:0}},methods:{handleScroll:function(e){var t=e.wheelDelta||40*-e.deltaY,n=this.$refs.scrollContainer.$refs.wrap;n.scrollLeft=n.scrollLeft+t/4},moveToTarget:function(e){var t=this.$refs.scrollContainer.$el.offsetWidth,n=this.$refs.scrollContainer.$refs.wrap,a=this.$parent.$refs.tag,r=null,s=null;if(a.length>0&&(r=a[0],s=a[a.length-1]),r===e)n.scrollLeft=0;else if(s===e)n.scrollLeft=n.scrollWidth-t;else{var o=a.findIndex(function(t){return t===e}),i=a[o-1],c=a[o+1],u=c.$el.offsetLeft+c.$el.offsetWidth+4,l=i.$el.offsetLeft-4;u>n.scrollLeft+t?n.scrollLeft=u-t:l1&&void 0!==arguments[1]?arguments[1]:"/",a=[];return e.forEach(function(e){if(e.meta&&e.meta.affix&&a.push({path:le.a.resolve(n,e.path),name:e.name,meta:A()({},e.meta)}),e.children){var r=t.filterAffixTags(e.children,e.path);r.length>=1&&(a=[].concat(Q()(a),Q()(r)))}}),a},initTags:function(){var e=this.affixTags=this.filterAffixTags(this.routers),t=!0,n=!1,a=void 0;try{for(var r,s=e[Symbol.iterator]();!(t=(r=s.next()).done);t=!0){var o=r.value;o.name&&this.$store.dispatch("addVisitedView",o)}}catch(e){n=!0,a=e}finally{try{t||null==s.return||s.return()}finally{if(n)throw a}}},addTags:function(){return this.$route.name&&this.$store.dispatch("addView",this.$route),!1},moveToCurrentTag:function(){var e=this,t=this.$refs.tag;this.$nextTick(function(){var n=!0,a=!1,r=void 0;try{for(var s,o=t[Symbol.iterator]();!(n=(s=o.next()).done);n=!0){var i=s.value;if(i.to.path===e.$route.path){e.$refs.scrollPane.moveToTarget(i),i.to.fullPath!==e.$route.fullPath&&e.$store.dispatch("updateVisitedView",e.$route);break}}}catch(e){a=!0,r=e}finally{try{n||null==o.return||o.return()}finally{if(a)throw r}}})},refreshSelectedTag:function(e){var t=this;this.$store.dispatch("delCachedView",e).then(function(){var n=e.fullPath;t.$nextTick(function(){t.$router.replace({path:"/redirect"+n})})})},closeSelectedTag:function(e){var t=this;this.$store.dispatch("delView",e).then(function(n){var a=n.visitedViews;t.isActive(e)&&t.toLastView(a)})},closeOthersTags:function(){var e=this;this.$router.push(this.selectedTag),this.$store.dispatch("delOthersViews",this.selectedTag).then(function(){e.moveToCurrentTag()})},closeAllTags:function(e){var t=this;this.$store.dispatch("delAllViews").then(function(n){var a=n.visitedViews;t.affixTags.some(function(t){return t.path===e.path})||t.toLastView(a)})},toLastView:function(e){var t=e.slice(-1)[0];t?this.$router.push(t):this.$router.push("/")},openMenu:function(e,t){var n=this.$el.getBoundingClientRect().left,a=this.$el.offsetWidth-105,r=t.clientX-n+15;this.left=r>a?a:r,this.top=t.clientY,this.visible=!0,this.selectedTag=e},closeMenu:function(){this.visible=!1}}},De=(n("Hnev"),n("Yymj"),Object(l.a)(Re,function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"tags-view-container"},[n("scroll-pane",{ref:"scrollPane",staticClass:"tags-view-wrapper"},e._l(e.visitedViews,function(t){return n("router-link",{key:t.path,ref:"tag",refInFor:!0,staticClass:"tags-view-item",class:e.isActive(t)?"active":"",attrs:{to:{path:t.path,query:t.query,fullPath:t.fullPath},tag:"span"},nativeOn:{mouseup:function(n){return"button"in n&&1!==n.button?null:e.closeSelectedTag(t)},contextmenu:function(n){return n.preventDefault(),e.openMenu(t,n)}}},[e._v("\n "+e._s(e.generateTitle(t.title))+"\n "),t.meta.affix?e._e():n("span",{staticClass:"el-icon-close",on:{click:function(n){return n.preventDefault(),n.stopPropagation(),e.closeSelectedTag(t)}}})])}),1),e._v(" "),n("ul",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],staticClass:"contextmenu",style:{left:e.left+"px",top:e.top+"px"}},[n("li",{on:{click:function(t){return e.refreshSelectedTag(e.selectedTag)}}},[e._v(e._s(e.$t("tagsView.refresh")))]),e._v(" "),e.selectedTag.meta&&e.selectedTag.meta.affix?e._e():n("li",{on:{click:function(t){return e.closeSelectedTag(e.selectedTag)}}},[e._v(e._s(e.$t("tagsView.close")))]),e._v(" "),n("li",{on:{click:e.closeOthersTags}},[e._v(e._s(e.$t("tagsView.closeOthers")))]),e._v(" "),n("li",{on:{click:function(t){return e.closeAllTags(e.selectedTag)}}},[e._v(e._s(e.$t("tagsView.closeAll")))])])],1)},[],!1,null,"e1cdb714",null));De.options.__file="TagsView.vue";var Ve=De.exports,ze={name:"AppMain",computed:{cachedViews:function(){return this.$store.state.tagsView.cachedViews},key:function(){return this.$route.fullPath}}},Pe=(n("Z+gY"),Object(l.a)(ze,function(){var e=this.$createElement,t=this._self._c||e;return t("section",{staticClass:"app-main"},[t("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[t("keep-alive",{attrs:{include:this.cachedViews}},[t("router-view",{key:this.key})],1)],1)],1)},[],!1,null,"f852c4f2",null));Pe.options.__file="AppMain.vue";var je=Pe.exports,Me=document.body,Be={name:"Layout",components:{Navbar:ce,Sidebar:Ae,AppMain:je,TagsView:Ve},mixins:[{watch:{$route:function(e){"mobile"===this.device&&this.sidebar.opened&&Wn.dispatch("closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.resizeHandler)},mounted:function(){var e=this.isMobile(),t=this.isTablet();(e||t)&&(Wn.dispatch("toggleDevice",e?"mobile":"tablet"),Wn.dispatch("closeSideBar",{withoutAnimation:!0}))},methods:{isMobile:function(){return Me.getBoundingClientRect().width-3<480},isTablet:function(){var e=Me.getBoundingClientRect();return e.width-3<801&&e.width-3>480},resizeHandler:function(){if(!document.hidden){var e=this.isMobile(),t=this.isTablet();e||t?(Wn.dispatch("toggleDevice",e?"mobile":"tablet"),Wn.dispatch("closeSideBar",{withoutAnimation:!0})):Wn.dispatch("toggleDevice","desktop")}}}}],computed:{sidebar:function(){return this.$store.state.app.sidebar},device:function(){return this.$store.state.app.device},classObj:function(){return{hideSidebar:!this.sidebar.opened,openSidebar:this.sidebar.opened,withoutAnimation:this.sidebar.withoutAnimation,mobile:"mobile"===this.device}}},methods:{handleClickOutside:function(){this.$store.dispatch("closeSideBar",{withoutAnimation:!1})}}},He=(n("SZWj"),Object(l.a)(Be,function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-wrapper",class:e.classObj},["mobile"===e.device&&e.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:e.handleClickOutside}}):e._e(),e._v(" "),n("sidebar",{staticClass:"sidebar-container"}),e._v(" "),n("div",{staticClass:"main-container"},[n("navbar"),e._v(" "),n("app-main")],1)],1)},[],!1,null,"767d264f",null));He.options.__file="Layout.vue";var Ue=He.exports;r.default.use(ae.a);var Fe=["emoji-packs"]||!1,Ne=Fe.includes("settings"),Ge={path:"/settings",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-7f9e"),n.e("chunk-4011")]).then(n.bind(null,"YcIK"))},name:"Settings",meta:{title:"Settings",icon:"settings",noCache:!0}}]},Ye=Fe.includes("statuses"),$e={path:"/statuses",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-df62"),n.e("chunk-6b68"),n.e("chunk-e458")]).then(n.bind(null,"FtQ1"))},name:"Statuses",meta:{title:"Statuses",icon:"form",noCache:!0}}]},qe=Fe.includes("reports"),Ke={path:"/reports",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-df62"),n.e("ZhIB"),n.e("chunk-970d")]).then(n.bind(null,"cEOe"))},name:"Reports",meta:{title:"Reports",icon:"documentation",noCache:!0}}]},We=Fe.includes("invites"),Ze={path:"/invites",component:Ue,children:[{path:"index",component:function(){return n.e("chunk-0778").then(n.bind(null,"HMof"))},name:"Invites",meta:{title:"Invites",icon:"guide",noCache:!0}}]},Je=Fe.includes("emoji-packs"),Qe={path:"/emoji_packs",component:Ue,children:[{path:"index",component:function(){return n.e("chunk-3384").then(n.bind(null,"26YS"))},name:"Emoji Packs",meta:{title:"Emoji Packs",icon:"eye-open",noCache:!0}}]},Xe=Fe.includes("moderation-log"),et={path:"/moderation_log",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-df62"),n.e("chunk-7637")]).then(n.bind(null,"CmY0"))},name:"Moderation Log",meta:{title:"moderationLog",icon:"list",noCache:!0}}]},tt=[{path:"/redirect",component:Ue,hidden:!0,children:[{path:"/redirect/:path*",component:function(){return n.e("7zzA").then(n.bind(null,"7zzA"))}}]},{path:"/login-pleroma",component:function(){return Promise.all([n.e("oAJy"),n.e("chunk-16d0")]).then(n.bind(null,"iRgq"))},hidden:!0},{path:"/login",component:function(){return Promise.all([n.e("oAJy"),n.e("chunk-0961")]).then(n.bind(null,"ntYl"))},hidden:!0},{path:"/auth-redirect",component:function(){return n.e("JEtC").then(n.bind(null,"JEtC"))},hidden:!0},{path:"/404",component:function(){return n.e("chunk-0558").then(n.bind(null,"/eX4"))},hidden:!0},{path:"/401",component:function(){return n.e("chunk-6e81").then(n.bind(null,"UUO+"))},hidden:!0},{path:"",component:Ue,redirect:"/users/index"}],nt=new ae.a({scrollBehavior:function(){return{y:0}},routes:tt}),at=[{path:"/users",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("ZhIB"),n.e("chunk-6b68"),n.e("chunk-d38a")]).then(n.bind(null,"RGjw"))},name:"Users",meta:{title:"users",icon:"peoples",noCache:!0}}]}].concat(Q()(Ye?[]:[$e]),Q()(qe?[]:[Ke]),Q()(We?[]:[Ze]),Q()(Je?[]:[Qe]),Q()(Xe?[]:[et]),Q()(Ne?[]:[Ge]),[{path:"/users/:id",component:Ue,children:[{path:"",name:"UsersShow",component:function(){return Promise.all([n.e("chunk-df62"),n.e("chunk-22d2")]).then(n.bind(null,"4bFr"))}}],hidden:!0},{path:"*",redirect:"/404",hidden:!0}]);var rt={state:{routers:[],addRouters:[]},mutations:{SET_ROUTERS:function(e,t){e.addRouters=t,e.routers=tt.concat(t)}},actions:{GenerateRoutes:function(e,t){var n=e.commit;return new Promise(function(e){var a,r=t.roles;a=r.includes("admin")?at:function e(t,n){var a=[];return t.forEach(function(t){var r=A()({},t);(function(e,t){return!t.meta||!t.meta.roles||e.some(function(e){return t.meta.roles.includes(e)})})(n,r)&&(r.children&&(r.children=e(r.children,n)),a.push(r))}),a}(at,r),n("SET_ROUTERS",a),e()})}}};function st(e,t){return ot.apply(this,arguments)}function ot(){return(ot=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/relay",method:"get",headers:pt(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function it(e,t,n){return ct.apply(this,arguments)}function ct(){return(ct=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/relay",method:"post",headers:pt(a),data:{relay_url:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function ut(e,t,n){return lt.apply(this,arguments)}function lt(){return(lt=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/relay",method:"delete",headers:pt(a),data:{relay_url:"https://".concat(t,"/actor")}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var pt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},dt={state:{fetchedRelays:[],loading:!0},mutations:{SET_LOADING:function(e,t){e.loading=t},SET_RELAYS:function(e,t){e.fetchedRelays=t},ADD_RELAY:function(e,t){e.fetchedRelays=[].concat(Q()(e.fetchedRelays),[t])},DELETE_RELAY:function(e,t){e.fetchedRelays=e.fetchedRelays.filter(function(e){return e!==t})}},actions:{FetchRelays:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,n("SET_LOADING",!0),e.next=4,st(a.authHost,a.token);case 4:r=e.sent,n("SET_RELAYS",r.data.relays),n("SET_LOADING",!1);case 7:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),AddRelay:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,a("ADD_RELAY",n),e.prev=2,e.next=5,it(n,s.authHost,s.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:return e.prev=10,r("FetchRelays"),e.finish(10);case 13:case"end":return e.stop()}},e,null,[[2,7,10,13]])}));return function(t,n){return e.apply(this,arguments)}}(),DeleteRelay:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,a("DELETE_RELAY",n),e.prev=2,e.next=5,ut(n,s.authHost,s.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:return e.prev=10,r("FetchRelays"),e.finish(10);case 13:case"end":return e.stop()}},e,null,[[2,7,10,13]])}));return function(t,n){return e.apply(this,arguments)}}()}};function ht(e,t,n){return mt.apply(this,arguments)}function mt(){return(mt=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/reports",method:"patch",headers:bt(a),data:{reports:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function ft(e,t,n,a,r){return vt.apply(this,arguments)}function vt(){return(vt=g()(f.a.mark(function e(t,n,a,r,s){var o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return o=t.length>0?"/api/pleroma/admin/reports?state=".concat(t,"&page=").concat(n,"&page_size=").concat(a):"/api/pleroma/admin/reports?page=".concat(n,"&page_size=").concat(a),e.next=3,Object(w.a)({baseURL:Object(y.a)(r),url:o,method:"get",headers:bt(s)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function gt(){return(gt=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/reports/".concat(n,"/notes"),method:"post",headers:bt(r),data:{content:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function wt(){return(wt=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/reports/".concat(n,"/notes/").concat(t),method:"delete",headers:bt(r)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var bt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},yt={state:{fetchedReports:[],totalReportsCount:0,currentPage:1,pageSize:50,stateFilter:"",loading:!0},mutations:{SET_LAST_REPORT_ID:function(e,t){e.idOfLastReport=t},SET_LOADING:function(e,t){e.loading=t},SET_PAGE:function(e,t){e.currentPage=t},SET_REPORTS:function(e,t){e.fetchedReports=t},SET_REPORTS_COUNT:function(e,t){e.totalReportsCount=t},SET_REPORTS_FILTER:function(e,t){e.stateFilter=t}},actions:{ChangeReportState:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.commit,r=t.getters,s=t.state,ht(n,r.authHost,r.token),o=s.fetchedReports.map(function(e){return n.map(function(e){return e.id}).includes(e.id)?A()({},e,{state:n[0].state}):e}),a("SET_REPORTS",o);case 4:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ClearFetchedReports:function(e){(0,e.commit)("SET_REPORTS",[])},FetchReports:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=t.state,a("SET_LOADING",!0),e.next=4,ft(s.stateFilter,n,s.pageSize,r.authHost,r.token);case 4:o=e.sent,i=o.data,a("SET_REPORTS",i.reports),a("SET_REPORTS_COUNT",i.total),a("SET_PAGE",n),a("SET_LOADING",!1);case 10:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetFilter:function(e,t){(0,e.commit)("SET_REPORTS_FILTER",t)},CreateReportNote:function(e,t){var n=e.commit,a=e.getters,r=e.state,s=e.rootState,o=t.content,i=t.reportID;!function(e,t,n,a){gt.apply(this,arguments)}(o,i,a.authHost,a.token);var c={user:{avatar:s.user.avatar,display_name:s.user.name,url:"".concat(s.user.authHost,"/").concat(s.user.name),acct:s.user.name},content:o,created_at:(new Date).getTime()};n("SET_REPORTS",r.fetchedReports.map(function(e){return e.id===i&&(e.notes=[].concat(Q()(e.notes),[c])),e}))},DeleteReportNote:function(e,t){var n=e.commit,a=e.getters,r=e.state,s=t.noteID,o=t.reportID;!function(e,t,n,a){wt.apply(this,arguments)}(s,o,a.authHost,a.token),n("SET_REPORTS",r.fetchedReports.map(function(e){return e.id===o&&(e.notes=e.notes.filter(function(e){return e.id!==s})),e}))}}},xt=n("lSNA"),Tt=n.n(xt),kt=n("QILm"),Et=n.n(kt);function St(e,t){return _t.apply(this,arguments)}function _t(){return(_t=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/config/descriptions",method:"get",headers:Dt(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ot(e,t){return Lt.apply(this,arguments)}function Lt(){return(Lt=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/config",method:"get",headers:Dt(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function At(e,t,n){return It.apply(this,arguments)}function It(){return(It=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/config",method:"post",headers:Dt(a),data:{configs:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ct(e,t,n){return Rt.apply(this,arguments)}function Rt(){return(Rt=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/config",method:"post",headers:Dt(a),data:{configs:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var Dt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},Vt=n("h74u");function zt(e){var t=function(e,t){if("object"!==he()(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t||"default");if("object"!==he()(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===he()(t)?t:String(t)}var Pt={state:{activeTab:"instance",configDisabled:!0,db:{},description:[],loading:!0,searchData:{},settings:{},updatedSettings:{}},mutations:{CLEAR_UPDATED_SETTINGS:function(e){e.updatedSettings={}},REMOVE_SETTING_FROM_UPDATED:function(e,t){var n=t.group,a=t.key,r=t.subkeys;if(C.a.get(e.updatedSettings,[n,a,r[0]])){var s=e.updatedSettings[n][a],o=(s[r[0]],Et()(s,[r[0]].map(zt)));e.updatedSettings=o}},SET_ACTIVE_TAB:function(e,t){e.activeTab=t},SET_DESCRIPTION:function(e,t){e.description=t},SET_LOADING:function(e,t){e.loading=t},SET_SEARCH:function(e,t){e.searchData=t},SET_SETTINGS:function(e,t){var n=t.reduce(function(e,t){var n=t.group,a=t.key,r=t.value,s=Object(Vt.f)(a,r)?{value:Object(Vt.c)(a,r)}:Object(Vt.d)(r,a);return e[n]=e[n]?A()({},e[n],Tt()({},a,s)):Tt()({},a,s),e},{}),a=t.reduce(function(e,t){var n=t.group,a=t.key,r=t.db;return r&&(e[n]=e[n]?A()({},e[n],Tt()({},a,r)):Tt()({},a,r)),e},{});e.settings=n,e.db=a},TOGGLE_TABS:function(e,t){e.configDisabled=t},UPDATE_SETTINGS:function(e,t){var n=t.group,a=t.key,r=t.input,s=t.value,o=t.type,i=!e.updatedSettings[n]||"Pleroma.Emails.Mailer"===a&&":adapter"===r?Tt()({},a,Tt()({},r,[o,s])):Tt()({},a,A()({},e.updatedSettings[n][a],Tt()({},r,[o,s])));e.updatedSettings[n]=A()({},e.updatedSettings[n],i)},UPDATE_STATE:function(e,t){var n=t.group,a=t.key,r=t.input,s=t.value,o="Pleroma.Emails.Mailer"===a&&":adapter"===r?Tt()({},a,Tt()({},r,s)):Tt()({},a,A()({},e.settings[n][a],Tt()({},r,s)));e.settings[n]=A()({},e.settings[n],o)}},actions:{FetchSettings:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,n("SET_LOADING",!0),e.prev=2,e.next=5,Ot(a.authHost,a.token);case 5:return r=e.sent,e.next=8,St(a.authHost,a.token);case 8:s=e.sent,n("SET_DESCRIPTION",s.data),o=Object(Vt.b)(s.data),n("SET_SEARCH",o),n("SET_SETTINGS",r.data.configs),e.next=21;break;case 15:return e.prev=15,e.t0=e.catch(2),n("TOGGLE_TABS",!0),n("SET_ACTIVE_TAB","relays"),n("SET_LOADING",!1),e.abrupt("return");case 21:n("TOGGLE_TABS",!1),n("SET_LOADING",!1);case 23:case"end":return e.stop()}},e,null,[[2,15]])}));return function(t){return e.apply(this,arguments)}}(),RemoveSetting:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,e.next=3,Ct(n,r.authHost,r.token);case 3:return e.next=5,Ot(r.authHost,r.token);case 5:s=e.sent,o=n[0],i=o.group,c=o.key,u=o.subkeys,a("SET_SETTINGS",s.data.configs),a("TOGGLE_REBOOT",s.data.need_reboot),a("REMOVE_SETTING_FROM_UPDATED",{group:i,key:c,subkeys:u||[]});case 10:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetActiveTab:function(e,t){(0,e.commit)("SET_ACTIVE_TAB",t)},SubmitChanges:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.getters,a=t.commit,r=t.state,s=Object(Vt.a)(r.settings,r.updatedSettings,r.description),o=Object.keys(s).reduce(function(e,t){return[].concat(Q()(e),Q()(Object(Vt.g)(t,s[t],r.settings)))},[]),e.next=5,At(o,n.authHost,n.token);case 5:return e.next=7,Ot(n.authHost,n.token);case 7:i=e.sent,a("SET_SETTINGS",i.data.configs),a("TOGGLE_REBOOT",i.data.need_reboot),a("CLEAR_UPDATED_SETTINGS");case 11:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),UpdateSettings:function(e,t){var n=e.commit,a=t.group,r=t.key,s=t.input,o=t.value,i=t.type;n("UPDATE_SETTINGS",r?{group:a,key:r,input:s,value:o,type:i}:{group:a,key:s,input:"_value",value:o,type:i})},UpdateState:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l,p;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.commit,r=t.getters,s=t.state,o=n.group,i=n.key,c=n.input,u=n.value,"Pleroma.Emails.Mailer"!==i||":adapter"!==c){e.next=8;break}return l=Object.keys(s.settings[o][i]).filter(function(e){return":adapter"!==e}),e.next=6,Ct([{group:o,key:i,delete:!0,subkeys:l}],r.authHost,r.token);case 6:e.next=12;break;case 8:if("Pleroma.Upload"!==i||":uploader"!==c){e.next=12;break}return p="Pleroma.Uploaders.Local"===u?"Pleroma.Uploaders.S3":"Pleroma.Uploaders.Local",e.next=12,Ct([{group:o,key:p,delete:!0}],r.authHost,r.token);case 12:a("UPDATE_STATE",i?{group:o,key:i,input:c,value:u}:{group:o,key:c,input:"value",value:u});case 13:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}};function jt(e,t,n,a,r){return Mt.apply(this,arguments)}function Mt(){return(Mt=g()(f.a.mark(function e(t,n,a,r,s){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(r),url:"/api/pleroma/admin/statuses/".concat(t),method:"put",headers:qt(s),data:{sensitive:n,visibility:a}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Bt(e,t,n){return Ht.apply(this,arguments)}function Ht(){return(Ht=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/statuses/".concat(t),method:"delete",headers:qt(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ut(e){return Ft.apply(this,arguments)}function Ft(){return(Ft=g()(f.a.mark(function e(t){var n,a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.godmode,a=t.localOnly,r=t.authHost,s=t.token,o=t.pageSize,i=t.page,e.next=3,Object(w.a)({baseURL:Object(y.a)(r),url:"/api/pleroma/admin/statuses?godmode=".concat(n,"&local_only=").concat(a,"&page=").concat(i,"&page_size=").concat(o),method:"get",headers:qt(s)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Nt(e,t){return Gt.apply(this,arguments)}function Gt(){return(Gt=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/stats",method:"get",headers:qt(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Yt(e){return $t.apply(this,arguments)}function $t(){return($t=g()(f.a.mark(function e(t){var n,a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.instance,a=t.authHost,r=t.token,s=t.pageSize,o=t.page,e.next=3,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/instances/".concat(n,"/statuses?page=").concat(o,"&page_size=").concat(s),method:"get",headers:qt(r)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}var qt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},Kt={state:{fetchedStatuses:[],loading:!1,statusesByInstance:{selectedInstance:"",showLocal:!1,showPrivate:!1,page:1,pageSize:20,buttonLoading:!1,allLoaded:!1},statusVisibility:{}},mutations:{CHANGE_GODMODE_CHECKBOX_VALUE:function(e,t){e.statusesByInstance.showPrivate=t},CHANGE_LOCAL_CHECKBOX_VALUE:function(e,t){e.statusesByInstance.showLocal=t},CHANGE_PAGE:function(e,t){e.statusesByInstance.page=t},CHANGE_SELECTED_INSTANCE:function(e,t){e.statusesByInstance.selectedInstance=t},SET_STATUSES_BY_INSTANCE:function(e,t){e.fetchedStatuses=t},PUSH_STATUSES:function(e,t){e.fetchedStatuses=[].concat(Q()(e.fetchedStatuses),Q()(t))},SET_ALL_LOADED:function(e,t){e.statusesByInstance.allLoaded=t},SET_BUTTON_LOADING:function(e,t){e.statusesByInstance.buttonLoading=t},SET_LOADING:function(e,t){e.loading=t},SET_STATUS_VISIBILITY:function(e,t){e.statusVisibility=t}},actions:{ChangeStatusScope:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l,p;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.statusId,o=n.isSensitive,i=n.visibility,c=n.reportCurrentPage,u=n.userId,l=n.godmode,p=n.fetchStatusesByInstance,e.next=4,jt(s,o,i,r.authHost,r.token);case 4:0!==c?a("FetchReports",c):u.length>0?a("FetchUserStatuses",{userId:u,godmode:l}):p&&a("FetchStatusesByInstance");case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),DeleteStatus:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.statusId,o=n.reportCurrentPage,i=n.userId,c=n.godmode,u=n.fetchStatusesByInstance,e.next=4,Bt(s,r.authHost,r.token);case 4:0!==o?a("FetchReports",o):i.length>0?a("FetchUserStatuses",{userId:i,godmode:c}):u&&a("FetchStatusesByInstance");case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),FetchStatusesCount:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,n("SET_LOADING",!0),e.next=4,Nt(a.authHost,a.token);case 4:r=e.sent,s=r.data,n("SET_STATUS_VISIBILITY",s.status_visibility),n("SET_LOADING",!1);case 8:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),FetchStatusesByInstance:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.commit,a=t.getters,r=t.state,s=t.rootState,n("SET_LOADING",!0),""!==r.statusesByInstance.selectedInstance){e.next=6;break}n("SET_STATUSES_BY_INSTANCE",[]),e.next=18;break;case 6:if(r.statusesByInstance.selectedInstance!==s.user.authHost){e.next=12;break}return e.next=9,Ut({godmode:r.statusesByInstance.showPrivate,localOnly:r.statusesByInstance.showLocal,authHost:a.authHost,token:a.token,pageSize:r.statusesByInstance.pageSize,page:r.statusesByInstance.page});case 9:e.t0=e.sent,e.next=15;break;case 12:return e.next=14,Yt({instance:r.statusesByInstance.selectedInstance,authHost:a.authHost,token:a.token,pageSize:r.statusesByInstance.pageSize,page:r.statusesByInstance.page});case 14:e.t0=e.sent;case 15:o=e.t0,n("SET_STATUSES_BY_INSTANCE",o.data),o.data.lengthThis user doesn`t have admin rights. Try another credentials or see the docs to find out how to make this user an admin'),t("SET_NAME",r.username),t("SET_ID",r.id),t("SET_AVATAR",r.avatar),t("SET_INTRODUCTION",""),e(n)}).catch(function(e){a(e)})})},LogOut:function(e){var t=e.commit;t("SET_TOKEN",""),t("SET_ROLES",[]),Object(b.d)(),Object(b.c)()},FedLogOut:function(e){var t=e.commit;return new Promise(function(e){t("SET_TOKEN",""),Object(b.d)(),Object(b.c)(),e()})},LoginByPleromaFE:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.commit,r=t.dispatch,s=n.token,a("SET_TOKEN",s),Object(b.f)(s),a("SET_AUTH_HOST",window.location.host),Object(b.e)(window.location.host),r("GetUserInfo");case 7:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}};function rn(e,t,n){return sn.apply(this,arguments)}function sn(){return(sn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/activate",method:"patch",headers:Un(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function on(e,t,n,a){return cn.apply(this,arguments)}function cn(){return(cn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/permission_group/".concat(n),method:"post",headers:Un(r),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function un(e,t,n,a,r){return ln.apply(this,arguments)}function ln(){return(ln=g()(f.a.mark(function e(t,n,a,r,s){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(r),url:"/api/pleroma/admin/users",method:"post",headers:Un(s),data:{users:[{nickname:t,email:n,password:a}]}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function pn(e,t,n){return dn.apply(this,arguments)}function dn(){return(dn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/deactivate",method:"patch",headers:Un(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function hn(e,t,n,a){return mn.apply(this,arguments)}function mn(){return(mn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/permission_group/".concat(n),method:"delete",headers:Un(r),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function fn(e,t,n){return vn.apply(this,arguments)}function vn(){return(vn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users",method:"delete",headers:Un(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function gn(e,t,n){return wn.apply(this,arguments)}function wn(){return(wn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t),method:"get",headers:Un(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function bn(e,t,n){return yn.apply(this,arguments)}function yn(){return(yn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t,"/credentials"),method:"get",headers:Un(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function xn(e,t,n,a){return Tn.apply(this,arguments)}function Tn(){return(Tn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/".concat(t,"/credentials"),method:"patch",headers:Un(r),data:n});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function kn(e,t,n){return En.apply(this,arguments)}function En(){return(En=g()(f.a.mark(function e(t,n,a){var r,s=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>3&&void 0!==s[3]?s[3]:1,e.next=3,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users?page=".concat(r,"&filters=").concat(t),method:"get",headers:Un(a)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Sn(e,t,n){return _n.apply(this,arguments)}function _n(){return(_n=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t,"/password_reset"),method:"get",headers:Un(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function On(e,t,n){return Ln.apply(this,arguments)}function Ln(){return(Ln=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/force_password_reset",method:"patch",headers:Un(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function An(e,t,n,a){return In.apply(this,arguments)}function In(){return(In=g()(f.a.mark(function e(t,n,a,r){var s,o=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s=o.length>4&&void 0!==o[4]?o[4]:1,e.next=3,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users?query=".concat(t,"&page=").concat(s,"&filters=").concat(n),method:"get",headers:Un(r)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Cn(e,t,n,a){return Rn.apply(this,arguments)}function Rn(){return(Rn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/tag",method:"put",headers:Un(r),data:{nicknames:t,tags:n}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Dn(e,t,n,a){return Vn.apply(this,arguments)}function Vn(){return(Vn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/tag",method:"delete",headers:Un(r),data:{nicknames:t,tags:n}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function zn(e,t,n,a){return Pn.apply(this,arguments)}function Pn(){return(Pn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t,"/statuses?godmode=").concat(a),method:"get",headers:Un(r)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function jn(e,t,n){return Mn.apply(this,arguments)}function Mn(){return(Mn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/confirm_email",method:"patch",headers:Un(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Bn(e,t,n){return Hn.apply(this,arguments)}function Hn(){return(Hn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/resend_confirmation_email",method:"patch",headers:Un(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var Un=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},Fn={state:{statuses:[],statusesLoading:!0,user:{},userCredentials:{},userProfileLoading:!0},mutations:{SET_STATUSES:function(e,t){e.statuses=t},SET_STATUSES_LOADING:function(e,t){e.statusesLoading=t},SET_USER:function(e,t){e.user=t},SET_USER_PROFILE_LOADING:function(e,t){e.userProfileLoading=t},SET_USER_CREDENTIALS:function(e,t){e.userCredentials=t}},actions:{FetchUserProfile:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=n.userId,i=n.godmode,a("SET_USER_PROFILE_LOADING",!0),e.next=5,gn(o,s.authHost,s.token);case 5:c=e.sent,a("SET_USER",c.data),a("SET_USER_PROFILE_LOADING",!1),r("FetchUserStatuses",{userId:o,godmode:i});case 9:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),FetchUserStatuses:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.userId,o=n.godmode,a("SET_STATUSES_LOADING",!0),e.next=5,zn(s,r.authHost,o,r.token);case 5:i=e.sent,a("SET_STATUSES",i.data),a("SET_STATUSES_LOADING",!1);case 8:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),FetchUserCredentials:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.nickname,e.next=4,bn(s,r.authHost,r.token);case 4:o=e.sent,a("SET_USER_CREDENTIALS",o.data);case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),UpdateUserCredentials:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.nickname,o=n.credentials,e.next=4,xn(s,o,r.authHost,r.token);case 4:a("FetchUserCredentials",{nickname:s});case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}},Nn={state:{fetchedUsers:[],loading:!0,searchQuery:"",totalUsersCount:0,currentPage:1,filters:{local:!1,external:!1,active:!1,deactivated:!1},passwordResetToken:{token:"",link:""}},mutations:{SET_USERS:function(e,t){e.fetchedUsers=t},SET_LOADING:function(e,t){e.loading=t},SWAP_USERS:function(e,t){var n=t.reduce(function(e,t){return e.filter(function(e){return e.id!==t.id})},e.fetchedUsers);0!==e.fetchedUsers.length&&(e.fetchedUsers=[].concat(Q()(n),Q()(t)).sort(function(e,t){return e.nickname.localeCompare(t.nickname)}))},SET_COUNT:function(e,t){e.totalUsersCount=t},SET_PAGE:function(e,t){e.currentPage=t},SET_PAGE_SIZE:function(e,t){e.pageSize=t},SET_PASSWORD_RESET_TOKEN:function(e,t){var n=t.token,a=t.link;e.passwordResetToken.token=n,e.passwordResetToken.link=a},SET_SEARCH_QUERY:function(e,t){e.searchQuery=t},SET_USERS_FILTERS:function(e,t){e.filters=t},SET_USER_PROFILE:function(e,t){e.userProfile=t}},actions:{ActivateUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n._userId,i=s.map(function(e){return A()({},e,{deactivated:!1})}),c=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:i,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,rn(c,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:o});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ApplyChanges:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.state,o=n.updatedUsers,i=n.callApiFn,c=n.userId,a("SWAP_USERS",o),e.prev=3,e.next=6,i();case 6:e.next=11;break;case 8:return e.prev=8,e.t0=e.catch(3),e.abrupt("return");case 11:return e.prev=11,r("SearchUsers",{query:s.searchQuery,page:s.currentPage}),e.finish(11);case 14:c&&r("FetchUserProfile",{userId:c,godmode:!1}),r("SuccessMessage");case 16:case"end":return e.stop()}},e,null,[[3,8,11,14]])}));return function(t,n){return e.apply(this,arguments)}}(),AddRight:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.right,i=n._userId,c=s.map(function(e){return e.local?A()({},e,{roles:A()({},e.roles,Tt()({},o,!0))}):e}),u=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:c,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,on(u,o,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),AddTag:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.tag,i=n._userId,c=s.map(function(e){return A()({},e,{tags:[].concat(Q()(e.tags),[o])})}),u=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:c,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Cn(u,[o],r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ClearFilters:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:n=t.commit,a=t.dispatch,r=t.state,n("CLEAR_USERS_FILTERS"),a("SearchUsers",{query:r.searchQuery,page:1});case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),CreateNewAccount:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=t.state,o=n.nickname,i=n.email,c=n.password,e.prev=2,e.next=5,un(o,i,c,r.authHost,r.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:return e.prev=10,a("SearchUsers",{query:s.searchQuery,page:s.currentPage}),e.finish(10);case 13:a("SuccessMessage");case 14:case"end":return e.stop()}},e,null,[[2,7,10,13]])}));return function(t,n){return e.apply(this,arguments)}}(),DeactivateUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n._userId,i=s.map(function(e){return A()({},e,{deactivated:!0})}),c=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:i,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,pn(c,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:o});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ConfirmUsersEmail:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n._userId,i=s.map(function(e){return A()({},e,{confirmation_pending:!1})}),c=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:i,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,jn(c,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:o});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ResendConfirmationEmail:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.map(function(e){return e.nickname}),e.prev=2,e.next=5,Bn(s,r.authHost,r.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:a("SuccessMessage");case 11:case"end":return e.stop()}},e,null,[[2,7]])}));return function(t,n){return e.apply(this,arguments)}}(),DeleteRight:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.right,i=n._userId,c=s.map(function(e){return e.local?A()({},e,{roles:A()({},e.roles,Tt()({},o,!1))}):e}),u=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:c,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,hn(u,o,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),DeleteUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l,p;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=t.state,i=n.users,c=n._userId,u=i.map(function(e){return e.nickname}),e.prev=3,e.next=6,fn(u,s.authHost,s.token);case 6:e.next=11;break;case 8:return e.prev=8,e.t0=e.catch(3),e.abrupt("return");case 11:l=i.map(function(e){return e.id}),p=o.fetchedUsers.filter(function(e){return!l.includes(e.id)}),a("SET_USERS",p),r("FetchUserProfile",{userId:c,godmode:!1}),r("SuccessMessage");case 16:case"end":return e.stop()}},e,null,[[3,8]])}));return function(t,n){return e.apply(this,arguments)}}(),FetchUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=t.state,i=n.page,a("SET_LOADING",!0),c=Object.keys(o.filters).filter(function(e){return o.filters[e]}).join(),e.next=6,kn(c,s.authHost,s.token,i);case 6:return u=e.sent,e.next=9,r("GetNodeInfo");case 9:Gn(a,i,u.data);case 10:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),GetPasswordResetToken:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,e.next=3,Sn(n,r.authHost,r.token);case 3:s=e.sent,o=s.data,a("SET_PASSWORD_RESET_TOKEN",o);case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),RemovePasswordToken:function(e){(0,e.commit)("SET_PASSWORD_RESET_TOKEN",{link:"",token:""})},RemoveTag:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.tag,i=n._userId,c=s.map(function(e){return A()({},e,{tags:e.tags.filter(function(e){return e!==o})})}),u=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:c,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Dn(u,[o],r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),RequirePasswordReset:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.map(function(e){return e.nickname}),e.prev=2,e.next=5,On(s,r.authHost,r.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:a("SuccessMessage");case 11:case"end":return e.stop()}},e,null,[[2,7]])}));return function(t,n){return e.apply(this,arguments)}}(),SearchUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.commit,r=t.dispatch,s=t.state,o=t.getters,i=n.query,c=n.page,0!==i.length){e.next=7;break}a("SET_SEARCH_QUERY",i),r("FetchUsers",{page:c}),e.next=14;break;case 7:return a("SET_LOADING",!0),a("SET_SEARCH_QUERY",i),u=Object.keys(s.filters).filter(function(e){return s.filters[e]}).join(),e.next=12,An(i,u,o.authHost,o.token,c);case 12:l=e.sent,Gn(a,c,l.data);case 14:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SuccessMessage:function(){i.Message.success({message:W.a.t("users.completed"),duration:5e3})},ToggleUsersFilter:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.commit,r=t.dispatch,s=t.state,o={local:!1,external:!1,active:!1,deactivated:!1},i=A()({},o,n),a("SET_USERS_FILTERS",i),r("SearchUsers",{query:s.searchQuery,page:1});case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}},Gn=function(e,t,n){var a=n.users,r=n.count,s=n.page_size;e("SET_USERS",a),e("SET_COUNT",r),e("SET_PAGE",t),e("SET_PAGE_SIZE",s),e("SET_LOADING",!1)},Yn=Nn,$n={sidebar:function(e){return e.app.sidebar},language:function(e){return e.app.language},size:function(e){return e.app.size},device:function(e){return e.app.device},visitedViews:function(e){return e.tagsView.visitedViews},cachedViews:function(e){return e.tagsView.cachedViews},token:function(e){return e.user.token},avatar:function(e){return e.user.avatar},name:function(e){return e.user.name},introduction:function(e){return e.user.introduction},status:function(e){return e.user.status},roles:function(e){return e.user.roles},setting:function(e){return e.user.setting},permission_routers:function(e){return e.permission.routers},addRouters:function(e){return e.permission.addRouters},errorLogs:function(e){return e.errorLog.logs},users:function(e){return e.users.fetchedUsers},authHost:function(e){return e.user.authHost},settings:function(e){return e.settings}},qn=n("mm8V"),Kn={state:{activeCollapseItems:[],localPacks:{},remoteInstance:"",remotePacks:{}},mutations:{SET_ACTIVE_COLLAPSE_ITEMS:function(e,t){e.activeCollapseItems=t},SET_LOCAL_PACKS:function(e,t){e.localPacks=t},SET_REMOTE_INSTANCE:function(e,t){e.remoteInstance=t},SET_REMOTE_PACKS:function(e,t){e.remotePacks=t},UPDATE_LOCAL_PACK_VAL:function(e,t){var n=t.name,a=t.key,s=t.value;r.default.set(e.localPacks[n].pack,a,s)},UPDATE_LOCAL_PACK_PACK:function(e,t){var n=t.name,a=t.pack;e.localPacks[n].pack=a},UPDATE_LOCAL_PACK_FILES:function(e,t){var n=t.name,a=t.files;r.default.set(e.localPacks[n],"files",a)}},actions:{CreatePack:function(){var e=g()(f.a.mark(function e(t,n){var a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.getters,r=n.name,e.next=4,Object(qn.b)(a.authHost,a.token,r);case 4:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),DeletePack:function(){var e=g()(f.a.mark(function e(t,n){var a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.getters,r=n.name,e.next=4,Object(qn.c)(a.authHost,a.token,r);case 4:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),DownloadFrom:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.getters,r=n.instanceAddress,s=n.packName,o=n.as,e.next=4,Object(qn.d)(a.authHost,r,s,o,a.token);case 4:"ok"===e.sent.data&&Object(i.Message)({message:"".concat(W.a.t("settings.successfullyDownloaded")," ").concat(s),type:"success",duration:5e3});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ImportFromFS:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.getters,e.next=3,Object(qn.e)(n.authHost,n.token);case 3:200===(a=e.sent).status&&(r=a.data.length>0?"".concat(W.a.t("settings.successfullyImported")," ").concat(a.data):W.a.t("settings.nowNewPacksToImport"),Object(i.Message)({message:r,type:"success",duration:5e3}));case 5:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),ReloadEmoji:function(){var e=g()(f.a.mark(function e(t){var n;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.getters,e.next=3,Object(qn.h)(n.authHost,n.token);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),SavePackMetadata:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=t.state,o=n.packName,e.next=4,Object(qn.i)(r.authHost,r.token,o,s.localPacks[o].pack);case 4:200===(c=e.sent).status&&(Object(i.Message)({message:"".concat(W.a.t("settings.successfullyUpdated")," ").concat(o," ").concat(W.a.t("settings.metadatLowerCase")),type:"success",duration:5e3}),a("UPDATE_LOCAL_PACK_PACK",{name:o,pack:c.data}));case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetActiveCollapseItems:function(e,t){var n=e.commit;e.state;n("SET_ACTIVE_COLLAPSE_ITEMS",t)},SetLocalEmojiPacks:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,Object(qn.f)(a.authHost);case 3:r=e.sent,s=r.data,n("SET_LOCAL_PACKS",s);case 6:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),SetRemoteEmojiPacks:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.remoteInstance,e.next=4,Object(qn.g)(r.authHost,r.token,s);case 4:o=e.sent,i=o.data,a("SET_REMOTE_INSTANCE",s),a("SET_REMOTE_PACKS",i);case 8:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),UpdateAndSavePackFile:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,e.next=3,Object(qn.j)(r.authHost,r.token,n);case 3:200===(s=e.sent).status&&(o=n.packName,Object(i.Message)({message:"".concat(W.a.t("settings.successfullyUpdated")," ").concat(o," ").concat(W.a.t("settings.metadatLowerCase")),type:"success",duration:5e3}),a("UPDATE_LOCAL_PACK_FILES",{name:o,files:s.data}));case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),UpdateLocalPackVal:function(){var e=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:(0,t.commit)("UPDATE_LOCAL_PACK_VAL",n);case 2:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}};r.default.use(h.a);var Wn=new h.a.Store({modules:{app:_,errorLog:O,moderationLog:B,invites:Z,peers:ne,permission:rt,relays:dt,reports:yt,settings:Pt,status:Kt,tagsView:Jt,user:an,userProfile:Fn,users:Yn,emojiPacks:Kn},getters:$n}),Zn=n("zT9a");r.default.component("svg-icon",Zn.a);!function(e){e.keys().map(e)}(n("Uf/o")),r.default.config.errorHandler=function(e,t,n,a){r.default.nextTick(function(){Wn.dispatch("addErrorLog",{err:e,vm:t,info:n,url:window.location.href}),console.error(e,n)})};var Jn=n("Mj6V"),Qn=n.n(Jn);n("pdi6");Qn.a.configure({showSpinner:!1});var Xn=["/login","/auth-redirect","/login-pleroma"];function ea(e,t){return 1===e?e+t:e+t+"s"}function ta(e){var t=Date.now()/1e3-Number(e);return t<3600?ea(~~(t/60)," minute"):t<86400?ea(~~(t/3600)," hour"):ea(~~(t/86400)," day")}function na(e,t){for(var n=[{value:1e18,symbol:"E"},{value:1e15,symbol:"P"},{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"}],a=0;a=n[a].value)return(e/n[a].value+.1).toFixed(t).replace(/\.0+$|(\.[0-9]*[1-9])0+$/,"$1")+n[a].symbol;return e.toString()}function aa(e){return(+e||0).toString().replace(/^-?\d+/g,function(e){return e.replace(/(?=(?!\b)(\d{3})+$)/g,",")})}nt.beforeEach(function(e,t,n){Qn.a.start(),Object(b.b)()?"/login"===e.path?(n({path:"/"}),Qn.a.done()):0===Wn.getters.roles.length?Wn.dispatch("GetUserInfo").then(function(t){var a=t.data.pleroma.is_admin?["admin"]:[];Wn.dispatch("GenerateRoutes",{roles:a}).then(function(){nt.addRoutes(Wn.getters.addRouters),n(A()({},e,{replace:!0}))})}).catch(function(e){Wn.dispatch("FedLogOut").then(function(){Object(i.Message)({dangerouslyUseHTMLString:!0,message:e,type:"error",duration:1e4}),n({path:"/"})})}):function(e,t){return e.indexOf("admin")>=0||!t||e.some(function(e){return t.indexOf(e)>=0})}(Wn.getters.roles,e.meta.roles)?n():n({path:"/401",replace:!0,query:{noGoBack:!0}}):-1!==Xn.indexOf(e.path)?n():(n("/login?redirect=".concat(e.path)),Qn.a.done())}),nt.afterEach(function(){Qn.a.done()}),r.default.use(c.a,{size:o.a.get("size")||"medium",i18n:function(e,t){return W.a.t(e,t)}}),Object.keys(a).forEach(function(e){r.default.filter(e,a[e])}),r.default.config.productionTip=!1,new r.default({el:"#app",router:nt,store:Wn,i18n:W.a,render:function(e){return e(d)}})},X4fA:function(e,t,n){"use strict";n.d(t,"b",function(){return i}),n.d(t,"f",function(){return c}),n.d(t,"d",function(){return u}),n.d(t,"a",function(){return l}),n.d(t,"e",function(){return p}),n.d(t,"c",function(){return d});var a=n("p46w"),r=n.n(a),s="Admin-Token",o="Auth-Host";function i(){return r.a.get(s)}function c(e){return r.a.set(s,e)}function u(){return r.a.remove(s)}function l(){return r.a.get(o)}function p(e){return r.a.set(o,e)}function d(){return r.a.remove(o)}},Xm3t:function(e,t,n){},Yymj:function(e,t,n){"use strict";var a=n("jf83");n.n(a).a},"Z+gY":function(e,t,n){"use strict";var a=n("Kcm3");n.n(a).a},ZZmv:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-excel",use:"icon-excel-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},ZoO1:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-guide",use:"icon-guide-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},cIpu:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-star",use:"icon-star-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},fhHp:function(e,t,n){"use strict";var a=n("lt0h");n.n(a).a},gNoN:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-wechat",use:"icon-wechat-usage",viewBox:"0 0 128 110",content:''});o.a.add(i);t.default=i},h74u:function(e,t,n){"use strict";n.d(t,"a",function(){return g}),n.d(t,"c",function(){return b}),n.d(t,"d",function(){return y}),n.d(t,"e",function(){return E}),n.d(t,"f",function(){return _}),n.d(t,"g",function(){return O}),n.d(t,"b",function(){return A});var a=n("RIqP"),r=n.n(a),s=n("cDf5"),o=n.n(s),i=n("lSNA"),c=n.n(i),u=n("MVZn"),l=n.n(u),p=n("J4zp"),d=n.n(p),h=n("SA+Z"),m=n.n(h),f=n("LvDl"),v=n.n(f),g=function(e,t,n){return Object.keys(t).reduce(function(a,r){return a[r]=Object.keys(t[r]).reduce(function(a,s){if(!k(r,s)){var o=Object.keys(e[r][s]).reduce(function(t,a){var o=n.find(function(e){return e.group===r&&e.key===s}).children.find(function(e){return e.key===a}),i=o?o.type:"";return t[a]=[i,e[r][s][a]],t},{});return a[s]=o,a}return a[s]=t[r][s],a},{}),a},{})},w=function(e,t,n){if("state"===e)return v.a.get(t,n);var a=m()(n),r=a[0],s=a.slice(1),o=t[r];if(0!==s.length&&o){return function e(t,n){var a=m()(n),r=a[0],s=a.slice(1);return 0===n.length?t:e(t[1][r],s)}(o,s)}return o||!1},b=function(e,t){if(":backends"===e){var n=t.findIndex(function(e){return"object"===o()(e)&&e.tuple.includes(":ex_syslogger")});return t.map(function(e,t){return t===n?":ex_syslogger":e})}if(":args"===e){if("string"==typeof t)return[t];var a=t.findIndex(function(e){return"object"===o()(e)&&e.tuple.includes("implode")});return t.map(function(e,t){return t===a?"implode":e})}return t},y=function e(t,n){return t.reduce(function(t,a){return":rate_limit"===n?t[a.tuple[0]]=Array.isArray(a.tuple[1])?a.tuple[1].map(function(e){return e.tuple}):a.tuple[1].tuple:":mascots"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].reduce(function(e,t){return[].concat(r()(e),[c()({},t.tuple[0],l()({},t.tuple[1],{id:"f".concat((~~(1e8*Math.random())).toString(16))}))])},[]):!Array.isArray(a.tuple[1])||":groups"!==a.tuple[0]&&":replace"!==a.tuple[0]&&":retries"!==a.tuple[0]?":crontab"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].reduce(function(e,t){return l()({},e,c()({},t.tuple[1],t.tuple[0]))},{}):":match_actor"===a.tuple[0]?t[a.tuple[0]]=Object.keys(a.tuple[1]).reduce(function(e,t){return[].concat(r()(e),[c()({},t,{value:a.tuple[1][t],id:"f".concat((~~(1e8*Math.random())).toString(16))})])},[]):":icons"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].map(function(e){return Object.keys(e).map(function(t){return{key:t,value:e[t],id:"f".concat((~~(1e8*Math.random())).toString(16))}})},[]):":prune"===a.tuple[0]?t[a.tuple[0]]=":disabled"===a.tuple[1]?[a.tuple[1]]:a.tuple[1].tuple:":proxy_url"===a.tuple[0]?t[a.tuple[0]]=T(a.tuple[1]):":args"===a.tuple[0]?t[a.tuple[0]]=b(a.tuple[0],a.tuple[1]):Array.isArray(a.tuple[1])&&"object"===o()(a.tuple[1][0])&&!Array.isArray(a.tuple[1][0])&&a.tuple[1][0].tuple?t[a.tuple[0]]=e(a.tuple[1],a.tuple[0]):Array.isArray(a.tuple[1])?t[a.tuple[0]]=a.tuple[1]:":ip"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].tuple.join("."):a.tuple[1]&&"object"===o()(a.tuple[1])?t[a.tuple[0]]=x(a.tuple[1]):t[a.tuple[0]]=a.tuple[1]:t[a.tuple[0]]=a.tuple[1].reduce(function(e,t){return[].concat(r()(e),[c()({},t.tuple[0],{value:t.tuple[1],id:"f".concat((~~(1e8*Math.random())).toString(16))})])},[]),t},{})},x=function(e){return Object.keys(e).reduce(function(t,n){return t[n]=e[n],t},{})},T=function(e){if(e&&!Array.isArray(e)&&"object"===o()(e)&&3===e.tuple.length&&":socks5"===e.tuple[0]){var t=d()(e.tuple,3);return{socks5:!0,host:t[1],port:t[2]}}if("string"==typeof e){var n=e.split(":"),a=d()(n,2);return{socks5:!1,host:a[0],port:a[1]}}return{socks5:!1,host:null,port:null}},k=function(e,t){return!(":auto_linker"===e&&":opts"===t)},E=function e(t,n,a,s,o,i,u){var p=m()(o),d=p[0],h=d.key,f=d.type,v=p.slice(1),g=[a,s].concat(r()(o.reverse().map(function(e){return e.key}).slice(0,-1))),b=S("state",i,g)?l()({},w("state",i[a][s],o.map(function(e){return e.key}).slice(0,-1)),c()({},h,t)):c()({},h,t),y=S("updatedSettings",u,g)?l()({},w("updatedSettings",u[a][s],o.map(function(e){return e.key}).slice(0,-1))[1],c()({},h,[f,n])):c()({},h,[f,n]);return":mime"===a&&":types"===o[0].key&&(b=i[a][o[0].key]?l()({},i[a][o[0].key].value,b):b,y=i[a][o[0].key]?l()({},Object.keys(i[a][o[0].key].value).reduce(function(e,t){return l()({},e,c()({},t,[f,i[a][o[0].key].value[t]]))},{}),y):y),1===v.length?{valueForState:b,valueForUpdatedSettings:y,setting:v[0]}:e(b,y,a,s,v,i,u)},S=function(e,t,n){if("state"===e)return v.a.get(t,n);var a=m()(n),r=a[0],s=a[1],o=a[2],i=a.slice(3),c=v.a.get(t,[r,s,o]);if(0!==i.length&&c){return function e(t,n){if(0===n.length)return!0;var a=m()(n),r=a[0],s=a.slice(1);return!!t[1][r]&&e(t[1][r],s)}(c,i)}return c||!1},_=function(e,t){var n=Array.isArray(t)&&t.length>0&&t.every(function(e){return"object"!==o()(e)});return":meta"===e||":types"===e||":backends"===e||":compiled_template_engines"===e||":compiled_format_encoders"===e||"string"==typeof t||"number"==typeof t||"boolean"==typeof t||null===t||n},O=function(e,t,n){return Object.keys(t).map(function(a){return t[a]._value?{group:e,key:a,value:function(e,t){var n=d()(t,2),a=n[0],r=n[1];if("atom"===a&&r.length>1)return":".concat(r);if(":backends"===e){var s=r.findIndex(function(e){return":ex_syslogger"===e}),o=r.slice();return-1!==s&&(o[s]={tuple:["ExSyslogger",":ex_syslogger"]}),o}return":types"===e?Object.keys(r).reduce(function(e,t){return l()({},e,c()({},t,r[t][1]))},{}):r}(a,t[a]._value)}:{group:e,key:a,value:L(t[a],n[e][a])}})},L=function e(t,n){return Object.keys(t).map(function(a){var r=d()(t[a],2),s=r[0],o=r[1];if("keyword"===s||s.includes("keyword")||s.includes("tuple")&&s.includes("list")||":replace"===a)return{tuple:[a,e(o,n)]};if("atom"===s&&o.length>0)return{tuple:[a,":".concat(o)]};if(s.includes("tuple")&&(s.includes("string")||s.includes("atom")))return"string"==typeof o?{tuple:[a,o]}:{tuple:[a,{tuple:o}]};if("reversed_tuple"===s)return{tuple:[o,a]};if("map"===s){var i=Object.keys(o).reduce(function(e,t){return e[t]=":match_actor"===a?o[t]:o[t][1],e},{}),u=":match_actor"===a?n[a].reduce(function(e,t){return l()({},e,c()({},Object.keys(t)[0],Object.values(t)[0].value))},{}):n[a];return{tuple:[a,l()({},u,i)]}}if(":ip"===a){var p=o.split(".").map(function(e){return parseInt(e,10)});return{tuple:[a,{tuple:p}]}}if(":args"===a){var h=o.findIndex(function(e){return"implode"===e}),m=o.slice();return-1!==h&&(m[h]={tuple:["implode","1"]}),{tuple:[a,m]}}return{tuple:[a,o]}})},A=function(e){return e.reduce(function(e,t){var n=v.a.compact([t.key,t.label,t.description]).map(function(e){return e.toLowerCase()}),a={label:t.label,key:t.key||t.group,groupKey:t.key||t.group,groupLabel:t.label,search:n};if(t.children){var s=t.key||":pleroma"!==t.group?[].concat(r()(e),[a]):e;return[].concat(r()(s),r()(function e(t,n,a){return t.reduce(function(t,s){var o=v.a.compact([s.key,s.label,s.description]).map(function(e){return e.toLowerCase()}),i={label:s.label,key:s.key||s.group,groupKey:a,groupLabel:n,search:o};if(s.children){var c=[].concat(r()(t),[i]);return[].concat(r()(c),r()(e(s.children,n,a)))}return[].concat(r()(t),[i])},[])}(t.children,t.label,t.key||t.group)))}return t.key||":pleroma"!==t.group?[].concat(r()(e),[a]):e},[])}},hkRB:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-size",use:"icon-size-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},iqZD:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-zip",use:"icon-zip-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},j7e1:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-tab",use:"icon-tab-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},jf83:function(e,t,n){},jo2x:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-search",use:"icon-search-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},k80C:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-tree",use:"icon-tree-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},kPu2:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-documentation",use:"icon-documentation-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},lt0h:function(e,t,n){},"m7++":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-drag",use:"icon-drag-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},mDMp:function(e,t,n){"use strict";var a=n("Tfa4");n.n(a).a},mSHS:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-fullscreen",use:"icon-fullscreen-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},mSNy:function(e,t,n){"use strict";var a=n("MVZn"),r=n.n(a),s=n("Kw5r"),o=n("qSUR"),i=n("p46w"),c=n.n(i),u=n("stYL"),l=n.n(u),p=n("8NkQ"),d=n.n(p),h=n("PtZe"),m=n.n(h);s.default.use(o.a);var f={en:r()({},{route:{dashboard:"Dashboard",introduction:"Introduction",documentation:"Documentation",guide:"Guide",permission:"Permission",pagePermission:"Page Permission",directivePermission:"Directive Permission",icons:"Icons",components:"Components",componentIndex:"Introduction",markdown:"Markdown",jsonEditor:"JSON Editor",dndList:"Dnd List",splitPane:"SplitPane",avatarUpload:"Avatar Upload",dropzone:"Dropzone",sticky:"Sticky",countTo:"CountTo",componentMixin:"Mixin",backToTop:"BackToTop",dragDialog:"Drag Dialog",dragSelect:"Drag Select",dragKanban:"Drag Kanban",charts:"Charts",keyboardChart:"Keyboard Chart",lineChart:"Line Chart",mixChart:"Mix Chart",example:"Example",nested:"Nested Routes",menu1:"Menu 1","menu1-1":"Menu 1-1","menu1-2":"Menu 1-2","menu1-2-1":"Menu 1-2-1","menu1-2-2":"Menu 1-2-2","menu1-3":"Menu 1-3",menu2:"Menu 2",Table:"Table",dynamicTable:"Dynamic Table",dragTable:"Drag Table",inlineEditTable:"Inline Edit",complexTable:"Complex Table",treeTable:"Tree Table",customTreeTable:"Custom TreeTable",tab:"Tab",form:"Form",createArticle:"Create Article",editArticle:"Edit Article",articleList:"Article List",errorPages:"Error Pages",page401:"401",page404:"404",errorLog:"Error Log",excel:"Excel",exportExcel:"Export Excel",selectExcel:"Export Selected",uploadExcel:"Upload Excel",zip:"Zip",pdf:"PDF",exportZip:"Export Zip",theme:"Theme",clipboardDemo:"Clipboard",i18n:"I18n",externalLink:"External Link",users:"Users",reports:"Reports",settings:"Settings",moderationLog:"Moderation Log","emoji-packs":"Emoji packs"},navbar:{logOut:"Log Out",dashboard:"Dashboard",github:"Github",theme:"Theme",size:"Global Size"},login:{title:"Login Form",logIn:"Log in",logInViaPleromaFE:"Log in via PleromaFE",username:"username@host",password:"password",omitHostname:"omit hostname if Pleroma is located on this domain",errorMessage:"Username must contain username and host, e.g. john@pleroma.social",any:"any",thirdparty:"Or connect with",pleromaFELoginFailed:"Failed to login via PleromaFE, please login with username/password",pleromaFELoginSucceed:"Logged in via PleromaFE"},documentation:{documentation:"Documentation",github:"Github Repository"},permission:{roles:"Your roles",switchRoles:"Switch roles",tips:"In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if."},guide:{description:"The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ",button:"Show Guide"},components:{documentation:"Documentation",dropzoneTips:"Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.",stickyTips:"when the page is scrolled to the preset position will be sticky on the top.",backToTopTips1:"When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner",backToTopTips2:"You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally",imageUploadTips:"Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version."},table:{dynamicTips1:"Fixed header, sorted by header order",dynamicTips2:"Not fixed header, sorted by click order",dragTips1:"The default order",dragTips2:"The after dragging order",title:"Title",importance:"Imp",type:"Type",remark:"Remark",search:"Search",add:"Add",export:"Export",reviewer:"reviewer",id:"ID",date:"Date",author:"Author",readings:"Readings",status:"Status",actions:"Actions",edit:"Edit",publish:"Publish",draft:"Draft",delete:"Delete",cancel:"Cancel",confirm:"Confirm"},errorLog:{tips:"Please click the bug icon in the upper right corner",description:"Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.",documentation:"Document introduction"},excel:{export:"Export",selectedExport:"Export Selected Items",placeholder:"Please enter the file name(default excel-list)"},zip:{export:"Export",placeholder:"Please enter the file name(default file)"},pdf:{tips:"Here we use window.print() to implement the feature of downloading pdf."},theme:{change:"Change Theme",documentation:"Theme documentation",tips:"Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details."},tagsView:{refresh:"Refresh",close:"Close",closeOthers:"Close Others",closeAll:"Close All"},users:{users:"Users",localUsersOnly:"Local users only",search:"Search",id:"ID",name:"Name",status:"Status",local:"local",external:"external",deactivated:"deactivated",active:"active",unconfirmed:"unconfirmed",actions:"Actions",activate:"Activate",deactivate:"Deactivate",admin:"admin",moderator:"moderator",moderation:"Moderation",revokeAdmin:"Revoke Admin",grantAdmin:"Grant Admin",revokeModerator:"Revoke Moderator",grantModerator:"Grant Moderator",activateAccount:"Activate Account",activateAccounts:"Activate Accounts",deactivateAccount:"Deactivate Account",deactivateAccounts:"Deactivate Accounts",deleteAccount:"Delete Account",deleteAccounts:"Delete Accounts",forceNsfw:"Force posts to be NSFW",stripMedia:"Force posts to not have media",forceUnlisted:"Force posts to be unlisted",sandbox:"Force posts to be followers-only",disableRemoteSubscription:"Disallow following user from remote instances",disableRemoteSubscriptionForMultiple:"Disallow following users from remote instances",disableAnySubscription:"Disallow following user at all",disableAnySubscriptionForMultiple:"Disallow following users at all",requirePasswordReset:"Require password reset on next login",selectUsers:"Select users to apply actions to multiple users",moderateUser:"Moderate user",moderateUsers:"Moderate multiple users",createAccount:"Create new account",apply:"apply",remove:"remove",grantRightConfirmation:"Are you sure you want to grant {right} rights to all selected users?",revokeRightConfirmation:"Are you sure you want to revoke {right} rights from all selected users?",activateMultipleUsersConfirmation:"Are you sure you want to activate accounts of all selected users?",deactivateMultipleUsersConfirmation:"Are you sure you want to deactivate accounts of all selected users?",deleteMultipleUsersConfirmation:"Are you sure you want to delete accounts of all selected users?",addTagForMultipleUsersConfirmation:"Are you sure you want to apply tag to all selected users?",removeTagFromMultipleUsersConfirmation:"Are you sure you want to remove tag from all selected users?",requirePasswordResetConfirmation:"Are you sure you want to require password reset for all selected users?",confirmAccountsConfirmation:"Are you sure you want to confirm emails for all selected users?",resendEmailConfirmation:"Are you sure you want to resend confirmation email for all selected users?",mailerMustBeEnabled:"To require user's password reset you must enable mailer.",ok:"Okay",completed:"Completed",cancel:"Cancel",canceled:"Canceled",username:"Username",email:"E-mail",password:"Password",create:"Create",submitFormError:"There are invalid values in the form. Please fix them before continuing.",emptyEmailError:"Please input the e-mail",invalidEmailError:"Please input valid e-mail",emptyPasswordError:"Please input the password",emptyNicknameError:"Please input the username",invalidNicknameError:'Username can include "a-z", "A-Z" and "0-9" characters',getPasswordResetToken:"Get password reset token",passwordResetTokenCreated:"Password reset token was created",accountCreated:"New account was created!",unconfirmedEmail:"User didn't confirm the email",confirmAccount:"Confirm account",confirmAccounts:"Confirm accounts",resendConfirmation:"Resend confirmation email"},statuses:{statuses:"Statuses",instanceFilter:"Instance filter",loadMore:"Load more",noInstances:"No other instances found",onlyLocalStatuses:"Show only local statuses",showPrivateStatuses:"Show private statuses",direct:"Direct",private:"Private",public:"Public",unlisted:"Unlisted"},userProfile:{tags:"Tags",moderator:"Moderator",admin:"Admin",local:"local",external:"external",localUppercase:"Local",nickname:"Nickname",recentStatuses:"Recent Statuses",roles:"Roles",activeUppercase:"Active",active:"active",deactivated:"deactivated",noStatuses:"No statuses to show",securitySettings:{email:"Email",password:"Password",securitySettings:"Security settings",passwordChangeWarning1:"Setting a new password will cause the user to be signed out from any client they have used before.",passwordChangeWarning2:"When the user signs in with this password, they will be asked to set a new one.",passwordLengthNotice:"Make sure it's at least {minLength} characters long.",inputNewEmail:"Input new email",inputNewPassword:"Input new password",passwordUpdated:"The password has been updated",emailUpdated:"The email has been updated",success:"Success",submit:"Submit",close:"Close"}},usersFilter:{inputPlaceholder:"Select filter",byUserType:"By user type",local:"Local",external:"External",byStatus:"By status",active:"Active",deactivated:"Deactivated"},reports:{reports:"Reports",report:"Report",reply:"Reply",from:"From",showNotes:"Show notes",newNote:"New note",submit:"Submit",confirmMsg:"Are you sure you want to delete this note?",delete:"Delete",cancel:"Cancel",deleteCompleted:"Delete comleted",deleteCanceled:"Delete canceled",noNotes:"No notes to display",changeState:"Change report's state",changeAllReports:"Change all reports",changeScope:"Change scope",moderateUser:"Moderate user",resolve:"Resolve",reopen:"Reopen",close:"Close",resolveAll:"Resolve all",reopenAll:"Reopen all",closeAll:"Close all",addSensitive:"Add Sensitive flag",removeSensitive:"Remove Sensitive flag",public:"Make status public",private:"Make status private",unlisted:"Make status unlisted",sensitive:"Sensitive",deleteStatus:"Delete status",reportOn:"Report on",reportsOn:"Reports on",id:"ID",account:"Account",actor:"Actor",actors:"Actors",content:"Content",reportedStatus:"Reported status",statusDeleted:"This status has been deleted",leaveNote:"Leave a note",postNote:"Send",deleteNote:"Delete",notFound:"account not found"},reportsFilter:{inputPlaceholder:"Select filter",open:"Open",closed:"Closed",resolved:"Resolved"},moderationLog:{moderationLog:"Moderation Log"},settings:{settings:"Settings",instance:"Instance",upload:"Upload",mailer:"Mailer",logger:"Logger",activityPub:"ActivityPub",auth:"Authentication",autoLinker:"Auto Linker",captcha:"Captcha",frontend:"Frontend",http:"HTTP",mrf:"MRF",mediaProxy:"Media Proxy",metadata:"Metadata",gopher:"Gopher",jobQueue:"Job queue",webPush:"Web push encryption",esshd:"BBS / SSH access",rateLimiters:"Rate limiters",other:"Other",relays:"Relays",follow:"Follow",followRelay:"Follow new relay",instanceUrl:"Instance URL",success:"Settings changed successfully!",description:"Description",removeFromDB:"Remove setting from the DB",successfullyDownloaded:"Successfully downloaded",successfullyImported:"Successfully imported",nowNewPacksToImport:"No new packs to import",successfullyUpdated:"Successfully updated",metadatLowerCase:"metadata",files:"files",successfullyRemoved:"Setting removed successfully!",seeDocs:"See Documentation",assets:"Assets",emoji:"Emoji",markup:"Markup settings",corsPlug:"CORS plug config",instanceReboot:"Reboot Instance",restartApp:"You must restart the instance to apply settings",restartSuccess:"Instance rebooted successfully!"},invites:{inviteTokens:"Invite tokens",createInviteToken:"Generate invite token",pickDate:"Pick a date",maxUse:"Max use",expiresAt:"Expires at",tokenCreated:"Invite token was created",token:"Token",inviteLink:"Invite link",uses:"Uses",used:"Used",cancel:"Cancel",create:"Create",revoke:"Revoke",id:"ID",actions:"Actions",active:"Active",inviteUserViaEmail:"Invite user via email",sendRegistration:"Send registration invite via email",email:"Email",name:"Name",emptyEmailError:"Please input the e-mail",invalidEmailError:"Please input valid e-mail",emailSent:"Invite was sent",submitFormError:"There are invalid values in the form. Please fix them before continuing.",inviteViaEmailAlert:"To send invite via email make sure to enable `invites_enabled` and disable `registrations_open`"},emoji:{emojiPacks:"Emoji packs",reloaded:"Emoji reloaded successfully!",refreshed:"Emoji refreshed successfully!",importEmojiTooltip:"Importing from the filesystem will scan the directories and import those without pack.json but with emoji.txt or without neither",reloadEmoji:"Reload emoji",importPacks:"Import packs from the server filesystem",localPacks:"Local packs",refreshLocalPacks:"Refresh local packs",createLocalPack:"Create a new local pack",remotePacks:"Remote packs",remoteInstanceAddress:"Remote instance address",refreshRemote:"Refresh remote packs",sharePack:"Share pack",required:"required",homepage:"Homepage",description:"Description",packs:"Packs",license:"License",shortcode:"Shortcode",fallbackSrc:"Fallback source",fallbackSrcSha:"Fallback source SHA",saveMetadata:"Save metadata",deletePack:"Delete pack",downloadPack:"Download pack",downloadPackArchive:"Download pack archive",addNewEmoji:"Add new emoji to the pack",manageEmoji:"Manage existing emoji",thisWillDownload:"This will download the",downloadToCurrentInstance:"pack to the current instance under the name",canBeChanged:"can be changed below",willBeUsable:"It will then be usable and shareable from the current instance",downloadAsOptional:"Download as (optional)",downloadSharedPack:"Download shared pack to current instance",downloadSharedPackMobile:"Download pack to instance",optional:"optional",uploadFile:"Upload a file",url:"URL",clickToUpload:"Click to upload",upload:"Upload",customFilename:"Custom filename",customFilenameDesc:"Custom file name (optional)",file:"File",localPack:"Local pack",leaveEmptyShortcode:"leave empty to use the same shortcode",leaveEmptyFilename:"leave empty to use the same filename",update:"Update",remove:"Remove",selectLocalPack:"Select the local pack to copy to",specifyShortcode:"Specify a custom shortcode",specifyFilename:"Specify a custom filename",copy:"Copy",copyToLocalPack:"Copy to local pack"}},l.a),zh:r()({},{route:{dashboard:"首页",introduction:"简述",documentation:"文档",guide:"引导页",permission:"权限测试页",pagePermission:"页面权限",directivePermission:"指令权限",icons:"图标",components:"组件",componentIndex:"介绍",markdown:"Markdown",jsonEditor:"JSON编辑器",dndList:"列表拖拽",splitPane:"Splitpane",avatarUpload:"头像上传",dropzone:"Dropzone",sticky:"Sticky",countTo:"CountTo",componentMixin:"小组件",backToTop:"返回顶部",dragDialog:"拖拽 Dialog",dragSelect:"拖拽 Select",dragKanban:"可拖拽看板",charts:"图表",keyboardChart:"键盘图表",lineChart:"折线图",mixChart:"混合图表",example:"综合实例",nested:"路由嵌套",menu1:"菜单1","menu1-1":"菜单1-1","menu1-2":"菜单1-2","menu1-2-1":"菜单1-2-1","menu1-2-2":"菜单1-2-2","menu1-3":"菜单1-3",menu2:"菜单2",Table:"Table",dynamicTable:"动态Table",dragTable:"拖拽Table",inlineEditTable:"Table内编辑",complexTable:"综合Table",treeTable:"树形表格",customTreeTable:"自定义树表",tab:"Tab",form:"表单",createArticle:"创建文章",editArticle:"编辑文章",articleList:"文章列表",errorPages:"错误页面",page401:"401",page404:"404",errorLog:"错误日志",excel:"Excel",exportExcel:"Export Excel",selectExcel:"Export Selected",uploadExcel:"Upload Excel",zip:"Zip",pdf:"PDF",exportZip:"Export Zip",theme:"换肤",clipboardDemo:"Clipboard",i18n:"国际化",externalLink:"外链"},navbar:{logOut:"退出登录",dashboard:"首页",github:"项目地址",theme:"换肤",size:"布局大小"},login:{title:"系统登录",logIn:"登录",username:"账号",password:"密码",any:"随便填",thirdparty:"第三方登录",thirdpartyTips:"本地不能模拟,请结合自己业务进行模拟!!!"},documentation:{documentation:"文档",github:"Github 地址"},permission:{roles:"你的权限",switchRoles:"切换权限",tips:"在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。"},guide:{description:"引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于",button:"打开引导"},components:{documentation:"文档",dropzoneTips:"由于我司业务有特殊需求,而且要传七牛 所以没用第三方,选择了自己封装。代码非常的简单,具体代码你可以在这里看到 @/components/element-ui/Dropzone",stickyTips:"当页面滚动到预设的位置会吸附在顶部",backToTopTips1:"页面滚动到指定位置会在右下角出现返回顶部按钮",backToTopTips2:"可自定义按钮的样式、show/hide、出现的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素",imageUploadTips:"由于我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。"},table:{dynamicTips1:"固定表头, 按照表头顺序排序",dynamicTips2:"不固定表头, 按照点击顺序排序",dragTips1:"默认顺序",dragTips2:"拖拽后顺序",title:"标题",importance:"重要性",type:"类型",remark:"点评",search:"搜索",add:"添加",export:"导出",reviewer:"审核人",id:"序号",date:"时间",author:"作者",readings:"阅读数",status:"状态",actions:"操作",edit:"编辑",publish:"发布",draft:"草稿",delete:"删除",cancel:"取 消",confirm:"确 定"},errorLog:{tips:"请点击右上角bug小图标",description:"现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。",documentation:"文档介绍"},excel:{export:"导出",selectedExport:"导出已选择项",placeholder:"请输入文件名(默认excel-list)"},zip:{export:"导出",placeholder:"请输入文件名(默认file)"},pdf:{tips:"这里使用 window.print() 来实现下载pdf的功能"},theme:{change:"换肤",documentation:"换肤文档",tips:"Tips: 它区别于 navbar 上的 theme-pick, 是两种不同的换肤方法,各自有不同的应用场景,具体请参考文档。"},tagsView:{refresh:"刷新",close:"关闭",closeOthers:"关闭其它",closeAll:"关闭所有"}},d.a),es:r()({},{route:{dashboard:"Panel de control",introduction:"Introducción",documentation:"Documentación",guide:"Guía",permission:"Permisos",pagePermission:"Permisos de la página",directivePermission:"Permisos de la directiva",icons:"Iconos",components:"Componentes",componentIndex:"Introducción",markdown:"Markdown",jsonEditor:"Editor JSON",dndList:"Lista Dnd",splitPane:"Panel dividido",avatarUpload:"Subir avatar",dropzone:"Subir ficheros",sticky:"Sticky",countTo:"CountTo",componentMixin:"Mixin",backToTop:"Ir arriba",dragDialog:"Drag Dialog",dragSelect:"Drag Select",dragKanban:"Drag Kanban",charts:"Gráficos",keyboardChart:"Keyboard Chart",lineChart:"Gráfico de líneas",mixChart:"Mix Chart",example:"Ejemplo",nested:"Rutas anidadass",menu1:"Menu 1","menu1-1":"Menu 1-1","menu1-2":"Menu 1-2","menu1-2-1":"Menu 1-2-1","menu1-2-2":"Menu 1-2-2","menu1-3":"Menu 1-3",menu2:"Menu 2",Table:"Tabla",dynamicTable:"Tabla dinámica",dragTable:"Arrastrar tabla",inlineEditTable:"Editor",complexTable:"Complex Table",treeTable:"Tree Table",customTreeTable:"Custom TreeTable",tab:"Pestaña",form:"Formulario",createArticle:"Crear artículo",editArticle:"Editar artículo",articleList:"Listado de artículos",errorPages:"Páginas de error",page401:"401",page404:"404",errorLog:"Registro de errores",excel:"Excel",exportExcel:"Exportar a Excel",selectExcel:"Export seleccionado",uploadExcel:"Subir Excel",zip:"Zip",pdf:"PDF",exportZip:"Exportar a Zip",theme:"Tema",clipboardDemo:"Clipboard",i18n:"I18n",externalLink:"Enlace externo"},navbar:{logOut:"Salir",dashboard:"Panel de control",github:"Github",theme:"Tema",size:"Tamaño global"},login:{title:"Formulario de acceso",logIn:"Acceso",username:"Usuario",password:"Contraseña",any:"nada",thirdparty:"Conectar con",thirdpartyTips:"No se puede simular en local, así que combine su propia simulación de negocios. ! !"},documentation:{documentation:"Documentación",github:"Repositorio Github"},permission:{roles:"Tus permisos",switchRoles:"Cambiar permisos",tips:"In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if."},guide:{description:"The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ",button:"Ver guía"},components:{documentation:"Documentación",dropzoneTips:"Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.",stickyTips:"when the page is scrolled to the preset position will be sticky on the top.",backToTopTips1:"When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner",backToTopTips2:"You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally",imageUploadTips:"Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version."},table:{dynamicTips1:"Fixed header, sorted by header order",dynamicTips2:"Not fixed header, sorted by click order",dragTips1:"Orden por defecto",dragTips2:"The after dragging order",title:"Título",importance:"Importancia",type:"Tipo",remark:"Remark",search:"Buscar",add:"Añadir",export:"Exportar",reviewer:"reviewer",id:"ID",date:"Fecha",author:"Autor",readings:"Lector",status:"Estado",actions:"Acciones",edit:"Editar",publish:"Publicar",draft:"Draft",delete:"Eliminar",cancel:"Cancelar",confirm:"Confirmar"},errorLog:{tips:"Please click the bug icon in the upper right corner",description:"Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.",documentation:"Documento de introducción"},excel:{export:"Exportar",selectedExport:"Exportar seleccionados",placeholder:"Por favor escribe un nombre de fichero"},zip:{export:"Exportar",placeholder:"Por favor escribe un nombre de fichero"},pdf:{tips:"Here we use window.print() to implement the feature of downloading pdf."},theme:{change:"Cambiar tema",documentation:"Documentación del tema",tips:"Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details."},tagsView:{refresh:"Actualizar",close:"Cerrar",closeOthers:"Cerrar otros",closeAll:"Cerrar todos"}},m.a),oc:r()({},{route:{dashboard:"Tablèu de bòrd",introduction:"Introduccion",documentation:"Documentacion",guide:"Guida",permission:"Autorizacions",pagePermission:"Pagina d’autorizacion",directivePermission:"Politica d’autorizacion",icons:"Icònas",components:"Compausants",componentIndex:"Introduccion",markdown:"Markdown",jsonEditor:"JSON Editor",dndList:"Dnd List",splitPane:"SplitPane",avatarUpload:"Mandadís d’avatar",dropzone:"Dropzone",sticky:"Sticky",countTo:"CountTo",componentMixin:"Mixin",backToTop:"BackToTop",dragDialog:"Drag Dialog",dragSelect:"Drag Select",dragKanban:"Drag Kanban",charts:"Charts",keyboardChart:"Keyboard Chart",lineChart:"Line Chart",mixChart:"Mix Chart",example:"Exemple",nested:"Rotas imbricadas",menu1:"Menú 1","menu1-1":"Menu 1-1","menu1-2":"Menu 1-2","menu1-2-1":"Menu 1-2-1","menu1-2-2":"Menu 1-2-2","menu1-3":"Menu 1-3",menu2:"Menú 2",Table:"Tablèu",dynamicTable:"Tablèu dinamic",dragTable:"Drag Table",inlineEditTable:"Inline Edit",complexTable:"Tablèu complèx",treeTable:"Arborescéncia",customTreeTable:"Arborescéncia personalizada",tab:"Onglet",form:"Formulari",createArticle:"Crear un article",editArticle:"Modificar l’article",articleList:"Lista d’articles",errorPages:"Paginas d’error",page401:"401",page404:"404",errorLog:"Jornal d’error",excel:"Excel",exportExcel:"Exportacion Excel",selectExcel:"Exportar los seleccionats",uploadExcel:"Importacion Excel",zip:"Zip",pdf:"PDF",exportZip:"Exportacion Zip",theme:"Tèma",clipboardDemo:"Clipboard",i18n:"I18n",externalLink:"Ligams extèrnes",users:"Utilizaires"},navbar:{logOut:"Desconnexion",dashboard:"Tablèu de bòrd",github:"Github",theme:"Tèma",size:"Talha totala"},login:{title:"Formulari de connexion",logIn:"Se connectar",username:"Nom d’’utilizaire",password:"Senhal",any:"qual que siá",thirdparty:"O se connectar amb",thirdpartyTips:"Pòt pas èsser simulat en local, doncas montatz vòstra pròpria simulacion ! ! !"},documentation:{documentation:"Documentacion",github:"Repertòri Github"},permission:{roles:"Vòstres ròtles",switchRoles:"Cambiar de ròtle",tips:"Dins qualques cases es pas de bon far d’utilizar v-permission, coma element d’onglet compausant, el-table-column o d’autres renduts dom asincròns que pòdon pas que foncionar amb un parametratge manual de v-if."},guide:{description:"La pagina de guida es utila pel monde que dintran dins lo projècte pel primièr còp. Podètz presentar en un mot las foncionalitats del projèctes. La demo es fondada sus ",button:"Mostrar la guida"},components:{documentation:"Documentacion",dropzoneTips:"Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.",stickyTips:"when the page is scrolled to the preset position will be sticky on the top.",backToTopTips1:"When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner",backToTopTips2:"You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally",imageUploadTips:"Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version."},table:{dynamicTips1:"Bandièra fixa, triada per òrdre de bandièra",dynamicTips2:"Bandièra pas fixa, triada per òrdre de clic",dragTips1:"L’’òrdre per defaut",dragTips2:"L’’òrdre aprèp lisar-depausar",title:"Títol",importance:"Imp",type:"Tipe",remark:"Remarca",search:"Recercar",add:"Ajustar",export:"Exportar",reviewer:"examinator",id:"ID",date:"Data",author:"Autor",readings:"Lecturas",status:"Estatuts",actions:"Accions",edit:"Modificar",publish:"Publicar",draft:"Ensag",delete:"Suprimir",cancel:"Anullar",confirm:"Confirmar"},errorLog:{tips:"Mercés de clicar l’’icòna del babau amont a man drecha",description:"Ara que lo sistèma de gestion es coma un spa, melhora l’experiéncia dels utilizaire mas aumenta tanben lo risc de problèmas sus la pagina, una pichona negligéncia pòt menar a un blocatge complèt de la pagina. Urosament Vue fornís de manièras per gerir las excepcions, trobar las errors o senhalar las excepcions.",documentation:"Presentacion del document"},excel:{export:"Exportar",selectedExport:"Exportar los elements seleccionats",placeholder:"Mercés de picar lo nom de fichièr (per defaut excel-list)"},zip:{export:"Exportar",placeholder:"Mercés de picar lo nom de fichièr (per defaut file)"},pdf:{tips:"Aquí utilizam window.print() per prepausar lo telecargament de pdf."},theme:{change:"Cambiar lo tèma",documentation:"Documentacion dels tèmas",tips:"Astúcia : es diferent del theme-pick de la barra de navigacion, i a dos metòdes de personalizacion, caduna amb un biais de far diferent. Referiscam a la documentacion per mai de detalhs."},tagsView:{refresh:"Actualizar",close:"Tampar",closeOthers:"Tampar los autres",closeAll:"Los tampar totes"}})},v=new o.a({locale:c.a.get("language")||"en",messages:f});t.a=v},mm8V:function(e,t,n){"use strict";n.d(t,"c",function(){return d}),n.d(t,"h",function(){return m}),n.d(t,"e",function(){return v}),n.d(t,"b",function(){return w}),n.d(t,"f",function(){return y}),n.d(t,"g",function(){return T}),n.d(t,"d",function(){return E}),n.d(t,"i",function(){return _}),n.d(t,"j",function(){return A}),n.d(t,"a",function(){return C});var a=n("o0o1"),r=n.n(a),s=n("yXPU"),o=n.n(s),i=n("t3Un"),c=n("X4fA"),u=n("9i3r"),l=n("LvDl"),p=n.n(l);function d(e,t,n){return h.apply(this,arguments)}function h(){return(h=o()(r.a.mark(function e(t,n,a){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/".concat(a),method:"delete",headers:R(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function m(e,t){return f.apply(this,arguments)}function f(){return(f=o()(r.a.mark(function e(t,n){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/admin/reload_emoji",method:"post",headers:R(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function v(e,t){return g.apply(this,arguments)}function g(){return(g=o()(r.a.mark(function e(t,n){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/import_from_fs",method:"post",headers:R(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function w(e,t,n){return b.apply(this,arguments)}function b(){return(b=o()(r.a.mark(function e(t,n,a){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/".concat(a),method:"put",headers:R(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function y(e){return x.apply(this,arguments)}function x(){return(x=o()(r.a.mark(function e(t){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/",method:"get"});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function T(e,t,n){return k.apply(this,arguments)}function k(){return(k=o()(r.a.mark(function e(t,n,a){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/list_from",method:"post",headers:R(n),data:{instance_address:Object(u.a)(a)}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function E(e,t,n,a,r){return S.apply(this,arguments)}function S(){return(S=o()(r.a.mark(function e(t,n,a,s,o){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return""===s.trim()&&(s=null),e.next=3,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/download_from",method:"post",headers:R(o),data:{instance_address:Object(u.a)(n),pack_name:a,as:s},timeout:0});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function _(e,t,n,a){return O.apply(this,arguments)}function O(){return(O=o()(r.a.mark(function e(t,n,a,s){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/".concat(a,"/update_metadata"),method:"post",headers:R(n),data:{name:a,new_data:s},timeout:0});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function L(e){var t=new FormData;return p.a.each(e,function(e,n){t.set(n,e)}),t}function A(e,t,n){return I.apply(this,arguments)}function I(){return(I=o()(r.a.mark(function e(t,n,a){var s,o,c,l,p,d,h,m,f;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:s=null,e.t0=a.action,e.next="add"===e.t0?4:"update"===e.t0?8:"remove"===e.t0?11:14;break;case 4:return o=a.shortcode,c=a.file,l=a.fileName,s=L({action:"add",shortcode:o,file:c}),""!==l.trim()&&s.set("filename",l),e.abrupt("break",14);case 8:return p=a.oldName,d=a.newName,h=a.newFilename,s=L({action:"update",shortcode:p,new_shortcode:d,new_filename:h}),e.abrupt("break",14);case 11:return m=a.name,s=L({action:"remove",shortcode:m}),e.abrupt("break",14);case 14:return f=a.packName,e.next=17,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/".concat(f,"/update_file"),method:"post",headers:R(n),data:s,timeout:0});case 17:return e.abrupt("return",e.sent);case 18:case"end":return e.stop()}},e)}))).apply(this,arguments)}function C(e,t,n){return"".concat(Object(u.a)(e),"/emoji/").concat(t,"/").concat(n)}var R=function(e){return e?{Authorization:"Bearer ".concat(Object(c.b)())}:{}}},nZHn:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-icon",use:"icon-icon-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},oUrx:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-404",use:"icon-404-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},qkZ8:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-edit",use:"icon-edit-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},qwAt:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-lock",use:"icon-lock-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},s7Vf:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});o.a.add(i);t.default=i},"sg+I":function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"180px"}},t3Un:function(e,t,n){"use strict";var a=n("vDqi"),r=n.n(a),s=n("XJYT"),o=r.a.create({timeout:6e4});o.interceptors.response.use(function(e){return e},function(e){var t;if(console.log("Error ".concat(e)),e.response){var n=e.response.data.error?e.response.data.error:e.response.data;t=e.response.headers["content-type"].includes("application/json")?"".concat(e.message," - ").concat(n):"".concat(e.message)}else t=e;return Object(s.Message)({message:t,type:"error",duration:5e3}),Promise.reject(e)}),t.a=o},vDVG:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-clipboard",use:"icon-clipboard-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},y7eQ:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-email",use:"icon-email-usage",viewBox:"0 0 128 96",content:''});o.a.add(i);t.default=i},yCkv:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-chart",use:"icon-chart-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},zT9a:function(e,t,n){"use strict";var a={name:"SvgIcon",props:{iconClass:{type:String,required:!0},className:{type:String,default:""}},computed:{iconName:function(){return"#icon-".concat(this.iconClass)},svgClass:function(){return this.className?"svg-icon "+this.className:"svg-icon"}}},r=(n("mDMp"),n("KHd+")),s=Object(r.a)(a,function(){var e=this.$createElement,t=this._self._c||e;return t("svg",this._g({class:this.svgClass,attrs:{"aria-hidden":"true"}},this.$listeners),[t("use",{attrs:{"xlink:href":this.iconName}})])},[],!1,null,"17178ffc",null);s.options.__file="index.vue";t.a=s.exports},zx4i:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"180px"}}},[["Vtdi","runtime","chunk-elementUI","chunk-libs"]]]); -//# sourceMappingURL=app.203f69f8.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/app.203f69f8.js.map b/priv/static/adminfe/static/js/app.203f69f8.js.map deleted file mode 100644 index eb78cd464..000000000 --- a/priv/static/adminfe/static/js/app.203f69f8.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/icons/svg/pdf.svg","webpack:///./src/icons/svg/people.svg","webpack:///./src/icons/svg/eye-open.svg","webpack:///./src/components/element-ui/Hamburger/index.vue?8f92","webpack:///./src/icons/svg/exit-fullscreen.svg","webpack:///./src/icons/svg/nested.svg","webpack:///./src/icons/svg/theme.svg","webpack:///./src/icons/svg/form.svg","webpack:///./src/icons/svg/dashboard.svg","webpack:///./src/api/utils.js","webpack:///./src/icons/svg/shopping.svg","webpack:///./src/icons/svg/bug.svg","webpack:///./src/icons/svg/international.svg","webpack:///./src/icons/svg/qq.svg","webpack:///./src/icons/svg/link.svg","webpack:///./src/components/element-ui/ScrollPane/index.vue?8407","webpack:///./src/views/layout/components/TagsView.vue?6ab0","webpack:///./src/icons/svg/guide 2.svg","webpack:///./src/icons/svg/language.svg","webpack:///./src/icons/svg/password.svg","webpack:///./src/icons/svg/peoples.svg","webpack:///./src/icons/svg/money.svg","webpack:///./src/icons/svg/example.svg","webpack:///./src/icons/svg/list.svg","webpack:///./src/icons/svg/settings.svg","webpack:///./src/icons/svg/message.svg","webpack:///./src/icons/svg/table.svg","webpack:///./src/views/layout/Layout.vue?d1f6","webpack:///./src/icons/svg/eye.svg","webpack:///./src/icons/svg sync nonrecursive \\.svg$","webpack:///./src/icons/svg/component.svg","webpack:///./src/App.vue?9edb","webpack:///src/App.vue","webpack:///./src/App.vue","webpack:///./src/App.vue?1e50","webpack:///./src/api/app.js","webpack:///./src/store/modules/app.js","webpack:///./src/store/modules/errorLog.js","webpack:///./src/api/moderationLog.js","webpack:///./src/store/modules/moderationLog.js","webpack:///./src/api/invites.js","webpack:///./src/store/modules/invites.js","webpack:///./src/api/peers.js","webpack:///./src/store/modules/peers.js","webpack:///./src/components/element-ui/Hamburger/index.vue?1751","webpack:///src/components/element-ui/Hamburger/index.vue","webpack:///./src/components/element-ui/Hamburger/index.vue","webpack:///./src/components/element-ui/Hamburger/index.vue?78c1","webpack:///./src/views/layout/components/Navbar.vue?138b","webpack:///src/views/layout/components/Navbar.vue","webpack:///./src/views/layout/components/Navbar.vue","webpack:///./src/views/layout/components/Navbar.vue?b672","webpack:///./src/utils/i18n.js","webpack:///./src/utils/index.js","webpack:///src/views/layout/components/Sidebar/Item.vue","webpack:///./src/views/layout/components/Sidebar/Item.vue?425b","webpack:///./src/views/layout/components/Sidebar/Item.vue","webpack:///./src/views/layout/components/Sidebar/Link.vue?a99f","webpack:///src/views/layout/components/Sidebar/Link.vue","webpack:///./src/views/layout/components/Sidebar/Link.vue","webpack:///./src/views/layout/components/Sidebar/Link.vue?d88c","webpack:///./src/views/layout/components/Sidebar/SidebarItem.vue?f0b2","webpack:///src/views/layout/components/Sidebar/SidebarItem.vue","webpack:///./src/views/layout/components/Sidebar/FixiOSBug.js","webpack:///./src/views/layout/components/Sidebar/SidebarItem.vue","webpack:///./src/views/layout/components/Sidebar/SidebarItem.vue?4829","webpack:///./src/views/layout/components/Sidebar/index.vue?3b50","webpack:///src/views/layout/components/Sidebar/index.vue","webpack:///./src/views/layout/components/Sidebar/index.vue","webpack:///./src/views/layout/components/Sidebar/index.vue?29d8","webpack:///./src/components/element-ui/ScrollPane/index.vue?a39e","webpack:///src/components/element-ui/ScrollPane/index.vue","webpack:///./src/components/element-ui/ScrollPane/index.vue","webpack:///./src/components/element-ui/ScrollPane/index.vue?7344","webpack:///./src/views/layout/components/TagsView.vue?f016","webpack:///src/views/layout/components/TagsView.vue","webpack:///./src/views/layout/components/TagsView.vue","webpack:///./src/views/layout/components/TagsView.vue?d863","webpack:///./src/views/layout/components/AppMain.vue?4460","webpack:///src/views/layout/components/AppMain.vue","webpack:///./src/views/layout/components/AppMain.vue","webpack:///./src/views/layout/components/AppMain.vue?367b","webpack:///./src/views/layout/mixin/ResizeHandler.js","webpack:///./src/views/layout/Layout.vue?de6d","webpack:///src/views/layout/Layout.vue","webpack:///./src/views/layout/Layout.vue","webpack:///./src/views/layout/Layout.vue?9516","webpack:///./src/router/index.js","webpack:///./src/store/modules/permission.js","webpack:///./src/api/relays.js","webpack:///./src/store/modules/relays.js","webpack:///./src/api/reports.js","webpack:///./src/store/modules/reports.js","webpack:///./src/api/settings.js","webpack:///./src/store/modules/settings.js","webpack:///./src/api/status.js","webpack:///./src/store/modules/status.js","webpack:///./src/store/modules/tagsView.js","webpack:///./src/api/login.js","webpack:///./src/api/nodeInfo.js","webpack:///./src/store/modules/user.js","webpack:///./src/api/users.js","webpack:///./src/store/modules/userProfile.js","webpack:///./src/store/modules/users.js","webpack:///./src/store/getters.js","webpack:///./src/store/modules/emojiPacks.js","webpack:///./src/store/index.js","webpack:///./src/icons/index.js","webpack:///./src/errorLog.js","webpack:///./src/permission.js","webpack:///./src/filters/index.js","webpack:///./src/main.js","webpack:///./src/utils/auth.js","webpack:///./src/views/layout/components/TagsView.vue?da45","webpack:///./src/views/layout/components/AppMain.vue?2c3a","webpack:///./src/icons/svg/excel.svg","webpack:///./src/icons/svg/guide.svg","webpack:///./src/icons/svg/star.svg","webpack:///./src/views/layout/components/Navbar.vue?a40e","webpack:///./src/icons/svg/wechat.svg","webpack:///./src/store/modules/normalizers.js","webpack:///./src/icons/svg/size.svg","webpack:///./src/icons/svg/zip.svg","webpack:///./src/icons/svg/tab.svg","webpack:///./src/icons/svg/search.svg","webpack:///./src/icons/svg/tree.svg","webpack:///./src/icons/svg/documentation.svg","webpack:///./src/icons/svg/drag.svg","webpack:///./src/components/element-ui/SvgIcon/index.vue?928c","webpack:///./src/icons/svg/fullscreen.svg","webpack:///./src/lang/index.js","webpack:///./src/lang/en.js","webpack:///./src/lang/zh.js","webpack:///./src/lang/es.js","webpack:///./src/lang/oc.js","webpack:///./src/api/emojiPacks.js","webpack:///./src/icons/svg/icon.svg","webpack:///./src/icons/svg/404.svg","webpack:///./src/icons/svg/edit.svg","webpack:///./src/icons/svg/lock.svg","webpack:///./src/icons/svg/user.svg","webpack:///./src/styles/index.scss","webpack:///./src/utils/request.js","webpack:///./src/icons/svg/clipboard.svg","webpack:///./src/icons/svg/email.svg","webpack:///./src/icons/svg/chart.svg","webpack:///./src/components/element-ui/SvgIcon/index.vue?8767","webpack:///./src/components/element-ui/SvgIcon/index.vue?c01f","webpack:///src/components/element-ui/SvgIcon/index.vue","webpack:///./src/components/element-ui/SvgIcon/index.vue","webpack:///./src/styles/variables.scss"],"names":["__webpack_require__","r","__webpack_exports__","svg_baker_runtime_browser_symbol__WEBPACK_IMPORTED_MODULE_0__","svg_baker_runtime_browser_symbol__WEBPACK_IMPORTED_MODULE_0___default","n","svg_sprite_loader_runtime_browser_sprite_build__WEBPACK_IMPORTED_MODULE_1__","svg_sprite_loader_runtime_browser_sprite_build__WEBPACK_IMPORTED_MODULE_1___default","symbol","a","id","use","viewBox","content","add","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_69c6c5c4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","d","baseName","instanceName","arguments","length","undefined","match","startsWith","isLocalhost","concat","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_591d6778_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_TagsView_vue_vue_type_style_index_0_id_e1cdb714_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Layout_vue_vue_type_style_index_0_id_767d264f_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","map","./404.svg","./bug.svg","./chart.svg","./clipboard.svg","./component.svg","./dashboard.svg","./documentation.svg","./drag.svg","./edit.svg","./email.svg","./example.svg","./excel.svg","./exit-fullscreen.svg","./eye-open.svg","./eye.svg","./form.svg","./fullscreen.svg","./guide 2.svg","./guide.svg","./icon.svg","./international.svg","./language.svg","./link.svg","./list.svg","./lock.svg","./message.svg","./money.svg","./nested.svg","./password.svg","./pdf.svg","./people.svg","./peoples.svg","./qq.svg","./search.svg","./settings.svg","./shopping.svg","./size.svg","./star.svg","./tab.svg","./table.svg","./theme.svg","./tree.svg","./user.svg","./wechat.svg","./zip.svg","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","Object","resolve","module","exports","src_Appvue_type_script_lang_js_","name","component","componentNormalizer","_h","this","$createElement","_c","_self","attrs","options","__file","App","needReboot","_x","_x2","_needReboot","apply","_callee","authHost","token","regenerator_default","wrap","_context","prev","next","request","baseURL","url","method","headers","authHeaders","abrupt","sent","stop","restartApp","_x3","_x4","_restartApp","_callee2","_context2","Authorization","getToken","app","state","sidebar","opened","Cookies","get","withoutAnimation","device","language","size","invitesEnabled","mutations","TOGGLE_SIDEBAR","set","CLOSE_SIDEBAR","TOGGLE_DEVICE","SET_INVITES_ENABLED","SET_LANGUAGE","TOGGLE_REBOOT","SET_SIZE","actions","closeSideBar","_ref","_ref2","commit","NeedReboot","_NeedReboot","asyncToGenerator_default","mark","_ref3","getters","response","data","RestartApplication","_RestartApplication","_ref4","SetInvitesEnabled","_ref5","setLanguage","_ref6","setSize","_ref7","toggleDevice","_ref8","toggleSideBar","_ref9","errorLog","logs","ADD_ERROR_LOG","log","push","addErrorLog","fetchLog","_fetchLog","params","page","normalizedParams","_args","URLSearchParams","_","omitBy","objectSpread_default","isUndefined","toString","fetchAdmins","_x5","_fetchAdmins","fetchModerators","_x6","_x7","_fetchModerators","_callee3","_context3","moderationLog","fetchedLog","logItemsCount","admins","moderators","logLoading","adminsLoading","SET_LOG_LOADING","status","SET_ADMINS_LOADING","SET_MODERATION_LOG","SET_MODERATION_LOG_COUNT","count","SET_ADMINS","SET_MODERATORS","FetchModerationLog","_FetchModerationLog","opts","items","total","FetchAdmins","_FetchAdmins","adminsResponse","moderatorsResponse","generateInviteToken","_generateInviteToken","max_use","expires_at","inviteViaEmail","_x8","_inviteViaEmail","email","listInviteTokens","_x9","_x10","_listInviteTokens","revokeToken","_x11","_x12","_x13","_revokeToken","_callee4","tokenToRevoke","_context4","invites","inviteTokens","loading","newToken","SET_LOADING","SET_NEW_TOKEN","SET_TOKENS","tokens","FetchInviteTokens","_FetchInviteTokens","reverse","GenerateInviteToken","_GenerateInviteToken","dispatch","maxUse","expiresAt","t0","InviteUserViaEmail","_InviteUserViaEmail","Message","message","i18n","t","type","duration","RemoveNewToken","RevokeToken","_RevokeToken","fetchPeers","_fetchPeers","peers","fetchedPeers","SET_PEERS","FetchPeers","_FetchPeers","toConsumableArray_default","sort","element_ui_Hamburgervue_type_script_lang_js_","props","isActive","Boolean","default","toggleClick","Function","Hamburger_component","staticStyle","padding","on","click","staticClass","class","is-active","xmlns","width","height","components_Navbarvue_type_script_lang_js_","components","Hamburger","computed","vuex_esm","methods","$store","logout","then","location","reload","Navbar_component","_vm","toggle-click","_v","trigger","src","avatar","slot","display","_s","$t","Navbar","generateTitle","title","$te","parseTime","time","cFormat","date","format","typeof_default","test","parseInt","Date","formatObj","y","getFullYear","m","getMonth","getDate","h","getHours","i","getMinutes","s","getSeconds","getDay","replace","result","key","value","formatTime","option","diff","now","Math","ceil","isExternal","path","Sidebar_Itemvue_type_script_lang_js_","functional","icon","String","render","context","_context$props","vnodes","icon-class","Item_component","Item_render","Item_staticRenderFns","Item","Sidebar_Linkvue_type_script_lang_js_","to","required","linkProps","is","href","target","rel","Link_component","_b","_t","Sidebar_SidebarItemvue_type_script_lang_js_","AppLink","mixins","mounted","fixBugIniOS","_this","$subMenu","$refs","subMenu","handleMouseleave","item","isNest","basePath","onlyOneChild","hasOneShowingChild","children","parent","showingChildren","filter","hidden","noShowingChildren","resolvePath","routePath","isExternalLink","path_browserify_default","SidebarItem_component","alwaysShow","ref","index","meta","_e","_l","child","is-nest","base-path","submenu-title-noDropdown","SidebarItem","components_Sidebarvue_type_script_lang_js_","variables","variables_default","isCollapse","Sidebar_component","wrap-class","default-active","$route","collapse","background-color","menuBg","text-color","menuText","active-text-color","menuActiveText","mode","route","Sidebar","element_ui_ScrollPanevue_type_script_lang_js_","left","handleScroll","eventDelta","wheelDelta","deltaY","$scrollWrapper","scrollContainer","scrollLeft","moveToTarget","currentTag","$containerWidth","$el","offsetWidth","tagList","$parent","tag","firstTag","lastTag","scrollWidth","currentIndex","findIndex","prevTag","nextTag","afterNextTagOffsetLeft","offsetLeft","beforePrevTagOffsetLeft","ScrollPane_component","vertical","nativeOn","wheel","$event","preventDefault","components_TagsViewvue_type_script_lang_js_","ScrollPane","visible","top","selectedTag","affixTags","visitedViews","tagsView","routers","permission","watch","addTags","moveToCurrentTag","document","body","addEventListener","closeMenu","removeEventListener","initTags","filterAffixTags","routes","tags","forEach","affix","tempTags","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","done","err","return","_this2","$nextTick","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","scrollPane","fullPath","refreshSelectedTag","view","_this3","$router","closeSelectedTag","_this4","toLastView","closeOthersTags","_this5","closeAllTags","_this6","some","latestView","slice","openMenu","getBoundingClientRect","maxLeft","clientX","clientY","TagsView_component","refInFor","query","mouseup","button","contextmenu","stopPropagation","directives","rawName","expression","style","TagsView","components_AppMainvue_type_script_lang_js_","cachedViews","AppMain_component","include","AppMain","layout_Layoutvue_type_script_lang_js_","store","beforeMount","window","resizeHandler","isMobile","isTablet","rect","classObj","hideSidebar","openSidebar","mobile","handleClickOutside","Layout_component","Layout","Vue","Router","disabledFeatures","process","settingsDisabled","includes","settings","Promise","all","bind","noCache","statusesDisabled","statuses","reportsDisabled","reports","invitesDisabled","emojiPacksDisabled","emojiPacks","moderationLogDisabled","constantRouterMap","redirect","router","scrollBehavior","asyncRouterMap","addRouters","SET_ROUTERS","GenerateRoutes","accessedRouters","roles","filterAsyncRouter","res","tmp","role","hasPermission","fetchRelays","_fetchRelays","addRelay","_addRelay","relay","relay_url","deleteRelay","_deleteRelay","relays","fetchedRelays","SET_RELAYS","ADD_RELAY","DELETE_RELAY","fetchedRelay","FetchRelays","_FetchRelays","AddRelay","_AddRelay","finish","DeleteRelay","_DeleteRelay","changeState","_changeState","fetchReports","_fetchReports","pageSize","reportID","noteID","fetchedReports","totalReportsCount","currentPage","stateFilter","SET_LAST_REPORT_ID","idOfLastReport","SET_PAGE","SET_REPORTS","SET_REPORTS_COUNT","SET_REPORTS_FILTER","ChangeReportState","_ChangeReportState","reportsData","updatedReports","report","ClearFetchedReports","FetchReports","_FetchReports","SetFilter","CreateReportNote","rootState","_createNote","createNote","optimisticNote","user","display_name","acct","created_at","getTime","notes","DeleteReportNote","_ref10","_x14","_x15","_x16","_deleteNote","deleteNote","note","fetchDescription","_fetchDescription","fetchSettings","_fetchSettings","updateSettings","_updateSettings","configs","removeSettings","_removeSettings","activeTab","configDisabled","db","description","searchData","updatedSettings","CLEAR_UPDATED_SETTINGS","REMOVE_SETTING_FROM_UPDATED","group","subkeys","_state$updatedSetting","objectWithoutProperties_default","_toPropertyKey","SET_ACTIVE_TAB","tab","SET_DESCRIPTION","SET_SEARCH","searchObject","SET_SETTINGS","newSettings","reduce","acc","parsedValue","valueHasTuples","parseNonTuples","parseTuples","defineProperty_default","newDbSettings","TOGGLE_TABS","UPDATE_SETTINGS","input","updatedSetting","UPDATE_STATE","updatedState","FetchSettings","_FetchSettings","_ref12","formSearchObject","RemoveSetting","_RemoveSetting","_ref13","_configs$","need_reboot","SetActiveTab","_ref14","SubmitChanges","_SubmitChanges","_ref15","updatedData","checkPartialUpdate","wrapUpdatedSettings","UpdateSettings","_ref16","_ref17","UpdateState","_UpdateState","_ref18","_ref19","deletedKey","el","delete","changeStatusScope","_changeStatusScope","sensitive","visibility","deleteStatus","_deleteStatus","fetchStatuses","_fetchStatuses","godmode","localOnly","fetchStatusesCount","_fetchStatusesCount","fetchStatusesByInstance","_fetchStatusesByInstance","_callee5","instance","_context5","fetchedStatuses","statusesByInstance","selectedInstance","showLocal","showPrivate","buttonLoading","allLoaded","statusVisibility","CHANGE_GODMODE_CHECKBOX_VALUE","CHANGE_LOCAL_CHECKBOX_VALUE","CHANGE_PAGE","CHANGE_SELECTED_INSTANCE","SET_STATUSES_BY_INSTANCE","PUSH_STATUSES","SET_ALL_LOADED","SET_BUTTON_LOADING","SET_STATUS_VISIBILITY","ChangeStatusScope","_ChangeStatusScope","statusId","isSensitive","reportCurrentPage","userId","DeleteStatus","_DeleteStatus","FetchStatusesCount","_FetchStatusesCount","status_visibility","FetchStatusesByInstance","_FetchStatusesByInstance","FetchStatusesPageByInstance","_FetchStatusesPageByInstance","HandleGodmodeCheckboxChange","HandleLocalCheckboxChange","HandleFilterChange","_ref11","HandlePageChange","ADD_VISITED_VIEW","v","assign","ADD_CACHED_VIEW","DEL_VISITED_VIEW","entries","_step$value","slicedToArray_default","splice","DEL_CACHED_VIEW","indexOf","DEL_OTHERS_VISITED_VIEWS","DEL_OTHERS_CACHED_VIEWS","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","DEL_ALL_VISITED_VIEWS","DEL_ALL_CACHED_VIEWS","UPDATE_VISITED_VIEW","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","addView","addVisitedView","addCachedView","delView","delVisitedView","delCachedView","delOthersViews","delOthersVisitedViews","delOthersCachedViews","delAllViews","delAllVisitedViews","delAllCachedViews","updateVisitedView","loginByUsername","_loginByUsername","username","password","appsRequest","client_name","random","redirect_uris","origin","scopes","client_id","client_secret","grant_type","getUserInfo","getNodeInfo","_getNodeInfo","getAuthHost","introduction","setting","articlePlatform","nodeInfo","SET_CODE","SET_TOKEN","SET_INTRODUCTION","SET_SETTING","SET_STATUS","SET_NAME","SET_AVATAR","SET_ROLES","SET_ID","SET_AUTH_HOST","SET_NODE_INFO","LoginByUsername","reject","access_token","setToken","setAuthHost","catch","error","GetNodeInfo","_GetNodeInfo","metadata","GetUserInfo","pleroma","is_admin","LogOut","removeToken","removeAuthHost","FedLogOut","LoginByPleromaFE","_LoginByPleromaFE","host","activateUsers","_activateUsers","nicknames","addRight","_addRight","right","createNewAccount","_createNewAccount","nickname","users","deactivateUsers","_deactivateUsers","deleteRight","_x17","_x18","_x19","_deleteRight","deleteUsers","_x20","_x21","_x22","_deleteUsers","_callee6","_context6","fetchUser","_x23","_x24","_x25","_fetchUser","_callee7","_context7","fetchUserCredentials","_x26","_x27","_x28","_fetchUserCredentials","_callee8","_context8","updateUserCredentials","_x29","_x30","_x31","_x32","_updateUserCredentials","_callee9","credentials","_context9","fetchUsers","_x33","_x34","_x35","_fetchUsers","_callee10","filters","_args10","_context10","getPasswordResetToken","_x36","_x37","_x38","_getPasswordResetToken","_callee11","_context11","forcePasswordReset","_x39","_x40","_x41","_forcePasswordReset","_callee12","_context12","searchUsers","_x42","_x43","_x44","_x45","_searchUsers","_callee13","_args13","_context13","tagUser","_x46","_x47","_x48","_x49","_tagUser","_callee14","_context14","untagUser","_x50","_x51","_x52","_x53","_untagUser","_callee15","_context15","fetchUserStatuses","_x54","_x55","_x56","_x57","_fetchUserStatuses","_callee16","_context16","confirmUserEmail","_x58","_x59","_x60","_confirmUserEmail","_callee17","_context17","resendConfirmationEmail","_x61","_x62","_x63","_resendConfirmationEmail","_callee18","_context18","userProfile","statusesLoading","userCredentials","userProfileLoading","SET_STATUSES","SET_STATUSES_LOADING","SET_USER","SET_USER_PROFILE_LOADING","SET_USER_CREDENTIALS","FetchUserProfile","_FetchUserProfile","userResponse","FetchUserStatuses","_FetchUserStatuses","FetchUserCredentials","_FetchUserCredentials","UpdateUserCredentials","_UpdateUserCredentials","fetchedUsers","searchQuery","totalUsersCount","local","external","active","deactivated","passwordResetToken","link","SET_USERS","SWAP_USERS","usersWithoutSwapped","u","b","localeCompare","SET_COUNT","SET_PAGE_SIZE","SET_PASSWORD_RESET_TOKEN","SET_SEARCH_QUERY","SET_USERS_FILTERS","SET_USER_PROFILE","ActivateUsers","_ActivateUsers","_userId","updatedUsers","callApiFn","ApplyChanges","_ApplyChanges","AddRight","_AddRight","AddTag","_AddTag","ClearFilters","_ClearFilters","CreateNewAccount","_CreateNewAccount","DeactivateUsers","_DeactivateUsers","ConfirmUsersEmail","_ConfirmUsersEmail","_ref20","confirmation_pending","_ref21","ResendConfirmationEmail","_ResendConfirmationEmail","_ref22","usersNicknames","DeleteRight","_DeleteRight","_ref23","_ref24","_ref25","DeleteUsers","_DeleteUsers","_ref26","_ref27","deletedUsersIds","deletedUser","FetchUsers","_FetchUsers","_ref28","_ref29","join","loadUsers","GetPasswordResetToken","_GetPasswordResetToken","_callee19","_ref30","_ref31","_context19","RemovePasswordToken","_ref32","RemoveTag","_RemoveTag","_callee21","_ref33","_ref34","_context21","userTag","_ref35","_callee20","_context20","RequirePasswordReset","_RequirePasswordReset","_callee22","_ref36","_context22","SearchUsers","_SearchUsers","_callee23","_ref37","_ref38","_context23","SuccessMessage","success","ToggleUsersFilter","_ToggleUsersFilter","_callee24","_ref39","defaultFilters","currentFilters","_context24","_ref40","page_size","permission_routers","errorLogs","packs","activeCollapseItems","localPacks","remoteInstance","remotePacks","SET_ACTIVE_COLLAPSE_ITEMS","SET_LOCAL_PACKS","SET_REMOTE_INSTANCE","SET_REMOTE_PACKS","UPDATE_LOCAL_PACK_VAL","UPDATE_LOCAL_PACK_PACK","pack","UPDATE_LOCAL_PACK_FILES","files","CreatePack","_CreatePack","createPack","DeletePack","_DeletePack","deletePack","DownloadFrom","_DownloadFrom","instanceAddress","packName","as","downloadFrom","ImportFromFS","_ImportFromFS","importFromFS","ReloadEmoji","_ReloadEmoji","reloadEmoji","SavePackMetadata","_SavePackMetadata","savePackMetadata","SetActiveCollapseItems","activeItems","SetLocalEmojiPacks","_SetLocalEmojiPacks","listPacks","SetRemoteEmojiPacks","_SetRemoteEmojiPacks","listRemotePacks","UpdateAndSavePackFile","_UpdateAndSavePackFile","args","updatePackFile","UpdateLocalPackVal","_UpdateLocalPackVal","Vuex","Store","modules","SvgIcon","requireContext","requireAll","require","config","errorHandler","vm","info","nextTick","console","NProgress","configure","showSpinner","whiteList","pluralize","label","timeAgo","between","Number","numberFormatter","num","digits","si","toFixed","toThousandFilter","beforeEach","from","start","addRoutes","dangerouslyUseHTMLString","permissionRoles","noGoBack","afterEach","Element","productionTip","js_cookie__WEBPACK_IMPORTED_MODULE_0__","js_cookie__WEBPACK_IMPORTED_MODULE_0___default","TokenKey","AuthHostKey","remove","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_TagsView_vue_vue_type_style_index_1_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_AppMain_vue_vue_type_style_index_0_id_f852c4f2_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Navbar_vue_vue_type_style_index_0_id_28de7ff2_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","partialUpdate","updated","settingName","find","element","getCurrentValue","_path","_babel_runtime_helpers_toArray__WEBPACK_IMPORTED_MODULE_5___default","firstSettingName","restKeys","firstSegment","secondSegment","_keys","rest","_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_1___default","tuple","tuples","accum","Array","isArray","mascot","_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default","_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default","_babel_runtime_helpers_objectSpread__WEBPACK_IMPORTED_MODULE_3___default","regex","parseProxyUrl","parseObject","object","_value$tuple","_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4___default","socks5","port","_value$split","split","_value$split2","processNested","valueForState","valueForUpdatedSettings","parentKey","parents","_parents","_parents$","otherParents","updatedValueForState","valueExists","updatedValueForUpdatedSettings","_path2","_keys2","valueIsArrayOfNonObjects","every","currentState","_value","updatedArray","getValueWithoutKey","wrapValues","_settings$setting","mapValue","mapCurrentState","values","ip","searchArray","compact","toLowerCase","resultObject","groupKey","groupLabel","search","updatedAcc","parseNestedSettings","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_17178ffc_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","VueI18n","messages","en","dashboard","documentation","guide","pagePermission","directivePermission","icons","componentIndex","markdown","jsonEditor","dndList","splitPane","avatarUpload","dropzone","sticky","countTo","componentMixin","backToTop","dragDialog","dragSelect","dragKanban","charts","keyboardChart","lineChart","mixChart","example","nested","menu1","menu1-1","menu1-2","menu1-2-1","menu1-2-2","menu1-3","menu2","Table","dynamicTable","dragTable","inlineEditTable","complexTable","treeTable","customTreeTable","form","createArticle","editArticle","articleList","errorPages","page401","page404","excel","exportExcel","selectExcel","uploadExcel","zip","pdf","exportZip","theme","clipboardDemo","externalLink","emoji-packs","navbar","logOut","github","login","logIn","logInViaPleromaFE","omitHostname","errorMessage","any","thirdparty","pleromaFELoginFailed","pleromaFELoginSucceed","switchRoles","tips","dropzoneTips","stickyTips","backToTopTips1","backToTopTips2","imageUploadTips","table","dynamicTips1","dynamicTips2","dragTips1","dragTips2","importance","remark","export","reviewer","author","readings","edit","publish","draft","cancel","confirm","selectedExport","placeholder","change","refresh","close","closeOthers","closeAll","localUsersOnly","unconfirmed","activate","deactivate","admin","moderator","moderation","revokeAdmin","grantAdmin","revokeModerator","grantModerator","activateAccount","activateAccounts","deactivateAccount","deactivateAccounts","deleteAccount","deleteAccounts","forceNsfw","stripMedia","forceUnlisted","sandbox","disableRemoteSubscription","disableRemoteSubscriptionForMultiple","disableAnySubscription","disableAnySubscriptionForMultiple","requirePasswordReset","selectUsers","moderateUser","moderateUsers","createAccount","grantRightConfirmation","revokeRightConfirmation","activateMultipleUsersConfirmation","deactivateMultipleUsersConfirmation","deleteMultipleUsersConfirmation","addTagForMultipleUsersConfirmation","removeTagFromMultipleUsersConfirmation","requirePasswordResetConfirmation","confirmAccountsConfirmation","resendEmailConfirmation","mailerMustBeEnabled","ok","completed","canceled","create","submitFormError","emptyEmailError","invalidEmailError","emptyPasswordError","emptyNicknameError","invalidNicknameError","passwordResetTokenCreated","accountCreated","unconfirmedEmail","confirmAccount","confirmAccounts","resendConfirmation","instanceFilter","loadMore","noInstances","onlyLocalStatuses","showPrivateStatuses","direct","private","public","unlisted","localUppercase","recentStatuses","activeUppercase","noStatuses","securitySettings","passwordChangeWarning1","passwordChangeWarning2","passwordLengthNotice","inputNewEmail","inputNewPassword","passwordUpdated","emailUpdated","submit","usersFilter","inputPlaceholder","byUserType","byStatus","reply","showNotes","newNote","confirmMsg","deleteCompleted","deleteCanceled","noNotes","changeAllReports","changeScope","reopen","resolveAll","reopenAll","addSensitive","removeSensitive","reportOn","reportsOn","account","actor","actors","reportedStatus","statusDeleted","leaveNote","postNote","notFound","reportsFilter","open","closed","resolved","upload","mailer","logger","activityPub","auth","autoLinker","captcha","frontend","http","mrf","mediaProxy","gopher","jobQueue","webPush","esshd","rateLimiters","other","follow","followRelay","instanceUrl","removeFromDB","successfullyDownloaded","successfullyImported","nowNewPacksToImport","successfullyUpdated","metadatLowerCase","successfullyRemoved","seeDocs","assets","emoji","markup","corsPlug","instanceReboot","restartSuccess","createInviteToken","pickDate","tokenCreated","inviteLink","uses","used","revoke","inviteUserViaEmail","sendRegistration","emailSent","inviteViaEmailAlert","reloaded","refreshed","importEmojiTooltip","importPacks","refreshLocalPacks","createLocalPack","remoteInstanceAddress","refreshRemote","sharePack","homepage","license","shortcode","fallbackSrc","fallbackSrcSha","saveMetadata","downloadPack","downloadPackArchive","addNewEmoji","manageEmoji","thisWillDownload","downloadToCurrentInstance","canBeChanged","willBeUsable","downloadAsOptional","downloadSharedPack","downloadSharedPackMobile","optional","uploadFile","clickToUpload","customFilename","customFilenameDesc","file","localPack","leaveEmptyShortcode","leaveEmptyFilename","update","selectLocalPack","specifyShortcode","specifyFilename","copy","copyToLocalPack","elementEnLocale","zh","thirdpartyTips","elementZhLocale","es","elementEsLocale","oc","locale","_deletePack","_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default","_reloadEmoji","_importFromFS","_createPack","_listPacks","_listRemotePacks","instance_address","_downloadFrom","pack_name","trim","timeout","_savePackMetadata","new_data","fileUpdateFormData","FormData","each","k","_updatePackFile","fileName","oldName","newName","newFilename","action","new_shortcode","new_filename","addressOfEmojiInPack","subMenuActiveText","menuHover","subMenuBg","subMenuHover","sideBarWidth","axios__WEBPACK_IMPORTED_MODULE_0__","axios__WEBPACK_IMPORTED_MODULE_0___default","element_ui__WEBPACK_IMPORTED_MODULE_1__","service","axios","interceptors","edata","element_ui_SvgIconvue_type_script_lang_js_","iconClass","className","iconName","svgClass","_g","aria-hidden","$listeners","xlink:href"],"mappings":"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","file":"static/js/app.203f69f8.js","sourcesContent":["import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-pdf\",\n \"use\": \"icon-pdf-usage\",\n \"viewBox\": \"0 0 1024 1024\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-people\",\n \"use\": \"icon-people-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-eye-open\",\n \"use\": \"icon-eye-open-usage\",\n \"viewBox\": \"0 0 1024 1024\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=69c6c5c4&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=69c6c5c4&scoped=true&lang=css&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-exit-fullscreen\",\n \"use\": \"icon-exit-fullscreen-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-nested\",\n \"use\": \"icon-nested-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-theme\",\n \"use\": \"icon-theme-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-form\",\n \"use\": \"icon-form-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-dashboard\",\n \"use\": \"icon-dashboard-usage\",\n \"viewBox\": \"0 0 128 100\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","const isLocalhost = (instanceName) =>\n instanceName.startsWith('localhost:') || instanceName.startsWith('127.0.0.1:')\n\nexport const baseName = (instanceName = 'localhost') => {\n if (instanceName.match(/https?:\\/\\//)) {\n return instanceName\n } else {\n return isLocalhost(instanceName) ? `http://${instanceName}` : `https://${instanceName}`\n }\n}\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-shopping\",\n \"use\": \"icon-shopping-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-bug\",\n \"use\": \"icon-bug-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-international\",\n \"use\": \"icon-international-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-qq\",\n \"use\": \"icon-qq-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-link\",\n \"use\": \"icon-link-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=591d6778&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=591d6778&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=0&id=e1cdb714&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=0&id=e1cdb714&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-guide 2\",\n \"use\": \"icon-guide 2-usage\",\n \"viewBox\": \"0 0 1000 1000\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-language\",\n \"use\": \"icon-language-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-password\",\n \"use\": \"icon-password-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-peoples\",\n \"use\": \"icon-peoples-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-money\",\n \"use\": \"icon-money-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-example\",\n \"use\": \"icon-example-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-list\",\n \"use\": \"icon-list-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-settings\",\n \"use\": \"icon-settings-usage\",\n \"viewBox\": \"0 0 490.2 490.2\",\n \"content\": \"\\r\\n\\r\\n\\t\\r\\n\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\r\\n\\t\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-message\",\n \"use\": \"icon-message-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-table\",\n \"use\": \"icon-table-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=style&index=0&id=767d264f&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=style&index=0&id=767d264f&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-eye\",\n \"use\": \"icon-eye-usage\",\n \"viewBox\": \"0 0 128 64\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","var map = {\n\t\"./404.svg\": \"oUrx\",\n\t\"./bug.svg\": \"F3lI\",\n\t\"./chart.svg\": \"yCkv\",\n\t\"./clipboard.svg\": \"vDVG\",\n\t\"./component.svg\": \"VtY+\",\n\t\"./dashboard.svg\": \"94Jb\",\n\t\"./documentation.svg\": \"kPu2\",\n\t\"./drag.svg\": \"m7++\",\n\t\"./edit.svg\": \"qkZ8\",\n\t\"./email.svg\": \"y7eQ\",\n\t\"./example.svg\": \"MMMJ\",\n\t\"./excel.svg\": \"ZZmv\",\n\t\"./exit-fullscreen.svg\": \"28eg\",\n\t\"./eye-open.svg\": \"1+ww\",\n\t\"./eye.svg\": \"TfVu\",\n\t\"./form.svg\": \"6xvN\",\n\t\"./fullscreen.svg\": \"mSHS\",\n\t\"./guide 2.svg\": \"ICep\",\n\t\"./guide.svg\": \"ZoO1\",\n\t\"./icon.svg\": \"nZHn\",\n\t\"./international.svg\": \"F9+T\",\n\t\"./language.svg\": \"JYDz\",\n\t\"./link.svg\": \"GPBF\",\n\t\"./list.svg\": \"MokB\",\n\t\"./lock.svg\": \"qwAt\",\n\t\"./message.svg\": \"R/8a\",\n\t\"./money.svg\": \"MEYL\",\n\t\"./nested.svg\": \"3PhE\",\n\t\"./password.svg\": \"Kj24\",\n\t\"./pdf.svg\": \"+aF5\",\n\t\"./people.svg\": \"0Fbn\",\n\t\"./peoples.svg\": \"LxGF\",\n\t\"./qq.svg\": \"FDDl\",\n\t\"./search.svg\": \"jo2x\",\n\t\"./settings.svg\": \"P8iQ\",\n\t\"./shopping.svg\": \"EqXK\",\n\t\"./size.svg\": \"hkRB\",\n\t\"./star.svg\": \"cIpu\",\n\t\"./tab.svg\": \"j7e1\",\n\t\"./table.svg\": \"R/Hx\",\n\t\"./theme.svg\": \"5TQQ\",\n\t\"./tree.svg\": \"k80C\",\n\t\"./user.svg\": \"s7Vf\",\n\t\"./wechat.svg\": \"gNoN\",\n\t\"./zip.svg\": \"iqZD\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"Uf/o\";","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-component\",\n \"use\": \"icon-component-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../node_modules/babel-loader/lib/index.js?cacheDirectory!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/babel-loader/lib/index.js?cacheDirectory!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=6b42edcf&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"App.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function needReboot(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/need_reboot`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function restartApp(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/restart`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import Cookies from 'js-cookie'\nimport { needReboot, restartApp } from '@/api/app'\n\nconst app = {\n state: {\n sidebar: {\n opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,\n withoutAnimation: false\n },\n device: 'desktop',\n language: Cookies.get('language') || 'en',\n needReboot: false,\n size: Cookies.get('size') || 'medium',\n invitesEnabled: false\n },\n mutations: {\n TOGGLE_SIDEBAR: state => {\n state.sidebar.opened = !state.sidebar.opened\n state.sidebar.withoutAnimation = false\n if (state.sidebar.opened) {\n Cookies.set('sidebarStatus', 1)\n } else {\n Cookies.set('sidebarStatus', 0)\n }\n },\n CLOSE_SIDEBAR: (state, withoutAnimation) => {\n Cookies.set('sidebarStatus', 0)\n state.sidebar.opened = false\n state.sidebar.withoutAnimation = withoutAnimation\n },\n TOGGLE_DEVICE: (state, device) => {\n state.device = device\n },\n SET_INVITES_ENABLED: (state, invitesEnabled) => {\n state.invitesEnabled = invitesEnabled\n },\n SET_LANGUAGE: (state, language) => {\n state.language = language\n Cookies.set('language', language)\n },\n TOGGLE_REBOOT: (state, needReboot) => {\n state.needReboot = needReboot\n },\n SET_SIZE: (state, size) => {\n state.size = size\n Cookies.set('size', size)\n }\n },\n actions: {\n closeSideBar({ commit }, { withoutAnimation }) {\n commit('CLOSE_SIDEBAR', withoutAnimation)\n },\n async NeedReboot({ commit, getters }) {\n const response = await needReboot(getters.authHost, getters.token)\n commit('TOGGLE_REBOOT', response.data['need_reboot'])\n },\n async RestartApplication({ commit, getters }) {\n await restartApp(getters.authHost, getters.token)\n commit('TOGGLE_REBOOT', false)\n },\n SetInvitesEnabled({ commit }, invitesEnabled) {\n commit('SET_INVITES_ENABLED', invitesEnabled)\n },\n setLanguage({ commit }, language) {\n commit('SET_LANGUAGE', language)\n },\n setSize({ commit }, size) {\n commit('SET_SIZE', size)\n },\n toggleDevice({ commit }, device) {\n commit('TOGGLE_DEVICE', device)\n },\n toggleSideBar({ commit }) {\n commit('TOGGLE_SIDEBAR')\n }\n }\n}\n\nexport default app\n","const errorLog = {\n state: {\n logs: []\n },\n mutations: {\n ADD_ERROR_LOG: (state, log) => {\n state.logs.push(log)\n }\n },\n actions: {\n addErrorLog({ commit }, log) {\n commit('ADD_ERROR_LOG', log)\n }\n }\n}\n\nexport default errorLog\n","import _ from 'lodash'\n\nimport request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchLog(authHost, token, params, page = 1) {\n const normalizedParams = new URLSearchParams(\n _.omitBy({ ...params, page }, _.isUndefined)\n ).toString()\n\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/moderation_log?${normalizedParams}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchAdmins(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?filters=is_admin`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchModerators(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?filters=is_moderator`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchLog, fetchAdmins, fetchModerators } from '@/api/moderationLog'\n\nconst moderationLog = {\n state: {\n fetchedLog: [],\n logItemsCount: 0,\n admins: [],\n moderators: [],\n logLoading: true,\n adminsLoading: true\n },\n mutations: {\n SET_LOG_LOADING: (state, status) => {\n state.logLoading = status\n },\n SET_ADMINS_LOADING: (state, status) => {\n state.adminsLoading = status\n },\n SET_MODERATION_LOG: (state, log) => {\n state.fetchedLog = log\n },\n SET_MODERATION_LOG_COUNT: (state, count) => {\n state.logItemsCount = count\n },\n SET_ADMINS: (state, admins) => {\n state.admins = admins\n },\n SET_MODERATORS: (state, moderators) => {\n state.moderators = moderators\n }\n },\n actions: {\n async FetchModerationLog({ commit, getters }, opts = {}) {\n const response = await fetchLog(getters.authHost, getters.token, opts)\n\n commit('SET_MODERATION_LOG', response.data.items)\n commit('SET_MODERATION_LOG_COUNT', response.data.total)\n commit('SET_LOG_LOADING', false)\n },\n async FetchAdmins({ commit, getters }) {\n const adminsResponse = await fetchAdmins(getters.authHost, getters.token)\n const moderatorsResponse = await fetchModerators(getters.authHost, getters.token)\n\n commit('SET_ADMINS', adminsResponse.data)\n commit('SET_MODERATORS', moderatorsResponse.data)\n commit('SET_ADMINS_LOADING', false)\n }\n }\n}\n\nexport default moderationLog\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function generateInviteToken(max_use, expires_at, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/invite_token`,\n method: 'post',\n headers: authHeaders(token),\n data: expires_at && expires_at.length > 0 ? { max_use, expires_at } : { max_use }\n })\n}\n\nexport async function inviteViaEmail(email, name, authHost, token) {\n const data = name.length > 0 ? { email, name } : { email }\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/email_invite',\n method: 'post',\n headers: authHeaders(token),\n data\n })\n}\n\nexport async function listInviteTokens(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/invites`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function revokeToken(tokenToRevoke, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/revoke_invite`,\n method: 'post',\n headers: authHeaders(token),\n data: { token: tokenToRevoke }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { generateInviteToken, inviteViaEmail, listInviteTokens, revokeToken } from '@/api/invites'\nimport { Message } from 'element-ui'\nimport i18n from '@/lang'\n\nconst invites = {\n state: {\n inviteTokens: [],\n loading: false,\n newToken: {}\n },\n mutations: {\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_NEW_TOKEN: (state, token) => {\n state.newToken = token\n },\n SET_TOKENS: (state, tokens) => {\n state.inviteTokens = tokens\n }\n },\n actions: {\n async FetchInviteTokens({ commit, getters }) {\n commit('SET_LOADING', true)\n const response = await listInviteTokens(getters.authHost, getters.token)\n commit('SET_TOKENS', response.data.invites.reverse())\n commit('SET_LOADING', false)\n },\n async GenerateInviteToken({ commit, dispatch, getters }, { maxUse, expiresAt }) {\n try {\n const { data } = await generateInviteToken(maxUse, expiresAt, getters.authHost, getters.token)\n commit('SET_NEW_TOKEN', { token: data.token, maxUse: data.max_use, expiresAt: data.expires_at })\n } catch (_e) {\n return\n }\n dispatch('FetchInviteTokens')\n },\n async InviteUserViaEmail({ commit, dispatch, getters }, { email, name }) {\n try {\n await inviteViaEmail(email, name, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n Message({\n message: i18n.t('invites.emailSent'),\n type: 'success',\n duration: 5 * 1000\n })\n },\n RemoveNewToken({ commit }) {\n commit('SET_NEW_TOKEN', {})\n },\n async RevokeToken({ commit, dispatch, getters }, token) {\n try {\n await revokeToken(token, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n dispatch('FetchInviteTokens')\n }\n }\n}\n\nexport default invites\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchPeers(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/v1/instance/peers`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchPeers } from '@/api/peers'\n\nconst peers = {\n state: {\n fetchedPeers: [],\n loading: true\n },\n\n mutations: {\n SET_PEERS: (state, peers) => {\n state.fetchedPeers = peers\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n }\n },\n\n actions: {\n async FetchPeers({ commit, getters }) {\n const peers = await fetchPeers(getters.authHost, getters.token)\n\n commit('SET_PEERS', [...peers.data].sort())\n commit('SET_LOADING', false)\n }\n }\n}\n\nexport default peers\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=69c6c5c4&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=69c6c5c4&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"69c6c5c4\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticStyle:{\"padding\":\"0 15px\"},on:{\"click\":_vm.toggleClick}},[_c('svg',{staticClass:\"hamburger\",class:{'is-active':_vm.isActive},attrs:{\"viewBox\":\"0 0 1024 1024\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"64\",\"height\":\"64\"}},[_c('path',{attrs:{\"d\":\"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z\"}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Navbar.vue?vue&type=template&id=28de7ff2&scoped=true&\"\nimport script from \"./Navbar.vue?vue&type=script&lang=js&\"\nexport * from \"./Navbar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Navbar.vue?vue&type=style&index=0&id=28de7ff2&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"28de7ff2\",\n null\n \n)\n\ncomponent.options.__file = \"Navbar.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"navbar\"},[_c('hamburger',{staticClass:\"hamburger-container\",attrs:{\"toggle-click\":_vm.toggleSideBar,\"is-active\":_vm.sidebar.opened}}),_vm._v(\" \"),_c('div',{staticClass:\"right-menu\"},[_c('el-dropdown',{staticClass:\"avatar-container right-menu-item hover-effect\",attrs:{\"trigger\":\"click\"}},[_c('div',{staticClass:\"avatar-wrapper\"},[_c('img',{staticClass:\"user-avatar\",attrs:{\"src\":_vm.avatar+'?imageView2/1/w/80/h/80'}})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[_c('el-dropdown-item',[_c('span',{staticStyle:{\"display\":\"block\"},on:{\"click\":_vm.logout}},[_vm._v(_vm._s(_vm.$t('navbar.logOut')))])])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// translate router.meta.title, be used in breadcrumb sidebar tagsview\nexport function generateTitle(title) {\n const hasKey = this.$te('route.' + title)\n\n if (hasKey) {\n // $t :this method from vue-i18n, inject in @/lang/index.js\n const translatedTitle = this.$t('route.' + title)\n\n return translatedTitle\n }\n return title\n}\n","/**\n * Created by jiachenpan on 16/11/18.\n */\n\nexport function parseTime(time, cFormat) {\n if (arguments.length === 0) {\n return null\n }\n const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'\n let date\n if (typeof time === 'object') {\n date = time\n } else {\n if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {\n time = parseInt(time)\n }\n if ((typeof time === 'number') && (time.toString().length === 10)) {\n time = time * 1000\n }\n date = new Date(time)\n }\n const formatObj = {\n y: date.getFullYear(),\n m: date.getMonth() + 1,\n d: date.getDate(),\n h: date.getHours(),\n i: date.getMinutes(),\n s: date.getSeconds(),\n a: date.getDay()\n }\n const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {\n let value = formatObj[key]\n // Note: getDay() returns 0 on Sunday\n if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }\n if (result.length > 0 && value < 10) {\n value = '0' + value\n }\n return value || 0\n })\n return time_str\n}\n\nexport function formatTime(time, option) {\n time = +time * 1000\n const d = new Date(time)\n const now = Date.now()\n\n const diff = (now - d) / 1000\n\n if (diff < 30) {\n return '刚刚'\n } else if (diff < 3600) {\n // less 1 hour\n return Math.ceil(diff / 60) + '分钟前'\n } else if (diff < 3600 * 24) {\n return Math.ceil(diff / 3600) + '小时前'\n } else if (diff < 3600 * 24 * 2) {\n return '1天前'\n }\n if (option) {\n return parseTime(time, option)\n } else {\n return (\n d.getMonth() +\n 1 +\n '月' +\n d.getDate() +\n '日' +\n d.getHours() +\n '时' +\n d.getMinutes() +\n '分'\n )\n }\n}\n\n// 格式化时间\nexport function getQueryObject(url) {\n url = url == null ? window.location.href : url\n const search = url.substring(url.lastIndexOf('?') + 1)\n const obj = {}\n const reg = /([^?&=]+)=([^?&=]*)/g\n search.replace(reg, (rs, $1, $2) => {\n const name = decodeURIComponent($1)\n let val = decodeURIComponent($2)\n val = String(val)\n obj[name] = val\n return rs\n })\n return obj\n}\n\n/**\n *get getByteLen\n * @param {Sting} val input value\n * @returns {number} output value\n */\nexport function getByteLen(val) {\n let len = 0\n for (let i = 0; i < val.length; i++) {\n if (val[i].match(/[^\\x00-\\xff]/gi) != null) {\n len += 1\n } else {\n len += 0.5\n }\n }\n return Math.floor(len)\n}\n\nexport function cleanArray(actual) {\n const newArray = []\n for (let i = 0; i < actual.length; i++) {\n if (actual[i]) {\n newArray.push(actual[i])\n }\n }\n return newArray\n}\n\nexport function param(json) {\n if (!json) return ''\n return cleanArray(\n Object.keys(json).map(key => {\n if (json[key] === undefined) return ''\n return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])\n })\n ).join('&')\n}\n\nexport function param2Obj(url) {\n const search = url.split('?')[1]\n if (!search) {\n return {}\n }\n return JSON.parse(\n '{\"' +\n decodeURIComponent(search)\n .replace(/\"/g, '\\\\\"')\n .replace(/&/g, '\",\"')\n .replace(/=/g, '\":\"') +\n '\"}'\n )\n}\n\nexport function html2Text(val) {\n const div = document.createElement('div')\n div.innerHTML = val\n return div.textContent || div.innerText\n}\n\nexport function objectMerge(target, source) {\n /* Merges two objects,\n giving the last one precedence */\n\n if (typeof target !== 'object') {\n target = {}\n }\n if (Array.isArray(source)) {\n return source.slice()\n }\n Object.keys(source).forEach(property => {\n const sourceProperty = source[property]\n if (typeof sourceProperty === 'object') {\n target[property] = objectMerge(target[property], sourceProperty)\n } else {\n target[property] = sourceProperty\n }\n })\n return target\n}\n\nexport function toggleClass(element, className) {\n if (!element || !className) {\n return\n }\n let classString = element.className\n const nameIndex = classString.indexOf(className)\n if (nameIndex === -1) {\n classString += '' + className\n } else {\n classString =\n classString.substr(0, nameIndex) +\n classString.substr(nameIndex + className.length)\n }\n element.className = classString\n}\n\nexport const pickerOptions = [\n {\n text: '今天',\n onClick(picker) {\n const end = new Date()\n const start = new Date(new Date().toDateString())\n end.setTime(start.getTime())\n picker.$emit('pick', [start, end])\n }\n },\n {\n text: '最近一周',\n onClick(picker) {\n const end = new Date(new Date().toDateString())\n const start = new Date()\n start.setTime(end.getTime() - 3600 * 1000 * 24 * 7)\n picker.$emit('pick', [start, end])\n }\n },\n {\n text: '最近一个月',\n onClick(picker) {\n const end = new Date(new Date().toDateString())\n const start = new Date()\n start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)\n picker.$emit('pick', [start, end])\n }\n },\n {\n text: '最近三个月',\n onClick(picker) {\n const end = new Date(new Date().toDateString())\n const start = new Date()\n start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)\n picker.$emit('pick', [start, end])\n }\n }\n]\n\nexport function getTime(type) {\n if (type === 'start') {\n return new Date().getTime() - 3600 * 1000 * 24 * 90\n } else {\n return new Date(new Date().toDateString())\n }\n}\n\nexport function debounce(func, wait, immediate) {\n let timeout, args, context, timestamp, result\n\n const later = function() {\n // 据上一次触发时间间隔\n const last = +new Date() - timestamp\n\n // 上次被包装函数被调用时间间隔last小于设定时间间隔wait\n if (last < wait && last > 0) {\n timeout = setTimeout(later, wait - last)\n } else {\n timeout = null\n // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用\n if (!immediate) {\n result = func.apply(context, args)\n if (!timeout) context = args = null\n }\n }\n }\n\n return function(...args) {\n context = this\n timestamp = +new Date()\n const callNow = immediate && !timeout\n // 如果延时不存在,重新设定延时\n if (!timeout) timeout = setTimeout(later, wait)\n if (callNow) {\n result = func.apply(context, args)\n context = args = null\n }\n\n return result\n }\n}\n\n/**\n * This is just a simple version of deep copy\n * Has a lot of edge cases bug\n * If you want to use a perfect deep copy, use lodash's _.cloneDeep\n */\nexport function deepClone(source) {\n if (!source && typeof source !== 'object') {\n throw new Error('error arguments', 'shallowClone')\n }\n const targetObj = source.constructor === Array ? [] : {}\n Object.keys(source).forEach(keys => {\n if (source[keys] && typeof source[keys] === 'object') {\n targetObj[keys] = deepClone(source[keys])\n } else {\n targetObj[keys] = source[keys]\n }\n })\n return targetObj\n}\n\nexport function uniqueArr(arr) {\n return Array.from(new Set(arr))\n}\n\nexport function isExternal(path) {\n return /^(https?:|mailto:|tel:)/.test(path)\n}\n","\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"","var render, staticRenderFns\nimport script from \"./Item.vue?vue&type=script&lang=js&\"\nexport * from \"./Item.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Item.vue\"\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Link.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Link.vue?vue&type=script&lang=js&\"","\n\n\n\n","import { render, staticRenderFns } from \"./Link.vue?vue&type=template&id=4dde2217&\"\nimport script from \"./Link.vue?vue&type=script&lang=js&\"\nexport * from \"./Link.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Link.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('component',_vm._b({},'component',_vm.linkProps(_vm.to),false),[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SidebarItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SidebarItem.vue?vue&type=script&lang=js&\"","\n\n\n","export default {\n computed: {\n device() {\n return this.$store.state.app.device\n }\n },\n mounted() {\n // In order to fix the click on menu on the ios device will trigger the mouseleave bug\n // https://github.com/PanJiaChen/vue-element-admin/issues/1135\n this.fixBugIniOS()\n },\n methods: {\n fixBugIniOS() {\n const $subMenu = this.$refs.subMenu\n if ($subMenu) {\n const handleMouseleave = $subMenu.handleMouseleave\n $subMenu.handleMouseleave = (e) => {\n if (this.device === 'mobile') {\n return\n }\n handleMouseleave(e)\n }\n }\n }\n }\n}\n","import { render, staticRenderFns } from \"./SidebarItem.vue?vue&type=template&id=763b3c07&\"\nimport script from \"./SidebarItem.vue?vue&type=script&lang=js&\"\nexport * from \"./SidebarItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SidebarItem.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.item.hidden && _vm.item.children && _vm.invitesEnabled)?_c('div',{staticClass:\"menu-wrapper\"},[(_vm.hasOneShowingChild(_vm.item.children,_vm.item) && (!_vm.onlyOneChild.children||_vm.onlyOneChild.noShowingChildren)&&!_vm.item.alwaysShow)?[_c('app-link',{attrs:{\"to\":_vm.resolvePath(_vm.onlyOneChild.path)}},[_c('el-menu-item',{class:{'submenu-title-noDropdown':!_vm.isNest},attrs:{\"index\":_vm.resolvePath(_vm.onlyOneChild.path)}},[(_vm.onlyOneChild.meta)?_c('item',{attrs:{\"icon\":_vm.onlyOneChild.meta.icon||_vm.item.meta.icon,\"title\":_vm.generateTitle(_vm.onlyOneChild.meta.title)}}):_vm._e()],1)],1)]:_c('el-submenu',{ref:\"subMenu\",attrs:{\"index\":_vm.resolvePath(_vm.item.path)}},[_c('template',{slot:\"title\"},[(_vm.item.meta)?_c('item',{attrs:{\"icon\":_vm.item.meta.icon,\"title\":_vm.generateTitle(_vm.item.meta.title)}}):_vm._e()],1),_vm._v(\" \"),_vm._l((_vm.item.children),function(child){return [(!child.hidden)?[(child.children&&child.children.length>0)?_c('sidebar-item',{key:child.path,staticClass:\"nest-menu\",attrs:{\"is-nest\":true,\"item\":child,\"base-path\":_vm.resolvePath(child.path)}}):_c('app-link',{key:child.name,attrs:{\"to\":_vm.resolvePath(child.path)}},[_c('el-menu-item',{attrs:{\"index\":_vm.resolvePath(child.path)}},[(child.meta)?_c('item',{attrs:{\"icon\":child.meta.icon,\"title\":_vm.generateTitle(child.meta.title)}}):_vm._e()],1)],1)]:_vm._e()]})],2)],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=29a0fa94&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-scrollbar',{attrs:{\"wrap-class\":\"scrollbar-wrapper\"}},[_c('el-menu',{attrs:{\"default-active\":_vm.$route.path,\"collapse\":_vm.isCollapse,\"background-color\":_vm.variables.menuBg,\"text-color\":_vm.variables.menuText,\"active-text-color\":_vm.variables.menuActiveText,\"mode\":\"vertical\"}},_vm._l((_vm.permission_routers),function(route){return _c('sidebar-item',{key:route.path,attrs:{\"item\":route,\"base-path\":route.path}})}),1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=591d6778&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=591d6778&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"591d6778\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-scrollbar',{ref:\"scrollContainer\",staticClass:\"scroll-container\",attrs:{\"vertical\":false},nativeOn:{\"wheel\":function($event){$event.preventDefault();return _vm.handleScroll($event)}}},[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=script&lang=js&\"","\n\n\n\n\n\n\n","import { render, staticRenderFns } from \"./TagsView.vue?vue&type=template&id=e1cdb714&scoped=true&\"\nimport script from \"./TagsView.vue?vue&type=script&lang=js&\"\nexport * from \"./TagsView.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TagsView.vue?vue&type=style&index=0&id=e1cdb714&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\nimport style1 from \"./TagsView.vue?vue&type=style&index=1&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e1cdb714\",\n null\n \n)\n\ncomponent.options.__file = \"TagsView.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"tags-view-container\"},[_c('scroll-pane',{ref:\"scrollPane\",staticClass:\"tags-view-wrapper\"},_vm._l((_vm.visitedViews),function(tag){return _c('router-link',{key:tag.path,ref:\"tag\",refInFor:true,staticClass:\"tags-view-item\",class:_vm.isActive(tag)?'active':'',attrs:{\"to\":{ path: tag.path, query: tag.query, fullPath: tag.fullPath },\"tag\":\"span\"},nativeOn:{\"mouseup\":function($event){if('button' in $event && $event.button !== 1){ return null; }return _vm.closeSelectedTag(tag)},\"contextmenu\":function($event){$event.preventDefault();return _vm.openMenu(tag,$event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.generateTitle(tag.title))+\"\\n \"),(!tag.meta.affix)?_c('span',{staticClass:\"el-icon-close\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.closeSelectedTag(tag)}}}):_vm._e()])}),1),_vm._v(\" \"),_c('ul',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.visible),expression:\"visible\"}],staticClass:\"contextmenu\",style:({left:_vm.left+'px',top:_vm.top+'px'})},[_c('li',{on:{\"click\":function($event){return _vm.refreshSelectedTag(_vm.selectedTag)}}},[_vm._v(_vm._s(_vm.$t('tagsView.refresh')))]),_vm._v(\" \"),(!(_vm.selectedTag.meta&&_vm.selectedTag.meta.affix))?_c('li',{on:{\"click\":function($event){return _vm.closeSelectedTag(_vm.selectedTag)}}},[_vm._v(_vm._s(_vm.$t('tagsView.close')))]):_vm._e(),_vm._v(\" \"),_c('li',{on:{\"click\":_vm.closeOthersTags}},[_vm._v(_vm._s(_vm.$t('tagsView.closeOthers')))]),_vm._v(\" \"),_c('li',{on:{\"click\":function($event){return _vm.closeAllTags(_vm.selectedTag)}}},[_vm._v(_vm._s(_vm.$t('tagsView.closeAll')))])])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=script&lang=js&\"","\n\n\n\n\n\n","import { render, staticRenderFns } from \"./AppMain.vue?vue&type=template&id=f852c4f2&scoped=true&\"\nimport script from \"./AppMain.vue?vue&type=script&lang=js&\"\nexport * from \"./AppMain.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppMain.vue?vue&type=style&index=0&id=f852c4f2&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f852c4f2\",\n null\n \n)\n\ncomponent.options.__file = \"AppMain.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"app-main\"},[_c('transition',{attrs:{\"name\":\"fade-transform\",\"mode\":\"out-in\"}},[_c('keep-alive',{attrs:{\"include\":_vm.cachedViews}},[_c('router-view',{key:_vm.key})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import store from '@/store'\n\nconst { body } = document\nconst mobileWidth = 480\nconst tabletWidth = 801\nconst ratio = 3\n\nexport default {\n watch: {\n $route(route) {\n if (this.device === 'mobile' && this.sidebar.opened) {\n store.dispatch('closeSideBar', { withoutAnimation: false })\n }\n }\n },\n beforeMount() {\n window.addEventListener('resize', this.resizeHandler)\n },\n mounted() {\n const isMobile = this.isMobile()\n const isTablet = this.isTablet()\n if (isMobile || isTablet) {\n store.dispatch('toggleDevice', isMobile ? 'mobile' : 'tablet')\n store.dispatch('closeSideBar', { withoutAnimation: true })\n }\n },\n methods: {\n isMobile() {\n const rect = body.getBoundingClientRect()\n return rect.width - ratio < mobileWidth\n },\n isTablet() {\n const rect = body.getBoundingClientRect()\n return rect.width - ratio < tabletWidth && rect.width - ratio > mobileWidth\n },\n resizeHandler() {\n if (!document.hidden) {\n const isMobile = this.isMobile()\n const isTablet = this.isTablet()\n\n if (isMobile || isTablet) {\n store.dispatch('toggleDevice', isMobile ? 'mobile' : 'tablet')\n store.dispatch('closeSideBar', { withoutAnimation: true })\n } else {\n store.dispatch('toggleDevice', 'desktop')\n }\n }\n }\n }\n}\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Layout.vue?vue&type=template&id=767d264f&scoped=true&\"\nimport script from \"./Layout.vue?vue&type=script&lang=js&\"\nexport * from \"./Layout.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Layout.vue?vue&type=style&index=0&id=767d264f&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"767d264f\",\n null\n \n)\n\ncomponent.options.__file = \"Layout.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"app-wrapper\",class:_vm.classObj},[(_vm.device==='mobile'&&_vm.sidebar.opened)?_c('div',{staticClass:\"drawer-bg\",on:{\"click\":_vm.handleClickOutside}}):_vm._e(),_vm._v(\" \"),_c('sidebar',{staticClass:\"sidebar-container\"}),_vm._v(\" \"),_c('div',{staticClass:\"main-container\"},[_c('navbar'),_vm._v(\" \"),_c('app-main')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import Vue from 'vue'\nimport Router from 'vue-router'\n\nVue.use(Router)\n\n/* Layout */\nimport Layout from '@/views/layout/Layout'\n\nconst disabledFeatures = process.env.DISABLED_FEATURES || []\nconst settingsDisabled = disabledFeatures.includes('settings')\nconst settings = {\n path: '/settings',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/settings/index'),\n name: 'Settings',\n meta: { title: 'Settings', icon: 'settings', noCache: true }\n }\n ]\n}\n\nconst statusesDisabled = disabledFeatures.includes('statuses')\nconst statuses = {\n path: '/statuses',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/statuses/index'),\n name: 'Statuses',\n meta: { title: 'Statuses', icon: 'form', noCache: true }\n }\n ]\n}\n\nconst reportsDisabled = disabledFeatures.includes('reports')\nconst reports = {\n path: '/reports',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/reports/index'),\n name: 'Reports',\n meta: { title: 'Reports', icon: 'documentation', noCache: true }\n }\n ]\n}\n\nconst invitesDisabled = disabledFeatures.includes('invites')\nconst invites = {\n path: '/invites',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/invites/index'),\n name: 'Invites',\n meta: { title: 'Invites', icon: 'guide', noCache: true }\n }\n ]\n}\n\nconst emojiPacksDisabled = disabledFeatures.includes('emoji-packs')\nconst emojiPacks = {\n path: '/emoji_packs',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/emojiPacks/index'),\n name: 'Emoji Packs',\n meta: { title: 'Emoji Packs', icon: 'eye-open', noCache: true }\n }\n ]\n}\n\nconst moderationLogDisabled = disabledFeatures.includes('moderation-log')\nconst moderationLog = {\n path: '/moderation_log',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/moderation_log/index'),\n name: 'Moderation Log',\n meta: { title: 'moderationLog', icon: 'list', noCache: true }\n }\n ]\n}\n\nexport const constantRouterMap = [\n {\n path: '/redirect',\n component: Layout,\n hidden: true,\n children: [\n {\n path: '/redirect/:path*',\n component: () => import('@/views/redirect/index')\n }\n ]\n },\n {\n path: '/login-pleroma',\n component: () => import('@/views/login/pleroma'),\n hidden: true\n },\n {\n path: '/login',\n component: () => import('@/views/login/index'),\n hidden: true\n },\n {\n path: '/auth-redirect',\n component: () => import('@/views/login/authredirect'),\n hidden: true\n },\n {\n path: '/404',\n component: () => import('@/views/errorPage/404'),\n hidden: true\n },\n {\n path: '/401',\n component: () => import('@/views/errorPage/401'),\n hidden: true\n },\n {\n path: '',\n component: Layout,\n redirect: '/users/index'\n }\n]\n\nexport default new Router({\n // mode: 'history', // require service support\n scrollBehavior: () => ({ y: 0 }),\n routes: constantRouterMap\n})\n\nexport const asyncRouterMap = [\n {\n path: '/users',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/users/index'),\n name: 'Users',\n meta: { title: 'users', icon: 'peoples', noCache: true }\n }\n ]\n },\n ...(statusesDisabled ? [] : [statuses]),\n ...(reportsDisabled ? [] : [reports]),\n ...(invitesDisabled ? [] : [invites]),\n ...(emojiPacksDisabled ? [] : [emojiPacks]),\n ...(moderationLogDisabled ? [] : [moderationLog]),\n ...(settingsDisabled ? [] : [settings]),\n {\n path: '/users/:id',\n component: Layout,\n children: [\n {\n path: '',\n name: 'UsersShow',\n component: () => import('@/views/users/show')\n }\n ],\n hidden: true\n },\n { path: '*', redirect: '/404', hidden: true }\n]\n","import { asyncRouterMap, constantRouterMap } from '@/router'\n\n/**\n * 通过meta.role判断是否与当前用户权限匹配\n * @param roles\n * @param route\n */\nfunction hasPermission(roles, route) {\n if (route.meta && route.meta.roles) {\n return roles.some(role => route.meta.roles.includes(role))\n } else {\n return true\n }\n}\n\n/**\n * 递归过滤异步路由表,返回符合用户角色权限的路由表\n * @param routes asyncRouterMap\n * @param roles\n */\nfunction filterAsyncRouter(routes, roles) {\n const res = []\n\n routes.forEach(route => {\n const tmp = { ...route }\n if (hasPermission(roles, tmp)) {\n if (tmp.children) {\n tmp.children = filterAsyncRouter(tmp.children, roles)\n }\n res.push(tmp)\n }\n })\n\n return res\n}\n\nconst permission = {\n state: {\n routers: [],\n addRouters: []\n },\n mutations: {\n SET_ROUTERS: (state, routers) => {\n state.addRouters = routers\n state.routers = constantRouterMap.concat(routers)\n }\n },\n actions: {\n GenerateRoutes({ commit }, data) {\n return new Promise(resolve => {\n const { roles } = data\n let accessedRouters\n if (roles.includes('admin')) {\n accessedRouters = asyncRouterMap\n } else {\n accessedRouters = filterAsyncRouter(asyncRouterMap, roles)\n }\n commit('SET_ROUTERS', accessedRouters)\n resolve()\n })\n }\n }\n}\n\nexport default permission\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchRelays(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/relay',\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function addRelay(relay, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/relay',\n method: 'post',\n headers: authHeaders(token),\n data: { relay_url: relay }\n })\n}\n\nexport async function deleteRelay(relay, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/relay',\n method: 'delete',\n headers: authHeaders(token),\n data: { relay_url: `https://${relay}/actor` }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchRelays, addRelay, deleteRelay } from '@/api/relays'\n\nconst relays = {\n state: {\n fetchedRelays: [],\n loading: true\n },\n mutations: {\n SET_LOADING: (state, loading) => {\n state.loading = loading\n },\n SET_RELAYS: (state, relays) => {\n state.fetchedRelays = relays\n },\n ADD_RELAY: (state, relay) => {\n state.fetchedRelays = [...state.fetchedRelays, relay]\n },\n DELETE_RELAY: (state, relay) => {\n state.fetchedRelays = state.fetchedRelays.filter(fetchedRelay => fetchedRelay !== relay)\n }\n },\n actions: {\n async FetchRelays({ commit, getters }) {\n commit('SET_LOADING', true)\n\n const response = await fetchRelays(getters.authHost, getters.token)\n\n commit('SET_RELAYS', response.data.relays)\n commit('SET_LOADING', false)\n },\n async AddRelay({ commit, dispatch, getters }, relay) {\n commit('ADD_RELAY', relay)\n\n try {\n await addRelay(relay, getters.authHost, getters.token)\n } catch (_e) {\n return\n } finally {\n dispatch('FetchRelays')\n }\n },\n async DeleteRelay({ commit, dispatch, getters }, relay) {\n commit('DELETE_RELAY', relay)\n\n try {\n await deleteRelay(relay, getters.authHost, getters.token)\n } catch (_e) {\n return\n } finally {\n dispatch('FetchRelays')\n }\n }\n }\n}\n\nexport default relays\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function changeState(reports, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/reports`,\n method: 'patch',\n headers: authHeaders(token),\n data: { reports }\n })\n}\n\nexport async function fetchReports(filter, page, pageSize, authHost, token) {\n const url = filter.length > 0\n ? `/api/pleroma/admin/reports?state=${filter}&page=${page}&page_size=${pageSize}`\n : `/api/pleroma/admin/reports?page=${page}&page_size=${pageSize}`\n return await request({\n baseURL: baseName(authHost),\n url,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function createNote(content, reportID, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/reports/${reportID}/notes`,\n method: `post`,\n headers: authHeaders(token),\n data: { content }\n })\n}\n\nexport async function deleteNote(noteID, reportID, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/reports/${reportID}/notes/${noteID}`,\n method: `delete`,\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { changeState, fetchReports, createNote, deleteNote } from '@/api/reports'\n\nconst reports = {\n state: {\n fetchedReports: [],\n totalReportsCount: 0,\n currentPage: 1,\n pageSize: 50,\n stateFilter: '',\n loading: true\n },\n mutations: {\n SET_LAST_REPORT_ID: (state, id) => {\n state.idOfLastReport = id\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_PAGE: (state, page) => {\n state.currentPage = page\n },\n SET_REPORTS: (state, reports) => {\n state.fetchedReports = reports\n },\n SET_REPORTS_COUNT: (state, total) => {\n state.totalReportsCount = total\n },\n SET_REPORTS_FILTER: (state, filter) => {\n state.stateFilter = filter\n }\n },\n actions: {\n async ChangeReportState({ commit, getters, state }, reportsData) {\n changeState(reportsData, getters.authHost, getters.token)\n\n const updatedReports = state.fetchedReports.map(report => {\n const updatedReportsIds = reportsData.map(({ id }) => id)\n return updatedReportsIds.includes(report.id) ? { ...report, state: reportsData[0].state } : report\n })\n\n commit('SET_REPORTS', updatedReports)\n },\n ClearFetchedReports({ commit }) {\n commit('SET_REPORTS', [])\n },\n async FetchReports({ commit, getters, state }, page) {\n commit('SET_LOADING', true)\n const { data } = await fetchReports(state.stateFilter, page, state.pageSize, getters.authHost, getters.token)\n\n commit('SET_REPORTS', data.reports)\n commit('SET_REPORTS_COUNT', data.total)\n commit('SET_PAGE', page)\n commit('SET_LOADING', false)\n },\n SetFilter({ commit }, filter) {\n commit('SET_REPORTS_FILTER', filter)\n },\n CreateReportNote({ commit, getters, state, rootState }, { content, reportID }) {\n createNote(content, reportID, getters.authHost, getters.token)\n\n const optimisticNote = {\n user: {\n avatar: rootState.user.avatar,\n display_name: rootState.user.name,\n url: `${rootState.user.authHost}/${rootState.user.name}`,\n acct: rootState.user.name\n },\n content: content,\n created_at: new Date().getTime()\n }\n\n const updatedReports = state.fetchedReports.map(report => {\n if (report.id === reportID) {\n report.notes = [...report.notes, optimisticNote]\n }\n\n return report\n })\n\n commit('SET_REPORTS', updatedReports)\n },\n DeleteReportNote({ commit, getters, state }, { noteID, reportID }) {\n deleteNote(noteID, reportID, getters.authHost, getters.token)\n\n const updatedReports = state.fetchedReports.map(report => {\n if (report.id === reportID) {\n report.notes = report.notes.filter(note => note.id !== noteID)\n }\n\n return report\n })\n\n commit('SET_REPORTS', updatedReports)\n }\n }\n}\n\nexport default reports\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchDescription(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config/descriptions`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchSettings(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function updateSettings(configs, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config`,\n method: 'post',\n headers: authHeaders(token),\n data: { configs }\n })\n}\n\nexport async function removeSettings(configs, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config`,\n method: 'post',\n headers: authHeaders(token),\n data: { configs }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchDescription, fetchSettings, removeSettings, updateSettings } from '@/api/settings'\nimport { checkPartialUpdate, formSearchObject, parseNonTuples, parseTuples, valueHasTuples, wrapUpdatedSettings } from './normalizers'\nimport _ from 'lodash'\n\nconst settings = {\n state: {\n activeTab: 'instance',\n configDisabled: true,\n db: {},\n description: [],\n loading: true,\n searchData: {},\n settings: {},\n updatedSettings: {}\n },\n mutations: {\n CLEAR_UPDATED_SETTINGS: (state) => {\n state.updatedSettings = {}\n },\n REMOVE_SETTING_FROM_UPDATED: (state, { group, key, subkeys }) => {\n if (_.get(state.updatedSettings, [group, key, subkeys[0]])) {\n const { [subkeys[0]]: value, ...updatedSettings } = state.updatedSettings[group][key]\n state.updatedSettings = updatedSettings\n }\n },\n SET_ACTIVE_TAB: (state, tab) => {\n state.activeTab = tab\n },\n SET_DESCRIPTION: (state, data) => {\n state.description = data\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_SEARCH: (state, searchObject) => {\n state.searchData = searchObject\n },\n SET_SETTINGS: (state, data) => {\n const newSettings = data.reduce((acc, { group, key, value }) => {\n const parsedValue = valueHasTuples(key, value)\n ? { value: parseNonTuples(key, value) }\n : parseTuples(value, key)\n acc[group] = acc[group] ? { ...acc[group], [key]: parsedValue } : { [key]: parsedValue }\n return acc\n }, {})\n\n const newDbSettings = data.reduce((acc, { group, key, db }) => {\n if (db) {\n acc[group] = acc[group] ? { ...acc[group], [key]: db } : { [key]: db }\n }\n return acc\n }, {})\n\n state.settings = newSettings\n state.db = newDbSettings\n },\n TOGGLE_TABS: (state, status) => {\n state.configDisabled = status\n },\n UPDATE_SETTINGS: (state, { group, key, input, value, type }) => {\n const updatedSetting = !state.updatedSettings[group] || (key === 'Pleroma.Emails.Mailer' && input === ':adapter')\n ? { [key]: { [input]: [type, value] }}\n : { [key]: { ...state.updatedSettings[group][key], ...{ [input]: [type, value] }}}\n state.updatedSettings[group] = { ...state.updatedSettings[group], ...updatedSetting }\n },\n UPDATE_STATE: (state, { group, key, input, value }) => {\n const updatedState = key === 'Pleroma.Emails.Mailer' && input === ':adapter'\n ? { [key]: { [input]: value }}\n : { [key]: { ...state.settings[group][key], ...{ [input]: value }}}\n state.settings[group] = { ...state.settings[group], ...updatedState }\n }\n },\n actions: {\n async FetchSettings({ commit, getters }) {\n commit('SET_LOADING', true)\n try {\n const response = await fetchSettings(getters.authHost, getters.token)\n const description = await fetchDescription(getters.authHost, getters.token)\n commit('SET_DESCRIPTION', description.data)\n const searchObject = formSearchObject(description.data)\n commit('SET_SEARCH', searchObject)\n commit('SET_SETTINGS', response.data.configs)\n } catch (_e) {\n commit('TOGGLE_TABS', true)\n commit('SET_ACTIVE_TAB', 'relays')\n commit('SET_LOADING', false)\n return\n }\n commit('TOGGLE_TABS', false)\n commit('SET_LOADING', false)\n },\n async RemoveSetting({ commit, getters }, configs) {\n await removeSettings(configs, getters.authHost, getters.token)\n const response = await fetchSettings(getters.authHost, getters.token)\n const { group, key, subkeys } = configs[0]\n commit('SET_SETTINGS', response.data.configs)\n commit('TOGGLE_REBOOT', response.data.need_reboot)\n commit('REMOVE_SETTING_FROM_UPDATED', { group, key, subkeys: subkeys || [] })\n },\n SetActiveTab({ commit }, tab) {\n commit('SET_ACTIVE_TAB', tab)\n },\n async SubmitChanges({ getters, commit, state }) {\n const updatedData = checkPartialUpdate(state.settings, state.updatedSettings, state.description)\n const configs = Object.keys(updatedData).reduce((acc, group) => {\n return [...acc, ...wrapUpdatedSettings(group, updatedData[group], state.settings)]\n }, [])\n\n await updateSettings(configs, getters.authHost, getters.token)\n const response = await fetchSettings(getters.authHost, getters.token)\n commit('SET_SETTINGS', response.data.configs)\n commit('TOGGLE_REBOOT', response.data.need_reboot)\n commit('CLEAR_UPDATED_SETTINGS')\n },\n UpdateSettings({ commit }, { group, key, input, value, type }) {\n key\n ? commit('UPDATE_SETTINGS', { group, key, input, value, type })\n : commit('UPDATE_SETTINGS', { group, key: input, input: '_value', value, type })\n },\n async UpdateState({ commit, getters, state }, { group, key, input, value }) {\n if (key === 'Pleroma.Emails.Mailer' && input === ':adapter') {\n const subkeys = Object.keys(state.settings[group][key]).filter(el => el !== ':adapter')\n await removeSettings([{ group, key, delete: true, subkeys }], getters.authHost, getters.token)\n } else if (key === 'Pleroma.Upload' && input === ':uploader') {\n const deletedKey = value === 'Pleroma.Uploaders.Local' ? 'Pleroma.Uploaders.S3' : 'Pleroma.Uploaders.Local'\n await removeSettings([{ group, key: deletedKey, delete: true }], getters.authHost, getters.token)\n }\n key\n ? commit('UPDATE_STATE', { group, key, input, value })\n : commit('UPDATE_STATE', { group, key: input, input: 'value', value })\n }\n }\n}\n\nexport default settings\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function changeStatusScope(id, sensitive, visibility, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/statuses/${id}`,\n method: 'put',\n headers: authHeaders(token),\n data: { sensitive, visibility }\n })\n}\n\nexport async function deleteStatus(id, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/statuses/${id}`,\n method: 'delete',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchStatuses({ godmode, localOnly, authHost, token, pageSize, page }) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/statuses?godmode=${godmode}&local_only=${localOnly}&page=${page}&page_size=${pageSize}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchStatusesCount(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/stats`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchStatusesByInstance({ instance, authHost, token, pageSize, page }) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/instances/${instance}/statuses?page=${page}&page_size=${pageSize}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { changeStatusScope, deleteStatus, fetchStatuses, fetchStatusesCount, fetchStatusesByInstance } from '@/api/status'\n\nconst status = {\n state: {\n fetchedStatuses: [],\n loading: false,\n statusesByInstance: {\n selectedInstance: '',\n showLocal: false,\n showPrivate: false,\n page: 1,\n pageSize: 20,\n buttonLoading: false,\n allLoaded: false\n },\n statusVisibility: {}\n },\n mutations: {\n CHANGE_GODMODE_CHECKBOX_VALUE: (state, value) => {\n state.statusesByInstance.showPrivate = value\n },\n CHANGE_LOCAL_CHECKBOX_VALUE: (state, value) => {\n state.statusesByInstance.showLocal = value\n },\n CHANGE_PAGE: (state, page) => {\n state.statusesByInstance.page = page\n },\n CHANGE_SELECTED_INSTANCE: (state, instance) => {\n state.statusesByInstance.selectedInstance = instance\n },\n SET_STATUSES_BY_INSTANCE: (state, statuses) => {\n state.fetchedStatuses = statuses\n },\n PUSH_STATUSES: (state, statuses) => {\n state.fetchedStatuses = [...state.fetchedStatuses, ...statuses]\n },\n SET_ALL_LOADED: (state, status) => {\n state.statusesByInstance.allLoaded = status\n },\n SET_BUTTON_LOADING: (state, status) => {\n state.statusesByInstance.buttonLoading = status\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_STATUS_VISIBILITY: (state, visibility) => {\n state.statusVisibility = visibility\n }\n },\n actions: {\n async ChangeStatusScope({ dispatch, getters }, { statusId, isSensitive, visibility, reportCurrentPage, userId, godmode, fetchStatusesByInstance }) {\n await changeStatusScope(statusId, isSensitive, visibility, getters.authHost, getters.token)\n if (reportCurrentPage !== 0) { // called from Reports\n dispatch('FetchReports', reportCurrentPage)\n } else if (userId.length > 0) { // called from User profile\n dispatch('FetchUserStatuses', { userId, godmode })\n } else if (fetchStatusesByInstance) { // called from Statuses by Instance\n dispatch('FetchStatusesByInstance')\n }\n },\n async DeleteStatus({ dispatch, getters }, { statusId, reportCurrentPage, userId, godmode, fetchStatusesByInstance }) {\n await deleteStatus(statusId, getters.authHost, getters.token)\n if (reportCurrentPage !== 0) { // called from Reports\n dispatch('FetchReports', reportCurrentPage)\n } else if (userId.length > 0) { // called from User profile\n dispatch('FetchUserStatuses', { userId, godmode })\n } else if (fetchStatusesByInstance) { // called from Statuses by Instance\n dispatch('FetchStatusesByInstance')\n }\n },\n async FetchStatusesCount({ commit, getters }) {\n commit('SET_LOADING', true)\n const { data } = await fetchStatusesCount(getters.authHost, getters.token)\n commit('SET_STATUS_VISIBILITY', data.status_visibility)\n commit('SET_LOADING', false)\n },\n async FetchStatusesByInstance({ commit, getters, state, rootState }) {\n commit('SET_LOADING', true)\n if (state.statusesByInstance.selectedInstance === '') {\n commit('SET_STATUSES_BY_INSTANCE', [])\n } else {\n const statuses = state.statusesByInstance.selectedInstance === rootState.user.authHost\n ? await fetchStatuses(\n {\n godmode: state.statusesByInstance.showPrivate,\n localOnly: state.statusesByInstance.showLocal,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n : await fetchStatusesByInstance(\n {\n instance: state.statusesByInstance.selectedInstance,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n commit('SET_STATUSES_BY_INSTANCE', statuses.data)\n if (statuses.data.length < state.statusesByInstance.pageSize) {\n commit('SET_ALL_LOADED', true)\n }\n }\n commit('SET_LOADING', false)\n },\n async FetchStatusesPageByInstance({ commit, getters, rootState, state }) {\n commit('SET_BUTTON_LOADING', true)\n const statuses = state.statusesByInstance.selectedInstance === rootState.user.authHost\n ? await fetchStatuses(\n {\n godmode: state.statusesByInstance.showPrivate,\n localOnly: state.statusesByInstance.showLocal,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n : await fetchStatusesByInstance(\n {\n instance: state.statusesByInstance.selectedInstance,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n commit('PUSH_STATUSES', statuses.data)\n commit('SET_BUTTON_LOADING', false)\n if (statuses.data.length < state.statusesByInstance.pageSize) {\n commit('SET_ALL_LOADED', true)\n }\n },\n HandleGodmodeCheckboxChange({ commit, dispatch }, value) {\n dispatch('HandlePageChange', 1)\n commit('SET_ALL_LOADED', false)\n\n commit('CHANGE_GODMODE_CHECKBOX_VALUE', value)\n dispatch('FetchStatusesByInstance')\n },\n HandleLocalCheckboxChange({ commit, dispatch }, value) {\n dispatch('HandlePageChange', 1)\n commit('SET_ALL_LOADED', false)\n\n commit('CHANGE_LOCAL_CHECKBOX_VALUE', value)\n dispatch('FetchStatusesByInstance')\n },\n HandleFilterChange({ commit }, instance) {\n commit('CHANGE_SELECTED_INSTANCE', instance)\n commit('SET_ALL_LOADED', false)\n },\n HandlePageChange({ commit }, page) {\n commit('CHANGE_PAGE', page)\n }\n }\n}\n\nexport default status\n","const tagsView = {\n state: {\n visitedViews: [],\n cachedViews: []\n },\n mutations: {\n ADD_VISITED_VIEW: (state, view) => {\n if (state.visitedViews.some(v => v.path === view.path)) return\n state.visitedViews.push(\n Object.assign({}, view, {\n title: view.meta.title || 'no-name'\n })\n )\n },\n ADD_CACHED_VIEW: (state, view) => {\n if (state.cachedViews.includes(view.name)) return\n if (!view.meta.noCache) {\n state.cachedViews.push(view.name)\n }\n },\n\n DEL_VISITED_VIEW: (state, view) => {\n for (const [i, v] of state.visitedViews.entries()) {\n if (v.path === view.path) {\n state.visitedViews.splice(i, 1)\n break\n }\n }\n },\n DEL_CACHED_VIEW: (state, view) => {\n for (const i of state.cachedViews) {\n if (i === view.name) {\n const index = state.cachedViews.indexOf(i)\n state.cachedViews.splice(index, 1)\n break\n }\n }\n },\n\n DEL_OTHERS_VISITED_VIEWS: (state, view) => {\n state.visitedViews = state.visitedViews.filter(v => {\n return v.meta.affix || v.path === view.path\n })\n },\n DEL_OTHERS_CACHED_VIEWS: (state, view) => {\n for (const i of state.cachedViews) {\n if (i === view.name) {\n const index = state.cachedViews.indexOf(i)\n state.cachedViews = state.cachedViews.slice(index, index + 1)\n break\n }\n }\n },\n\n DEL_ALL_VISITED_VIEWS: state => {\n // keep affix tags\n const affixTags = state.visitedViews.filter(tag => tag.meta.affix)\n state.visitedViews = affixTags\n },\n DEL_ALL_CACHED_VIEWS: state => {\n state.cachedViews = []\n },\n\n UPDATE_VISITED_VIEW: (state, view) => {\n for (let v of state.visitedViews) {\n if (v.path === view.path) {\n v = Object.assign(v, view)\n break\n }\n }\n }\n\n },\n actions: {\n addView({ dispatch }, view) {\n dispatch('addVisitedView', view)\n dispatch('addCachedView', view)\n },\n addVisitedView({ commit }, view) {\n commit('ADD_VISITED_VIEW', view)\n },\n addCachedView({ commit }, view) {\n commit('ADD_CACHED_VIEW', view)\n },\n\n delView({ dispatch, state }, view) {\n return new Promise(resolve => {\n dispatch('delVisitedView', view)\n dispatch('delCachedView', view)\n resolve({\n visitedViews: [...state.visitedViews],\n cachedViews: [...state.cachedViews]\n })\n })\n },\n delVisitedView({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_VISITED_VIEW', view)\n resolve([...state.visitedViews])\n })\n },\n delCachedView({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_CACHED_VIEW', view)\n resolve([...state.cachedViews])\n })\n },\n\n delOthersViews({ dispatch, state }, view) {\n return new Promise(resolve => {\n dispatch('delOthersVisitedViews', view)\n dispatch('delOthersCachedViews', view)\n resolve({\n visitedViews: [...state.visitedViews],\n cachedViews: [...state.cachedViews]\n })\n })\n },\n delOthersVisitedViews({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_OTHERS_VISITED_VIEWS', view)\n resolve([...state.visitedViews])\n })\n },\n delOthersCachedViews({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_OTHERS_CACHED_VIEWS', view)\n resolve([...state.cachedViews])\n })\n },\n\n delAllViews({ dispatch, state }, view) {\n return new Promise(resolve => {\n dispatch('delAllVisitedViews', view)\n dispatch('delAllCachedViews', view)\n resolve({\n visitedViews: [...state.visitedViews],\n cachedViews: [...state.cachedViews]\n })\n })\n },\n delAllVisitedViews({ commit, state }) {\n return new Promise(resolve => {\n commit('DEL_ALL_VISITED_VIEWS')\n resolve([...state.visitedViews])\n })\n },\n delAllCachedViews({ commit, state }) {\n return new Promise(resolve => {\n commit('DEL_ALL_CACHED_VIEWS')\n resolve([...state.cachedViews])\n })\n },\n\n updateVisitedView({ commit }, view) {\n commit('UPDATE_VISITED_VIEW', view)\n }\n }\n}\n\nexport default tagsView\n","import request from '@/utils/request'\nimport { baseName } from './utils'\n\nexport async function loginByUsername(username, password, authHost) {\n const appsRequest = await request({\n baseURL: baseName(authHost),\n url: '/api/v1/apps',\n method: 'post',\n data: {\n client_name: `AdminFE_${Math.random()}`,\n redirect_uris: `${window.location.origin}/oauth-callback`,\n scopes: 'read write follow push admin'\n }\n })\n\n const app = appsRequest.data\n\n return request({\n baseURL: baseName(authHost),\n url: '/oauth/token',\n method: 'post',\n data: {\n client_id: app.client_id,\n client_secret: app.client_secret,\n grant_type: 'password',\n username: username,\n password: password\n }\n })\n}\n\nexport function getUserInfo(token, authHost) {\n return request({\n baseURL: baseName(authHost),\n url: '/api/v1/accounts/verify_credentials',\n method: 'get',\n headers: token ? { 'Authorization': `Bearer ${token}` } : {}\n })\n}\n\nconst oauth = { loginByUsername, getUserInfo }\n\nexport default oauth\n","import request from '@/utils/request'\nimport { baseName } from './utils'\n\nexport async function getNodeInfo(authHost) {\n return await request({\n baseURL: baseName(authHost),\n url: `/nodeinfo/2.0.json`,\n method: 'get'\n })\n}\n","import { loginByUsername, getUserInfo } from '@/api/login'\nimport { getNodeInfo } from '@/api/nodeInfo'\nimport { getToken, setToken, removeToken, getAuthHost, setAuthHost, removeAuthHost } from '@/utils/auth'\n\nconst user = {\n state: {\n user: '',\n id: '',\n status: '',\n code: '',\n token: getToken(),\n authHost: getAuthHost(),\n name: '',\n avatar: '',\n introduction: '',\n roles: [],\n setting: {\n articlePlatform: []\n },\n nodeInfo: {}\n },\n\n mutations: {\n SET_CODE: (state, code) => {\n state.code = code\n },\n SET_TOKEN: (state, token) => {\n state.token = token\n },\n SET_INTRODUCTION: (state, introduction) => {\n state.introduction = introduction\n },\n SET_SETTING: (state, setting) => {\n state.setting = setting\n },\n SET_STATUS: (state, status) => {\n state.status = status\n },\n SET_NAME: (state, name) => {\n state.name = name\n },\n SET_AVATAR: (state, avatar) => {\n state.avatar = avatar\n },\n SET_ROLES: (state, roles) => {\n state.roles = roles\n },\n SET_ID: (state, id) => {\n state.id = id\n },\n SET_AUTH_HOST: (state, authHost) => {\n state.authHost = authHost\n },\n SET_NODE_INFO: (state, nodeInfo) => {\n state.nodeInfo = nodeInfo\n }\n },\n\n actions: {\n LoginByUsername({ commit, dispatch }, { username, authHost, password }) {\n return new Promise((resolve, reject) => {\n loginByUsername(username, password, authHost).then(response => {\n const data = response.data\n commit('SET_TOKEN', data.access_token)\n commit('SET_AUTH_HOST', authHost)\n setToken(data.access_token)\n setAuthHost(authHost)\n resolve()\n }).catch(error => {\n dispatch('addErrorLog', { message: error.message })\n reject(error)\n })\n })\n },\n async GetNodeInfo({ commit, dispatch, state }) {\n const nodeInfo = await getNodeInfo(state.authHost)\n\n commit('SET_NODE_INFO', nodeInfo.data)\n dispatch('SetInvitesEnabled', nodeInfo.data.metadata.invitesEnabled)\n },\n GetUserInfo({ commit, state }) {\n return new Promise((resolve, reject) => {\n getUserInfo(state.token, state.authHost).then(response => {\n const data = response.data\n const message = 'This user doesn\\`t have admin rights. Try another credentials or see the ' +\n 'docs' +\n ' to find out how to make this user an admin'\n\n if (!data) {\n reject('Verification failed, please login again.')\n }\n\n if (data.pleroma && data.pleroma.is_admin) {\n commit('SET_ROLES', ['admin'])\n } else {\n reject(message)\n }\n\n commit('SET_NAME', data.username)\n commit('SET_ID', data.id)\n commit('SET_AVATAR', data.avatar)\n commit('SET_INTRODUCTION', '')\n resolve(response)\n }).catch(error => {\n reject(error)\n })\n })\n },\n LogOut({ commit }) {\n commit('SET_TOKEN', '')\n commit('SET_ROLES', [])\n removeToken()\n removeAuthHost()\n },\n FedLogOut({ commit }) {\n return new Promise(resolve => {\n commit('SET_TOKEN', '')\n removeToken()\n removeAuthHost()\n resolve()\n })\n },\n async LoginByPleromaFE({ commit, dispatch }, { token }) {\n commit('SET_TOKEN', token)\n setToken(token)\n commit('SET_AUTH_HOST', window.location.host)\n setAuthHost(window.location.host)\n\n dispatch('GetUserInfo')\n }\n }\n}\n\nexport default user\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function activateUsers(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/activate`,\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function addRight(nicknames, right, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/permission_group/${right}`,\n method: 'post',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function createNewAccount(nickname, email, password, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users',\n method: 'post',\n headers: authHeaders(token),\n data: { users: [{ nickname, email, password }] }\n })\n}\n\nexport async function deactivateUsers(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/deactivate`,\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function deleteRight(nicknames, right, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/permission_group/${right}`,\n method: 'delete',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function deleteUsers(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users`,\n method: 'delete',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function fetchUser(id, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${id}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchUserCredentials(nickname, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${nickname}/credentials`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function updateUserCredentials(nickname, credentials, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${nickname}/credentials`,\n method: 'patch',\n headers: authHeaders(token),\n data: credentials\n })\n}\n\nexport async function fetchUsers(filters, authHost, token, page = 1) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?page=${page}&filters=${filters}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function getPasswordResetToken(nickname, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${nickname}/password_reset`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function forcePasswordReset(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/force_password_reset`,\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function searchUsers(query, filters, authHost, token, page = 1) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?query=${query}&page=${page}&filters=${filters}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function tagUser(nicknames, tags, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/tag',\n method: 'put',\n headers: authHeaders(token),\n data: { nicknames, tags }\n })\n}\n\nexport async function untagUser(nicknames, tags, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/tag',\n method: 'delete',\n headers: authHeaders(token),\n data: { nicknames, tags }\n })\n}\n\nexport async function fetchUserStatuses(id, authHost, godmode, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${id}/statuses?godmode=${godmode}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function confirmUserEmail(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/confirm_email',\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function resendConfirmationEmail(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/resend_confirmation_email',\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchUser, fetchUserStatuses, fetchUserCredentials, updateUserCredentials } from '@/api/users'\n\nconst userProfile = {\n state: {\n statuses: [],\n statusesLoading: true,\n user: {},\n userCredentials: {},\n userProfileLoading: true\n },\n mutations: {\n SET_STATUSES: (state, statuses) => {\n state.statuses = statuses\n },\n SET_STATUSES_LOADING: (state, status) => {\n state.statusesLoading = status\n },\n SET_USER: (state, user) => {\n state.user = user\n },\n SET_USER_PROFILE_LOADING: (state, status) => {\n state.userProfileLoading = status\n },\n SET_USER_CREDENTIALS: (state, userCredentials) => {\n state.userCredentials = userCredentials\n }\n },\n actions: {\n async FetchUserProfile({ commit, dispatch, getters }, { userId, godmode }) {\n commit('SET_USER_PROFILE_LOADING', true)\n\n const userResponse = await fetchUser(userId, getters.authHost, getters.token)\n commit('SET_USER', userResponse.data)\n commit('SET_USER_PROFILE_LOADING', false)\n\n dispatch('FetchUserStatuses', { userId, godmode })\n },\n async FetchUserStatuses({ commit, getters }, { userId, godmode }) {\n commit('SET_STATUSES_LOADING', true)\n\n const statuses = await fetchUserStatuses(userId, getters.authHost, godmode, getters.token)\n\n commit('SET_STATUSES', statuses.data)\n commit('SET_STATUSES_LOADING', false)\n },\n async FetchUserCredentials({ commit, getters }, { nickname }) {\n const userResponse = await fetchUserCredentials(nickname, getters.authHost, getters.token)\n commit('SET_USER_CREDENTIALS', userResponse.data)\n },\n async UpdateUserCredentials({ dispatch, getters }, { nickname, credentials }) {\n await updateUserCredentials(nickname, credentials, getters.authHost, getters.token)\n dispatch('FetchUserCredentials', { nickname })\n }\n }\n}\n\nexport default userProfile\n","import { Message } from 'element-ui'\nimport i18n from '@/lang'\nimport {\n activateUsers,\n addRight,\n createNewAccount,\n deactivateUsers,\n deleteRight,\n deleteUsers,\n fetchUsers,\n getPasswordResetToken,\n searchUsers,\n tagUser,\n untagUser,\n forcePasswordReset,\n confirmUserEmail,\n resendConfirmationEmail\n} from '@/api/users'\n\nconst users = {\n state: {\n fetchedUsers: [],\n loading: true,\n searchQuery: '',\n totalUsersCount: 0,\n currentPage: 1,\n filters: {\n local: false,\n external: false,\n active: false,\n deactivated: false\n },\n passwordResetToken: {\n token: '',\n link: ''\n }\n },\n mutations: {\n SET_USERS: (state, users) => {\n state.fetchedUsers = users\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SWAP_USERS: (state, users) => {\n const usersWithoutSwapped = users.reduce((acc, user) => {\n return acc.filter(u => u.id !== user.id)\n }, state.fetchedUsers)\n\n if (state.fetchedUsers.length === 0) {\n return\n }\n\n state.fetchedUsers = [...usersWithoutSwapped, ...users].sort((a, b) =>\n a.nickname.localeCompare(b.nickname)\n )\n },\n SET_COUNT: (state, count) => {\n state.totalUsersCount = count\n },\n SET_PAGE: (state, page) => {\n state.currentPage = page\n },\n SET_PAGE_SIZE: (state, pageSize) => {\n state.pageSize = pageSize\n },\n SET_PASSWORD_RESET_TOKEN: (state, { token, link }) => {\n state.passwordResetToken.token = token\n state.passwordResetToken.link = link\n },\n SET_SEARCH_QUERY: (state, query) => {\n state.searchQuery = query\n },\n SET_USERS_FILTERS: (state, filters) => {\n state.filters = filters\n },\n SET_USER_PROFILE: (state, user) => {\n state.userProfile = user\n }\n },\n actions: {\n async ActivateUsers({ dispatch, getters }, { users, _userId }) {\n const updatedUsers = users.map(user => {\n return { ...user, deactivated: false }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await activateUsers(nicknames, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async ApplyChanges({ commit, dispatch, state }, { updatedUsers, callApiFn, userId }) {\n commit('SWAP_USERS', updatedUsers)\n\n try {\n await callApiFn()\n } catch (_e) {\n return\n } finally {\n dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })\n }\n\n if (userId) {\n dispatch('FetchUserProfile', { userId, godmode: false })\n }\n dispatch('SuccessMessage')\n },\n async AddRight({ dispatch, getters }, { users, right, _userId }) {\n const updatedUsers = users.map(user => {\n return user.local ? { ...user, roles: { ...user.roles, [right]: true }} : user\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await addRight(nicknames, right, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async AddTag({ dispatch, getters }, { users, tag, _userId }) {\n const updatedUsers = users.map(user => {\n return { ...user, tags: [...user.tags, tag] }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await tagUser(nicknames, [tag], getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async ClearFilters({ commit, dispatch, state }) {\n commit('CLEAR_USERS_FILTERS')\n dispatch('SearchUsers', { query: state.searchQuery, page: 1 })\n },\n async CreateNewAccount({ dispatch, getters, state }, { nickname, email, password }) {\n try {\n await createNewAccount(nickname, email, password, getters.authHost, getters.token)\n } catch (_e) {\n return\n } finally {\n dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })\n }\n dispatch('SuccessMessage')\n },\n async DeactivateUsers({ dispatch, getters }, { users, _userId }) {\n const updatedUsers = users.map(user => {\n return { ...user, deactivated: true }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await deactivateUsers(nicknames, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async ConfirmUsersEmail({ dispatch, getters }, { users, _userId }) {\n const updatedUsers = users.map(user => {\n return { ...user, confirmation_pending: false }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await confirmUserEmail(nicknames, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async ResendConfirmationEmail({ dispatch, getters }, users) {\n const usersNicknames = users.map(user => user.nickname)\n try {\n await resendConfirmationEmail(usersNicknames, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n dispatch('SuccessMessage')\n },\n async DeleteRight({ dispatch, getters }, { users, right, _userId }) {\n const updatedUsers = users.map(user => {\n return user.local ? { ...user, roles: { ...user.roles, [right]: false }} : user\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await deleteRight(nicknames, right, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async DeleteUsers({ commit, dispatch, getters, state }, { users, _userId }) {\n const usersNicknames = users.map(user => user.nickname)\n try {\n await deleteUsers(usersNicknames, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n const deletedUsersIds = users.map(deletedUser => deletedUser.id)\n const updatedUsers = state.fetchedUsers.filter(user => !deletedUsersIds.includes(user.id))\n commit('SET_USERS', updatedUsers)\n\n dispatch('FetchUserProfile', { userId: _userId, godmode: false })\n dispatch('SuccessMessage')\n },\n async FetchUsers({ commit, dispatch, getters, state }, { page }) {\n commit('SET_LOADING', true)\n const filters = Object.keys(state.filters).filter(filter => state.filters[filter]).join()\n const response = await fetchUsers(filters, getters.authHost, getters.token, page)\n await dispatch('GetNodeInfo')\n loadUsers(commit, page, response.data)\n },\n async GetPasswordResetToken({ commit, getters }, nickname) {\n const { data } = await getPasswordResetToken(nickname, getters.authHost, getters.token)\n commit('SET_PASSWORD_RESET_TOKEN', data)\n },\n RemovePasswordToken({ commit }) {\n commit('SET_PASSWORD_RESET_TOKEN', { link: '', token: '' })\n },\n async RemoveTag({ dispatch, getters }, { users, tag, _userId }) {\n const updatedUsers = users.map(user => {\n return { ...user, tags: user.tags.filter(userTag => userTag !== tag) }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await untagUser(nicknames, [tag], getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async RequirePasswordReset({ dispatch, getters }, users) {\n const nicknames = users.map(user => user.nickname)\n try {\n await forcePasswordReset(nicknames, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n dispatch('SuccessMessage')\n },\n async SearchUsers({ commit, dispatch, state, getters }, { query, page }) {\n if (query.length === 0) {\n commit('SET_SEARCH_QUERY', query)\n dispatch('FetchUsers', { page })\n } else {\n commit('SET_LOADING', true)\n commit('SET_SEARCH_QUERY', query)\n\n const filters = Object.keys(state.filters).filter(filter => state.filters[filter]).join()\n const response = await searchUsers(query, filters, getters.authHost, getters.token, page)\n\n loadUsers(commit, page, response.data)\n }\n },\n SuccessMessage() {\n Message.success({\n message: i18n.t('users.completed'),\n duration: 5 * 1000\n })\n },\n async ToggleUsersFilter({ commit, dispatch, state }, filters) {\n const defaultFilters = {\n local: false,\n external: false,\n active: false,\n deactivated: false\n }\n const currentFilters = { ...defaultFilters, ...filters }\n commit('SET_USERS_FILTERS', currentFilters)\n dispatch('SearchUsers', { query: state.searchQuery, page: 1 })\n }\n }\n}\n\nconst loadUsers = (commit, page, { users, count, page_size }) => {\n commit('SET_USERS', users)\n commit('SET_COUNT', count)\n commit('SET_PAGE', page)\n commit('SET_PAGE_SIZE', page_size)\n commit('SET_LOADING', false)\n}\n\nexport default users\n","const getters = {\n sidebar: state => state.app.sidebar,\n language: state => state.app.language,\n size: state => state.app.size,\n device: state => state.app.device,\n visitedViews: state => state.tagsView.visitedViews,\n cachedViews: state => state.tagsView.cachedViews,\n token: state => state.user.token,\n avatar: state => state.user.avatar,\n name: state => state.user.name,\n introduction: state => state.user.introduction,\n status: state => state.user.status,\n roles: state => state.user.roles,\n setting: state => state.user.setting,\n permission_routers: state => state.permission.routers,\n addRouters: state => state.permission.addRouters,\n errorLogs: state => state.errorLog.logs,\n users: state => state.users.fetchedUsers,\n authHost: state => state.user.authHost,\n settings: state => state.settings\n}\nexport default getters\n","import {\n listPacks,\n listRemotePacks,\n downloadFrom,\n reloadEmoji,\n createPack,\n deletePack,\n savePackMetadata,\n importFromFS,\n updatePackFile } from '@/api/emojiPacks'\nimport i18n from '@/lang'\nimport { Message } from 'element-ui'\n\nimport Vue from 'vue'\n\nconst packs = {\n state: {\n activeCollapseItems: [],\n localPacks: {},\n remoteInstance: '',\n remotePacks: {}\n },\n mutations: {\n SET_ACTIVE_COLLAPSE_ITEMS: (state, items) => {\n state.activeCollapseItems = items\n },\n SET_LOCAL_PACKS: (state, packs) => {\n state.localPacks = packs\n },\n SET_REMOTE_INSTANCE: (state, name) => {\n state.remoteInstance = name\n },\n SET_REMOTE_PACKS: (state, packs) => {\n state.remotePacks = packs\n },\n UPDATE_LOCAL_PACK_VAL: (state, { name, key, value }) => {\n Vue.set(state.localPacks[name]['pack'], key, value)\n },\n UPDATE_LOCAL_PACK_PACK: (state, { name, pack }) => {\n state.localPacks[name]['pack'] = pack\n },\n UPDATE_LOCAL_PACK_FILES: (state, { name, files }) => {\n // Use vue.set in case \"files\" was null\n Vue.set(\n state.localPacks[name],\n 'files',\n files\n )\n }\n },\n actions: {\n async CreatePack({ getters }, { name }) {\n await createPack(getters.authHost, getters.token, name)\n },\n async DeletePack({ getters }, { name }) {\n await deletePack(getters.authHost, getters.token, name)\n },\n async DownloadFrom({ getters }, { instanceAddress, packName, as }) {\n const result = await downloadFrom(getters.authHost, instanceAddress, packName, as, getters.token)\n\n if (result.data === 'ok') {\n Message({\n message: `${i18n.t('settings.successfullyDownloaded')} ${packName}`,\n type: 'success',\n duration: 5 * 1000\n })\n }\n },\n async ImportFromFS({ getters }) {\n const result = await importFromFS(getters.authHost, getters.token)\n\n if (result.status === 200) {\n const message = result.data.length > 0\n ? `${i18n.t('settings.successfullyImported')} ${result.data}`\n : i18n.t('settings.nowNewPacksToImport')\n\n Message({\n message,\n type: 'success',\n duration: 5 * 1000\n })\n }\n },\n async ReloadEmoji({ getters }) {\n await reloadEmoji(getters.authHost, getters.token)\n },\n async SavePackMetadata({ commit, getters, state }, { packName }) {\n const result =\n await savePackMetadata(\n getters.authHost,\n getters.token,\n packName,\n state.localPacks[packName]['pack']\n )\n\n if (result.status === 200) {\n Message({\n message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,\n type: 'success',\n duration: 5 * 1000\n })\n\n commit('UPDATE_LOCAL_PACK_PACK', { name: packName, pack: result.data })\n }\n },\n SetActiveCollapseItems({ commit, state }, activeItems) {\n commit('SET_ACTIVE_COLLAPSE_ITEMS', activeItems)\n },\n async SetLocalEmojiPacks({ commit, getters }) {\n const { data } = await listPacks(getters.authHost)\n commit('SET_LOCAL_PACKS', data)\n },\n async SetRemoteEmojiPacks({ commit, getters }, { remoteInstance }) {\n const { data } = await listRemotePacks(getters.authHost, getters.token, remoteInstance)\n\n commit('SET_REMOTE_INSTANCE', remoteInstance)\n commit('SET_REMOTE_PACKS', data)\n },\n async UpdateAndSavePackFile({ commit, getters }, args) {\n const result = await updatePackFile(getters.authHost, getters.token, args)\n\n if (result.status === 200) {\n const { packName } = args\n\n Message({\n message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,\n type: 'success',\n duration: 5 * 1000\n })\n\n commit('UPDATE_LOCAL_PACK_FILES', { name: packName, files: result.data })\n }\n },\n async UpdateLocalPackVal({ commit }, args) {\n commit('UPDATE_LOCAL_PACK_VAL', args)\n }\n }\n}\n\nexport default packs\n","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport app from './modules/app'\nimport errorLog from './modules/errorLog'\nimport moderationLog from './modules/moderationLog'\nimport invites from './modules/invites'\nimport peers from './modules/peers'\nimport permission from './modules/permission'\nimport relays from './modules/relays'\nimport reports from './modules/reports'\nimport settings from './modules/settings'\nimport status from './modules/status'\nimport tagsView from './modules/tagsView'\nimport user from './modules/user'\nimport userProfile from './modules/userProfile'\nimport users from './modules/users'\nimport getters from './getters'\nimport emojiPacks from './modules/emojiPacks.js'\n\nVue.use(Vuex)\n\nconst store = new Vuex.Store({\n modules: {\n app,\n errorLog,\n moderationLog,\n invites,\n peers,\n permission,\n relays,\n reports,\n settings,\n status,\n tagsView,\n user,\n userProfile,\n users,\n emojiPacks\n },\n getters\n})\n\nexport default store\n","import Vue from 'vue'\nimport SvgIcon from '@/components/element-ui/SvgIcon'// svg组件\n\n// register globally\nVue.component('svg-icon', SvgIcon)\n\nconst req = require.context('./svg', false, /\\.svg$/)\nconst requireAll = requireContext => requireContext.keys().map(requireContext)\nrequireAll(req)\n","import Vue from 'vue'\nimport store from './store'\n\n// you can set only in production env show the error-log\nif (process.env.NODE_ENV === 'production') {\n Vue.config.errorHandler = function(err, vm, info, a) {\n // Don't ask me why I use Vue.nextTick, it just a hack.\n // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500\n Vue.nextTick(() => {\n store.dispatch('addErrorLog', {\n err,\n vm,\n info,\n url: window.location.href\n })\n console.error(err, info)\n })\n }\n}\n","import router from './router'\nimport store from './store'\nimport { Message } from 'element-ui'\nimport NProgress from 'nprogress' // progress bar\nimport 'nprogress/nprogress.css'// progress bar style\nimport { getToken } from '@/utils/auth' // getToken from cookie\n\nNProgress.configure({ showSpinner: false })// NProgress Configuration\n\n// permission judge function\nfunction hasPermission(roles, permissionRoles) {\n if (roles.indexOf('admin') >= 0) return true // admin permission passed directly\n if (!permissionRoles) return true\n return roles.some(role => permissionRoles.indexOf(role) >= 0)\n}\n\nconst whiteList = ['/login', '/auth-redirect', '/login-pleroma']// no redirect whitelist\n\nexport const beforeEachRoute = (to, from, next) => {\n NProgress.start() // start progress bar\n if (getToken()) { // determine if there has token\n /* has token*/\n if (to.path === '/login') {\n next({ path: '/' })\n NProgress.done() // if current page is dashboard will not trigger\tafterEach hook, so manually handle it\n } else {\n if (store.getters.roles.length === 0) {\n store.dispatch('GetUserInfo').then(res => {\n const roles = res.data.pleroma.is_admin ? ['admin'] : []\n store.dispatch('GenerateRoutes', { roles }).then(() => {\n router.addRoutes(store.getters.addRouters)\n next({ ...to, replace: true })\n })\n }).catch((err) => {\n store.dispatch('FedLogOut').then(() => {\n Message({\n dangerouslyUseHTMLString: true,\n message: err,\n type: 'error',\n duration: 10 * 1000\n })\n next({ path: '/' })\n })\n })\n } else {\n if (hasPermission(store.getters.roles, to.meta.roles)) {\n next()\n } else {\n next({ path: '/401', replace: true, query: { noGoBack: true }})\n }\n }\n }\n } else {\n /* has no token*/\n if (whiteList.indexOf(to.path) !== -1) {\n next()\n } else {\n next(`/login?redirect=${to.path}`)\n NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it\n }\n }\n}\nrouter.beforeEach(beforeEachRoute)\n\nrouter.afterEach(() => {\n NProgress.done() // finish progress bar\n})\n","// set function parseTime,formatTime to filter\nexport { parseTime, formatTime } from '@/utils'\n\nfunction pluralize(time, label) {\n if (time === 1) {\n return time + label\n }\n return time + label + 's'\n}\n\nexport function timeAgo(time) {\n const between = Date.now() / 1000 - Number(time)\n if (between < 3600) {\n return pluralize(~~(between / 60), ' minute')\n } else if (between < 86400) {\n return pluralize(~~(between / 3600), ' hour')\n } else {\n return pluralize(~~(between / 86400), ' day')\n }\n}\n\n/* 数字 格式化*/\nexport function numberFormatter(num, digits) {\n const si = [\n { value: 1E18, symbol: 'E' },\n { value: 1E15, symbol: 'P' },\n { value: 1E12, symbol: 'T' },\n { value: 1E9, symbol: 'G' },\n { value: 1E6, symbol: 'M' },\n { value: 1E3, symbol: 'k' }\n ]\n for (let i = 0; i < si.length; i++) {\n if (num >= si[i].value) {\n return (num / si[i].value + 0.1).toFixed(digits).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol\n }\n }\n return num.toString()\n}\n\nexport function toThousandFilter(num) {\n return (+num || 0).toString().replace(/^-?\\d+/g, m => m.replace(/(?=(?!\\b)(\\d{3})+$)/g, ','))\n}\n","import Vue from 'vue'\n\nimport Cookies from 'js-cookie'\n\nimport 'normalize.css/normalize.css' // A modern alternative to CSS resets\n\nimport Element from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css'\n\nimport '@/styles/index.scss' // global css\n\nimport App from './App'\nimport store from './store'\nimport router from './router'\n\nimport i18n from './lang' // Internationalization\nimport './icons' // icon\nimport './errorLog' // error log\nimport './permission' // permission control\n\nimport * as filters from './filters' // global filters\n\nVue.use(Element, {\n size: Cookies.get('size') || 'medium', // set element-ui default size\n i18n: (key, value) => i18n.t(key, value)\n})\n\n// register global utility filters.\nObject.keys(filters).forEach(key => {\n Vue.filter(key, filters[key])\n})\n\nVue.config.productionTip = false\n\nnew Vue({\n el: '#app',\n router,\n store,\n i18n,\n render: h => h(App)\n})\n","import Cookies from 'js-cookie'\n\nconst TokenKey = 'Admin-Token'\nconst AuthHostKey = 'Auth-Host'\n\nexport function getToken() {\n return Cookies.get(TokenKey)\n}\n\nexport function setToken(token) {\n return Cookies.set(TokenKey, token)\n}\n\nexport function removeToken() {\n return Cookies.remove(TokenKey)\n}\n\nexport function getAuthHost() {\n return Cookies.get(AuthHostKey)\n}\n\nexport function setAuthHost(token) {\n return Cookies.set(AuthHostKey, token)\n}\n\nexport function removeAuthHost() {\n return Cookies.remove(AuthHostKey)\n}\n","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=1&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=1&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=style&index=0&id=f852c4f2&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=style&index=0&id=f852c4f2&scoped=true&lang=css&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-excel\",\n \"use\": \"icon-excel-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-guide\",\n \"use\": \"icon-guide-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-star\",\n \"use\": \"icon-star-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=style&index=0&id=28de7ff2&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=style&index=0&id=28de7ff2&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-wechat\",\n \"use\": \"icon-wechat-usage\",\n \"viewBox\": \"0 0 128 110\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import _ from 'lodash'\n\nexport const checkPartialUpdate = (settings, updatedSettings, description) => {\n return Object.keys(updatedSettings).reduce((acc, group) => {\n acc[group] = Object.keys(updatedSettings[group]).reduce((acc, key) => {\n if (!partialUpdate(group, key)) {\n const updated = Object.keys(settings[group][key]).reduce((acc, settingName) => {\n const setting = description\n .find(element => element.group === group && element.key === key).children\n .find(child => child.key === settingName)\n const type = setting ? setting.type : ''\n acc[settingName] = [type, settings[group][key][settingName]]\n return acc\n }, {})\n acc[key] = updated\n return acc\n }\n acc[key] = updatedSettings[group][key]\n return acc\n }, {})\n return acc\n }, {})\n}\n\nconst getCurrentValue = (type, value, path) => {\n if (type === 'state') {\n return _.get(value, path)\n } else {\n const [firstSettingName, ...restKeys] = path\n const firstSegment = value[firstSettingName]\n if (restKeys.length === 0 || !firstSegment) {\n return firstSegment || false\n } else {\n const secondSegment = (value, keys) => {\n const [element, ...rest] = keys\n return keys.length === 0 ? value : secondSegment(value[1][element], rest)\n }\n return secondSegment(firstSegment, restKeys)\n }\n }\n}\n\nconst getValueWithoutKey = (key, [type, value]) => {\n if (type === 'atom' && value.length > 1) {\n return `:${value}`\n } else if (key === ':backends') {\n const index = value.findIndex(el => el === ':ex_syslogger')\n const updatedArray = value.slice()\n if (index !== -1) {\n updatedArray[index] = { 'tuple': ['ExSyslogger', ':ex_syslogger'] }\n }\n return updatedArray\n } else if (key === ':types') {\n return Object.keys(value).reduce((acc, key) => { return { ...acc, [key]: value[key][1] } }, {})\n }\n return value\n}\n\nexport const parseNonTuples = (key, value) => {\n if (key === ':backends') {\n const index = value.findIndex(el => typeof el === 'object' && el.tuple.includes(':ex_syslogger'))\n const updated = value.map((el, i) => i === index ? ':ex_syslogger' : el)\n return updated\n }\n if (key === ':args') {\n if (typeof value === 'string') {\n return [value]\n }\n const index = value.findIndex(el => typeof el === 'object' && el.tuple.includes('implode'))\n const updated = value.map((el, i) => i === index ? 'implode' : el)\n return updated\n }\n return value\n}\n// REFACTOR\nexport const parseTuples = (tuples, key) => {\n return tuples.reduce((accum, item) => {\n if (key === ':rate_limit') {\n accum[item.tuple[0]] = Array.isArray(item.tuple[1])\n ? item.tuple[1].map(el => el.tuple)\n : item.tuple[1].tuple\n } else if (item.tuple[0] === ':mascots') {\n accum[item.tuple[0]] = item.tuple[1].reduce((acc, mascot) => {\n return [...acc, { [mascot.tuple[0]]: { ...mascot.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}]\n }, [])\n } else if (Array.isArray(item.tuple[1]) &&\n (item.tuple[0] === ':groups' || item.tuple[0] === ':replace' || item.tuple[0] === ':retries')) {\n accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => {\n return [...acc, { [group.tuple[0]]: { value: group.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}]\n }, [])\n } else if (item.tuple[0] === ':crontab') {\n accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => {\n return { ...acc, [group.tuple[1]]: group.tuple[0] }\n }, {})\n } else if (item.tuple[0] === ':match_actor') {\n accum[item.tuple[0]] = Object.keys(item.tuple[1]).reduce((acc, regex) => {\n return [...acc, { [regex]: { value: item.tuple[1][regex], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}]\n }, [])\n } else if (item.tuple[0] === ':icons') {\n accum[item.tuple[0]] = item.tuple[1].map(icon => {\n return Object.keys(icon).map(name => {\n return { key: name, value: icon[name], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }\n })\n }, [])\n } else if (item.tuple[0] === ':prune') {\n accum[item.tuple[0]] = item.tuple[1] === ':disabled' ? [item.tuple[1]] : item.tuple[1].tuple\n } else if (item.tuple[0] === ':proxy_url') {\n accum[item.tuple[0]] = parseProxyUrl(item.tuple[1])\n } else if (item.tuple[0] === ':args') {\n accum[item.tuple[0]] = parseNonTuples(item.tuple[0], item.tuple[1])\n } else if (Array.isArray(item.tuple[1]) &&\n (typeof item.tuple[1][0] === 'object' && !Array.isArray(item.tuple[1][0])) && item.tuple[1][0]['tuple']) {\n accum[item.tuple[0]] = parseTuples(item.tuple[1], item.tuple[0])\n } else if (Array.isArray(item.tuple[1])) {\n accum[item.tuple[0]] = item.tuple[1]\n } else if (item.tuple[0] === ':ip') {\n accum[item.tuple[0]] = item.tuple[1].tuple.join('.')\n } else if (item.tuple[1] && typeof item.tuple[1] === 'object') {\n accum[item.tuple[0]] = parseObject(item.tuple[1])\n } else {\n accum[item.tuple[0]] = item.tuple[1]\n }\n return accum\n }, {})\n}\n\nconst parseObject = object => {\n return Object.keys(object).reduce((acc, item) => {\n acc[item] = object[item]\n return acc\n }, {})\n}\n\nconst parseProxyUrl = value => {\n if (value && !Array.isArray(value) &&\n typeof value === 'object' &&\n value.tuple.length === 3 &&\n value.tuple[0] === ':socks5') {\n const [, host, port] = value.tuple\n return { socks5: true, host, port }\n } else if (typeof value === 'string') {\n const [host, port] = value.split(':')\n return { socks5: false, host, port }\n }\n return { socks5: false, host: null, port: null }\n}\n\nconst partialUpdate = (group, key) => {\n return !(group === ':auto_linker' && key === ':opts')\n}\n\nexport const processNested = (valueForState, valueForUpdatedSettings, group, parentKey, parents, settings, updatedSettings) => {\n const [{ key, type }, ...otherParents] = parents\n const path = [group, parentKey, ...parents.reverse().map(parent => parent.key).slice(0, -1)]\n\n let updatedValueForState = valueExists('state', settings, path)\n ? { ...getCurrentValue('state', settings[group][parentKey], parents.map(el => el.key).slice(0, -1)),\n ...{ [key]: valueForState }}\n : { [key]: valueForState }\n let updatedValueForUpdatedSettings = valueExists('updatedSettings', updatedSettings, path)\n ? { ...getCurrentValue('updatedSettings', updatedSettings[group][parentKey], parents.map(el => el.key).slice(0, -1))[1],\n ...{ [key]: [type, valueForUpdatedSettings] }}\n : { [key]: [type, valueForUpdatedSettings] }\n\n if (group === ':mime' && parents[0].key === ':types') {\n updatedValueForState = settings[group][parents[0].key]\n ? { ...settings[group][parents[0].key].value, ...updatedValueForState }\n : updatedValueForState\n updatedValueForUpdatedSettings = settings[group][parents[0].key]\n ? { ...Object.keys(settings[group][parents[0].key].value)\n .reduce((acc, el) => {\n return { ...acc, [el]: [type, settings[group][parents[0].key].value[el]] }\n }, {}),\n ...updatedValueForUpdatedSettings }\n : updatedValueForUpdatedSettings\n }\n\n return otherParents.length === 1\n ? { valueForState: updatedValueForState, valueForUpdatedSettings: updatedValueForUpdatedSettings, setting: otherParents[0] }\n : processNested(updatedValueForState, updatedValueForUpdatedSettings, group, parentKey, otherParents, settings, updatedSettings)\n}\n\nconst valueExists = (type, value, path) => {\n if (type === 'state') {\n return _.get(value, path)\n } else {\n const [group, key, firstSettingName, ...restKeys] = path\n const firstSegment = _.get(value, [group, key, firstSettingName])\n if (restKeys.length === 0 || !firstSegment) {\n return firstSegment || false\n } else {\n const secondSegment = (value, keys) => {\n if (keys.length === 0) {\n return true\n }\n const [element, ...rest] = keys\n return value[1][element] ? secondSegment(value[1][element], rest) : false\n }\n return secondSegment(firstSegment, restKeys)\n }\n }\n}\n\nexport const valueHasTuples = (key, value) => {\n const valueIsArrayOfNonObjects = Array.isArray(value) && value.length > 0 && value.every(el => typeof el !== 'object')\n return key === ':meta' ||\n key === ':types' ||\n key === ':backends' ||\n key === ':compiled_template_engines' ||\n key === ':compiled_format_encoders' ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null ||\n valueIsArrayOfNonObjects\n}\n\nexport const wrapUpdatedSettings = (group, settings, currentState) => {\n return Object.keys(settings).map((key) => {\n return settings[key]._value\n ? { group, key, value: getValueWithoutKey(key, settings[key]._value) }\n : { group, key, value: wrapValues(settings[key], currentState[group][key]) }\n })\n}\n\nconst wrapValues = (settings, currentState) => {\n return Object.keys(settings).map(setting => {\n const [type, value] = settings[setting]\n if (\n type === 'keyword' ||\n type.includes('keyword') ||\n type.includes('tuple') && type.includes('list') ||\n setting === ':replace'\n ) {\n return { 'tuple': [setting, wrapValues(value, currentState)] }\n } else if (type === 'atom' && value.length > 0) {\n return { 'tuple': [setting, `:${value}`] }\n } else if (type.includes('tuple') && (type.includes('string') || type.includes('atom'))) {\n return typeof value === 'string'\n ? { 'tuple': [setting, value] }\n : { 'tuple': [setting, { 'tuple': value }] }\n } else if (type === 'reversed_tuple') {\n return { 'tuple': [value, setting] }\n } else if (type === 'map') {\n const mapValue = Object.keys(value).reduce((acc, key) => {\n acc[key] = setting === ':match_actor' ? value[key] : value[key][1]\n return acc\n }, {})\n const mapCurrentState = setting === ':match_actor'\n ? currentState[setting].reduce((acc, element) => {\n return { ...acc, ...{ [Object.keys(element)[0]]: Object.values(element)[0].value }}\n }, {})\n : currentState[setting]\n return { 'tuple': [setting, { ...mapCurrentState, ...mapValue }] }\n } else if (setting === ':ip') {\n const ip = value.split('.').map(s => parseInt(s, 10))\n return { 'tuple': [setting, { 'tuple': ip }] }\n } else if (setting === ':args') {\n const index = value.findIndex(el => el === 'implode')\n const updatedArray = value.slice()\n if (index !== -1) {\n updatedArray[index] = { 'tuple': ['implode', '1'] }\n }\n return { 'tuple': [setting, updatedArray] }\n } else {\n return { 'tuple': [setting, value] }\n }\n })\n}\n\nexport const formSearchObject = description => {\n const parseNestedSettings = (description, label, key) => description.reduce((acc, setting) => {\n const searchArray = _.compact([setting.key, setting.label, setting.description]).map(el => el.toLowerCase())\n const resultObject = { label: setting.label, key: setting.key || setting.group, groupKey: key, groupLabel: label, search: searchArray }\n if (setting.children) {\n const updatedAcc = [...acc, resultObject]\n return [...updatedAcc, ...parseNestedSettings(setting.children, label, key)]\n }\n return [...acc, resultObject]\n }, [])\n\n return description.reduce((acc, setting) => {\n const searchArray = _.compact([setting.key, setting.label, setting.description]).map(el => el.toLowerCase())\n const resultObject = { label: setting.label, key: setting.key || setting.group, groupKey: setting.key || setting.group, groupLabel: setting.label, search: searchArray }\n if (setting.children) {\n const updatedAcc = !setting.key && setting.group === ':pleroma' ? acc : [...acc, resultObject]\n return [...updatedAcc, ...parseNestedSettings(setting.children, setting.label, setting.key || setting.group)]\n }\n return !setting.key && setting.group === ':pleroma' ? acc : [...acc, resultObject]\n }, [])\n}\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-size\",\n \"use\": \"icon-size-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-zip\",\n \"use\": \"icon-zip-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-tab\",\n \"use\": \"icon-tab-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-search\",\n \"use\": \"icon-search-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-tree\",\n \"use\": \"icon-tree-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-documentation\",\n \"use\": \"icon-documentation-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-drag\",\n \"use\": \"icon-drag-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=17178ffc&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=17178ffc&scoped=true&lang=css&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-fullscreen\",\n \"use\": \"icon-fullscreen-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import Vue from 'vue'\nimport VueI18n from 'vue-i18n'\nimport Cookies from 'js-cookie'\nimport elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang\nimport elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' // element-ui lang\nimport elementEsLocale from 'element-ui/lib/locale/lang/es' // element-ui lang\nimport enLocale from './en'\nimport zhLocale from './zh'\nimport esLocale from './es'\nimport ocLocale from './oc'\n\nVue.use(VueI18n)\n\nconst messages = {\n en: {\n ...enLocale,\n ...elementEnLocale\n },\n zh: {\n ...zhLocale,\n ...elementZhLocale\n },\n es: {\n ...esLocale,\n ...elementEsLocale\n },\n oc: {\n ...ocLocale\n }\n}\n\nconst i18n = new VueI18n({\n // set locale\n // options: en | zh | es | oc\n locale: Cookies.get('language') || 'en',\n // set locale messages\n messages\n})\n\nexport default i18n\n","export default {\n route: {\n dashboard: 'Dashboard',\n introduction: 'Introduction',\n documentation: 'Documentation',\n guide: 'Guide',\n permission: 'Permission',\n pagePermission: 'Page Permission',\n directivePermission: 'Directive Permission',\n icons: 'Icons',\n components: 'Components',\n componentIndex: 'Introduction',\n markdown: 'Markdown',\n jsonEditor: 'JSON Editor',\n dndList: 'Dnd List',\n splitPane: 'SplitPane',\n avatarUpload: 'Avatar Upload',\n dropzone: 'Dropzone',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: 'Mixin',\n backToTop: 'BackToTop',\n dragDialog: 'Drag Dialog',\n dragSelect: 'Drag Select',\n dragKanban: 'Drag Kanban',\n charts: 'Charts',\n keyboardChart: 'Keyboard Chart',\n lineChart: 'Line Chart',\n mixChart: 'Mix Chart',\n example: 'Example',\n nested: 'Nested Routes',\n menu1: 'Menu 1',\n 'menu1-1': 'Menu 1-1',\n 'menu1-2': 'Menu 1-2',\n 'menu1-2-1': 'Menu 1-2-1',\n 'menu1-2-2': 'Menu 1-2-2',\n 'menu1-3': 'Menu 1-3',\n menu2: 'Menu 2',\n Table: 'Table',\n dynamicTable: 'Dynamic Table',\n dragTable: 'Drag Table',\n inlineEditTable: 'Inline Edit',\n complexTable: 'Complex Table',\n treeTable: 'Tree Table',\n customTreeTable: 'Custom TreeTable',\n tab: 'Tab',\n form: 'Form',\n createArticle: 'Create Article',\n editArticle: 'Edit Article',\n articleList: 'Article List',\n errorPages: 'Error Pages',\n page401: '401',\n page404: '404',\n errorLog: 'Error Log',\n excel: 'Excel',\n exportExcel: 'Export Excel',\n selectExcel: 'Export Selected',\n uploadExcel: 'Upload Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Export Zip',\n theme: 'Theme',\n clipboardDemo: 'Clipboard',\n i18n: 'I18n',\n externalLink: 'External Link',\n users: 'Users',\n reports: 'Reports',\n settings: 'Settings',\n moderationLog: 'Moderation Log',\n 'emoji-packs': 'Emoji packs'\n },\n navbar: {\n logOut: 'Log Out',\n dashboard: 'Dashboard',\n github: 'Github',\n theme: 'Theme',\n size: 'Global Size'\n },\n login: {\n title: 'Login Form',\n logIn: 'Log in',\n logInViaPleromaFE: 'Log in via PleromaFE',\n username: 'username@host',\n password: 'password',\n omitHostname: 'omit hostname if Pleroma is located on this domain',\n errorMessage: 'Username must contain username and host, e.g. john@pleroma.social',\n any: 'any',\n thirdparty: 'Or connect with',\n pleromaFELoginFailed: 'Failed to login via PleromaFE, please login with username/password',\n pleromaFELoginSucceed: 'Logged in via PleromaFE'\n },\n documentation: {\n documentation: 'Documentation',\n github: 'Github Repository'\n },\n permission: {\n roles: 'Your roles',\n switchRoles: 'Switch roles',\n tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.'\n },\n guide: {\n description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',\n button: 'Show Guide'\n },\n components: {\n documentation: 'Documentation',\n dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.',\n stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',\n backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',\n backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',\n imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'\n },\n table: {\n dynamicTips1: 'Fixed header, sorted by header order',\n dynamicTips2: 'Not fixed header, sorted by click order',\n dragTips1: 'The default order',\n dragTips2: 'The after dragging order',\n title: 'Title',\n importance: 'Imp',\n type: 'Type',\n remark: 'Remark',\n search: 'Search',\n add: 'Add',\n export: 'Export',\n reviewer: 'reviewer',\n id: 'ID',\n date: 'Date',\n author: 'Author',\n readings: 'Readings',\n status: 'Status',\n actions: 'Actions',\n edit: 'Edit',\n publish: 'Publish',\n draft: 'Draft',\n delete: 'Delete',\n cancel: 'Cancel',\n confirm: 'Confirm'\n },\n errorLog: {\n tips: 'Please click the bug icon in the upper right corner',\n description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',\n documentation: 'Document introduction'\n },\n excel: {\n export: 'Export',\n selectedExport: 'Export Selected Items',\n placeholder: 'Please enter the file name(default excel-list)'\n },\n zip: {\n export: 'Export',\n placeholder: 'Please enter the file name(default file)'\n },\n pdf: {\n tips: 'Here we use window.print() to implement the feature of downloading pdf.'\n },\n theme: {\n change: 'Change Theme',\n documentation: 'Theme documentation',\n tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'\n },\n tagsView: {\n refresh: 'Refresh',\n close: 'Close',\n closeOthers: 'Close Others',\n closeAll: 'Close All'\n },\n users: {\n users: 'Users',\n localUsersOnly: 'Local users only',\n search: 'Search',\n id: 'ID',\n name: 'Name',\n status: 'Status',\n local: 'local',\n external: 'external',\n deactivated: 'deactivated',\n active: 'active',\n unconfirmed: 'unconfirmed',\n actions: 'Actions',\n activate: 'Activate',\n deactivate: 'Deactivate',\n admin: 'admin',\n moderator: 'moderator',\n moderation: 'Moderation',\n revokeAdmin: 'Revoke Admin',\n grantAdmin: 'Grant Admin',\n revokeModerator: 'Revoke Moderator',\n grantModerator: 'Grant Moderator',\n activateAccount: 'Activate Account',\n activateAccounts: 'Activate Accounts',\n deactivateAccount: 'Deactivate Account',\n deactivateAccounts: 'Deactivate Accounts',\n deleteAccount: 'Delete Account',\n deleteAccounts: 'Delete Accounts',\n forceNsfw: 'Force posts to be NSFW',\n stripMedia: 'Force posts to not have media',\n forceUnlisted: 'Force posts to be unlisted',\n sandbox: 'Force posts to be followers-only',\n disableRemoteSubscription: 'Disallow following user from remote instances',\n disableRemoteSubscriptionForMultiple: 'Disallow following users from remote instances',\n disableAnySubscription: 'Disallow following user at all',\n disableAnySubscriptionForMultiple: 'Disallow following users at all',\n requirePasswordReset: 'Require password reset on next login',\n selectUsers: 'Select users to apply actions to multiple users',\n moderateUser: 'Moderate user',\n moderateUsers: 'Moderate multiple users',\n createAccount: 'Create new account',\n apply: 'apply',\n remove: 'remove',\n grantRightConfirmation: 'Are you sure you want to grant {right} rights to all selected users?',\n revokeRightConfirmation: 'Are you sure you want to revoke {right} rights from all selected users?',\n activateMultipleUsersConfirmation: 'Are you sure you want to activate accounts of all selected users?',\n deactivateMultipleUsersConfirmation: 'Are you sure you want to deactivate accounts of all selected users?',\n deleteMultipleUsersConfirmation: 'Are you sure you want to delete accounts of all selected users?',\n addTagForMultipleUsersConfirmation: 'Are you sure you want to apply tag to all selected users?',\n removeTagFromMultipleUsersConfirmation: 'Are you sure you want to remove tag from all selected users?',\n requirePasswordResetConfirmation: 'Are you sure you want to require password reset for all selected users?',\n confirmAccountsConfirmation: 'Are you sure you want to confirm emails for all selected users?',\n resendEmailConfirmation: 'Are you sure you want to resend confirmation email for all selected users?',\n mailerMustBeEnabled: 'To require user\\'s password reset you must enable mailer.',\n ok: 'Okay',\n completed: 'Completed',\n cancel: 'Cancel',\n canceled: 'Canceled',\n username: 'Username',\n email: 'E-mail',\n password: 'Password',\n create: 'Create',\n submitFormError: 'There are invalid values in the form. Please fix them before continuing.',\n emptyEmailError: 'Please input the e-mail',\n invalidEmailError: 'Please input valid e-mail',\n emptyPasswordError: 'Please input the password',\n emptyNicknameError: 'Please input the username',\n invalidNicknameError: 'Username can include \"a-z\", \"A-Z\" and \"0-9\" characters',\n getPasswordResetToken: 'Get password reset token',\n passwordResetTokenCreated: 'Password reset token was created',\n accountCreated: 'New account was created!',\n unconfirmedEmail: 'User didn\\'t confirm the email',\n confirmAccount: 'Confirm account',\n confirmAccounts: 'Confirm accounts',\n resendConfirmation: 'Resend confirmation email'\n },\n statuses: {\n statuses: 'Statuses',\n instanceFilter: 'Instance filter',\n loadMore: 'Load more',\n noInstances: 'No other instances found',\n onlyLocalStatuses: 'Show only local statuses',\n showPrivateStatuses: 'Show private statuses',\n direct: 'Direct',\n private: 'Private',\n public: 'Public',\n unlisted: 'Unlisted'\n },\n userProfile: {\n tags: 'Tags',\n moderator: 'Moderator',\n admin: 'Admin',\n local: 'local',\n external: 'external',\n localUppercase: 'Local',\n nickname: 'Nickname',\n recentStatuses: 'Recent Statuses',\n roles: 'Roles',\n activeUppercase: 'Active',\n active: 'active',\n deactivated: 'deactivated',\n noStatuses: 'No statuses to show',\n securitySettings: {\n email: 'Email',\n password: 'Password',\n securitySettings: 'Security settings',\n passwordChangeWarning1: 'Setting a new password will cause the user to be signed out from any client they have used before.',\n passwordChangeWarning2: 'When the user signs in with this password, they will be asked to set a new one.',\n passwordLengthNotice: 'Make sure it\\'s at least {minLength} characters long.',\n inputNewEmail: 'Input new email',\n inputNewPassword: 'Input new password',\n passwordUpdated: 'The password has been updated',\n emailUpdated: 'The email has been updated',\n success: 'Success',\n submit: 'Submit',\n close: 'Close'\n }\n },\n usersFilter: {\n inputPlaceholder: 'Select filter',\n byUserType: 'By user type',\n local: 'Local',\n external: 'External',\n byStatus: 'By status',\n active: 'Active',\n deactivated: 'Deactivated'\n },\n reports: {\n reports: 'Reports',\n report: 'Report',\n reply: 'Reply',\n from: 'From',\n showNotes: 'Show notes',\n newNote: 'New note',\n submit: 'Submit',\n confirmMsg: 'Are you sure you want to delete this note?',\n delete: 'Delete',\n cancel: 'Cancel',\n deleteCompleted: 'Delete comleted',\n deleteCanceled: 'Delete canceled',\n noNotes: 'No notes to display',\n changeState: \"Change report's state\",\n changeAllReports: 'Change all reports',\n changeScope: 'Change scope',\n moderateUser: 'Moderate user',\n resolve: 'Resolve',\n reopen: 'Reopen',\n close: 'Close',\n resolveAll: 'Resolve all',\n reopenAll: 'Reopen all',\n closeAll: 'Close all',\n addSensitive: 'Add Sensitive flag',\n removeSensitive: 'Remove Sensitive flag',\n public: 'Make status public',\n private: 'Make status private',\n unlisted: 'Make status unlisted',\n sensitive: 'Sensitive',\n deleteStatus: 'Delete status',\n reportOn: 'Report on',\n reportsOn: 'Reports on',\n id: 'ID',\n account: 'Account',\n actor: 'Actor',\n actors: 'Actors',\n content: 'Content',\n reportedStatus: 'Reported status',\n statusDeleted: 'This status has been deleted',\n leaveNote: 'Leave a note',\n postNote: 'Send',\n deleteNote: 'Delete',\n notFound: 'account not found'\n },\n reportsFilter: {\n inputPlaceholder: 'Select filter',\n open: 'Open',\n closed: 'Closed',\n resolved: 'Resolved'\n },\n moderationLog: {\n moderationLog: 'Moderation Log'\n },\n settings: {\n settings: 'Settings',\n instance: 'Instance',\n upload: 'Upload',\n mailer: 'Mailer',\n logger: 'Logger',\n activityPub: 'ActivityPub',\n auth: 'Authentication',\n autoLinker: 'Auto Linker',\n captcha: 'Captcha',\n frontend: 'Frontend',\n http: 'HTTP',\n mrf: 'MRF',\n mediaProxy: 'Media Proxy',\n metadata: 'Metadata',\n gopher: 'Gopher',\n jobQueue: 'Job queue',\n webPush: 'Web push encryption',\n esshd: 'BBS / SSH access',\n rateLimiters: 'Rate limiters',\n other: 'Other',\n relays: 'Relays',\n follow: 'Follow',\n followRelay: 'Follow new relay',\n instanceUrl: 'Instance URL',\n success: 'Settings changed successfully!',\n description: 'Description',\n removeFromDB: 'Remove setting from the DB',\n successfullyDownloaded: 'Successfully downloaded',\n successfullyImported: 'Successfully imported',\n nowNewPacksToImport: 'No new packs to import',\n successfullyUpdated: 'Successfully updated',\n metadatLowerCase: 'metadata',\n files: 'files',\n successfullyRemoved: 'Setting removed successfully!',\n seeDocs: 'See Documentation',\n assets: 'Assets',\n emoji: 'Emoji',\n markup: 'Markup settings',\n corsPlug: 'CORS plug config',\n instanceReboot: 'Reboot Instance',\n restartApp: 'You must restart the instance to apply settings',\n restartSuccess: 'Instance rebooted successfully!'\n },\n invites: {\n inviteTokens: 'Invite tokens',\n createInviteToken: 'Generate invite token',\n pickDate: 'Pick a date',\n maxUse: 'Max use',\n expiresAt: 'Expires at',\n tokenCreated: 'Invite token was created',\n token: 'Token',\n inviteLink: 'Invite link',\n uses: 'Uses',\n used: 'Used',\n cancel: 'Cancel',\n create: 'Create',\n revoke: 'Revoke',\n id: 'ID',\n actions: 'Actions',\n active: 'Active',\n inviteUserViaEmail: 'Invite user via email',\n sendRegistration: 'Send registration invite via email',\n email: 'Email',\n name: 'Name',\n emptyEmailError: 'Please input the e-mail',\n invalidEmailError: 'Please input valid e-mail',\n emailSent: 'Invite was sent',\n submitFormError: 'There are invalid values in the form. Please fix them before continuing.',\n inviteViaEmailAlert: 'To send invite via email make sure to enable `invites_enabled` and disable `registrations_open`'\n },\n emoji: {\n emojiPacks: 'Emoji packs',\n reloaded: 'Emoji reloaded successfully!',\n refreshed: 'Emoji refreshed successfully!',\n importEmojiTooltip: 'Importing from the filesystem will scan the directories and import those without pack.json but with emoji.txt or without neither',\n reloadEmoji: 'Reload emoji',\n importPacks: 'Import packs from the server filesystem',\n localPacks: 'Local packs',\n refreshLocalPacks: 'Refresh local packs',\n createLocalPack: 'Create a new local pack',\n remotePacks: 'Remote packs',\n remoteInstanceAddress: 'Remote instance address',\n refreshRemote: 'Refresh remote packs',\n sharePack: 'Share pack',\n required: 'required',\n homepage: 'Homepage',\n description: 'Description',\n packs: 'Packs',\n license: 'License',\n shortcode: 'Shortcode',\n fallbackSrc: 'Fallback source',\n fallbackSrcSha: 'Fallback source SHA',\n saveMetadata: 'Save metadata',\n deletePack: 'Delete pack',\n downloadPack: 'Download pack',\n downloadPackArchive: 'Download pack archive',\n addNewEmoji: 'Add new emoji to the pack',\n manageEmoji: 'Manage existing emoji',\n thisWillDownload: 'This will download the',\n downloadToCurrentInstance: 'pack to the current instance under the name',\n canBeChanged: 'can be changed below',\n willBeUsable: 'It will then be usable and shareable from the current instance',\n downloadAsOptional: 'Download as (optional)',\n downloadSharedPack: 'Download shared pack to current instance',\n downloadSharedPackMobile: 'Download pack to instance',\n optional: 'optional',\n uploadFile: 'Upload a file',\n url: 'URL',\n clickToUpload: 'Click to upload',\n upload: 'Upload',\n customFilename: 'Custom filename',\n customFilenameDesc: 'Custom file name (optional)',\n file: 'File',\n localPack: 'Local pack',\n leaveEmptyShortcode: 'leave empty to use the same shortcode',\n leaveEmptyFilename: 'leave empty to use the same filename',\n update: 'Update',\n remove: 'Remove',\n selectLocalPack: 'Select the local pack to copy to',\n specifyShortcode: 'Specify a custom shortcode',\n specifyFilename: 'Specify a custom filename',\n copy: 'Copy',\n copyToLocalPack: 'Copy to local pack'\n }\n}\n","export default {\n route: {\n dashboard: '首页',\n introduction: '简述',\n documentation: '文档',\n guide: '引导页',\n permission: '权限测试页',\n pagePermission: '页面权限',\n directivePermission: '指令权限',\n icons: '图标',\n components: '组件',\n componentIndex: '介绍',\n markdown: 'Markdown',\n jsonEditor: 'JSON编辑器',\n dndList: '列表拖拽',\n splitPane: 'Splitpane',\n avatarUpload: '头像上传',\n dropzone: 'Dropzone',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: '小组件',\n backToTop: '返回顶部',\n dragDialog: '拖拽 Dialog',\n dragSelect: '拖拽 Select',\n dragKanban: '可拖拽看板',\n charts: '图表',\n keyboardChart: '键盘图表',\n lineChart: '折线图',\n mixChart: '混合图表',\n example: '综合实例',\n nested: '路由嵌套',\n menu1: '菜单1',\n 'menu1-1': '菜单1-1',\n 'menu1-2': '菜单1-2',\n 'menu1-2-1': '菜单1-2-1',\n 'menu1-2-2': '菜单1-2-2',\n 'menu1-3': '菜单1-3',\n menu2: '菜单2',\n Table: 'Table',\n dynamicTable: '动态Table',\n dragTable: '拖拽Table',\n inlineEditTable: 'Table内编辑',\n complexTable: '综合Table',\n treeTable: '树形表格',\n customTreeTable: '自定义树表',\n tab: 'Tab',\n form: '表单',\n createArticle: '创建文章',\n editArticle: '编辑文章',\n articleList: '文章列表',\n errorPages: '错误页面',\n page401: '401',\n page404: '404',\n errorLog: '错误日志',\n excel: 'Excel',\n exportExcel: 'Export Excel',\n selectExcel: 'Export Selected',\n uploadExcel: 'Upload Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Export Zip',\n theme: '换肤',\n clipboardDemo: 'Clipboard',\n i18n: '国际化',\n externalLink: '外链'\n },\n navbar: {\n logOut: '退出登录',\n dashboard: '首页',\n github: '项目地址',\n theme: '换肤',\n size: '布局大小'\n },\n login: {\n title: '系统登录',\n logIn: '登录',\n username: '账号',\n password: '密码',\n any: '随便填',\n thirdparty: '第三方登录',\n thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!'\n },\n documentation: {\n documentation: '文档',\n github: 'Github 地址'\n },\n permission: {\n roles: '你的权限',\n switchRoles: '切换权限',\n tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。'\n },\n guide: {\n description: '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于',\n button: '打开引导'\n },\n components: {\n documentation: '文档',\n dropzoneTips: '由于我司业务有特殊需求,而且要传七牛 所以没用第三方,选择了自己封装。代码非常的简单,具体代码你可以在这里看到 @/components/element-ui/Dropzone',\n stickyTips: '当页面滚动到预设的位置会吸附在顶部',\n backToTopTips1: '页面滚动到指定位置会在右下角出现返回顶部按钮',\n backToTopTips2: '可自定义按钮的样式、show/hide、出现的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素',\n imageUploadTips: '由于我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。'\n },\n table: {\n dynamicTips1: '固定表头, 按照表头顺序排序',\n dynamicTips2: '不固定表头, 按照点击顺序排序',\n dragTips1: '默认顺序',\n dragTips2: '拖拽后顺序',\n title: '标题',\n importance: '重要性',\n type: '类型',\n remark: '点评',\n search: '搜索',\n add: '添加',\n export: '导出',\n reviewer: '审核人',\n id: '序号',\n date: '时间',\n author: '作者',\n readings: '阅读数',\n status: '状态',\n actions: '操作',\n edit: '编辑',\n publish: '发布',\n draft: '草稿',\n delete: '删除',\n cancel: '取 消',\n confirm: '确 定'\n },\n errorLog: {\n tips: '请点击右上角bug小图标',\n description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。',\n documentation: '文档介绍'\n },\n excel: {\n export: '导出',\n selectedExport: '导出已选择项',\n placeholder: '请输入文件名(默认excel-list)'\n },\n zip: {\n export: '导出',\n placeholder: '请输入文件名(默认file)'\n },\n pdf: {\n tips: '这里使用 window.print() 来实现下载pdf的功能'\n },\n theme: {\n change: '换肤',\n documentation: '换肤文档',\n tips: 'Tips: 它区别于 navbar 上的 theme-pick, 是两种不同的换肤方法,各自有不同的应用场景,具体请参考文档。'\n },\n tagsView: {\n refresh: '刷新',\n close: '关闭',\n closeOthers: '关闭其它',\n closeAll: '关闭所有'\n }\n}\n","export default {\n route: {\n dashboard: 'Panel de control',\n introduction: 'Introducción',\n documentation: 'Documentación',\n guide: 'Guía',\n permission: 'Permisos',\n pagePermission: 'Permisos de la página',\n directivePermission: 'Permisos de la directiva',\n icons: 'Iconos',\n components: 'Componentes',\n componentIndex: 'Introducción',\n markdown: 'Markdown',\n jsonEditor: 'Editor JSON',\n dndList: 'Lista Dnd',\n splitPane: 'Panel dividido',\n avatarUpload: 'Subir avatar',\n dropzone: 'Subir ficheros',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: 'Mixin',\n backToTop: 'Ir arriba',\n dragDialog: 'Drag Dialog',\n dragSelect: 'Drag Select',\n dragKanban: 'Drag Kanban',\n charts: 'Gráficos',\n keyboardChart: 'Keyboard Chart',\n lineChart: 'Gráfico de líneas',\n mixChart: 'Mix Chart',\n example: 'Ejemplo',\n nested: 'Rutas anidadass',\n menu1: 'Menu 1',\n 'menu1-1': 'Menu 1-1',\n 'menu1-2': 'Menu 1-2',\n 'menu1-2-1': 'Menu 1-2-1',\n 'menu1-2-2': 'Menu 1-2-2',\n 'menu1-3': 'Menu 1-3',\n menu2: 'Menu 2',\n Table: 'Tabla',\n dynamicTable: 'Tabla dinámica',\n dragTable: 'Arrastrar tabla',\n inlineEditTable: 'Editor',\n complexTable: 'Complex Table',\n treeTable: 'Tree Table',\n customTreeTable: 'Custom TreeTable',\n tab: 'Pestaña',\n form: 'Formulario',\n createArticle: 'Crear artículo',\n editArticle: 'Editar artículo',\n articleList: 'Listado de artículos',\n errorPages: 'Páginas de error',\n page401: '401',\n page404: '404',\n errorLog: 'Registro de errores',\n excel: 'Excel',\n exportExcel: 'Exportar a Excel',\n selectExcel: 'Export seleccionado',\n uploadExcel: 'Subir Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Exportar a Zip',\n theme: 'Tema',\n clipboardDemo: 'Clipboard',\n i18n: 'I18n',\n externalLink: 'Enlace externo'\n },\n navbar: {\n logOut: 'Salir',\n dashboard: 'Panel de control',\n github: 'Github',\n theme: 'Tema',\n size: 'Tamaño global'\n },\n login: {\n title: 'Formulario de acceso',\n logIn: 'Acceso',\n username: 'Usuario',\n password: 'Contraseña',\n any: 'nada',\n thirdparty: 'Conectar con',\n thirdpartyTips: 'No se puede simular en local, así que combine su propia simulación de negocios. ! !'\n },\n documentation: {\n documentation: 'Documentación',\n github: 'Repositorio Github'\n },\n permission: {\n roles: 'Tus permisos',\n switchRoles: 'Cambiar permisos',\n tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.'\n },\n guide: {\n description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',\n button: 'Ver guía'\n },\n components: {\n documentation: 'Documentación',\n dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.',\n stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',\n backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',\n backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',\n imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'\n },\n table: {\n dynamicTips1: 'Fixed header, sorted by header order',\n dynamicTips2: 'Not fixed header, sorted by click order',\n dragTips1: 'Orden por defecto',\n dragTips2: 'The after dragging order',\n title: 'Título',\n importance: 'Importancia',\n type: 'Tipo',\n remark: 'Remark',\n search: 'Buscar',\n add: 'Añadir',\n export: 'Exportar',\n reviewer: 'reviewer',\n id: 'ID',\n date: 'Fecha',\n author: 'Autor',\n readings: 'Lector',\n status: 'Estado',\n actions: 'Acciones',\n edit: 'Editar',\n publish: 'Publicar',\n draft: 'Draft',\n delete: 'Eliminar',\n cancel: 'Cancelar',\n confirm: 'Confirmar'\n },\n errorLog: {\n tips: 'Please click the bug icon in the upper right corner',\n description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',\n documentation: 'Documento de introducción'\n },\n excel: {\n export: 'Exportar',\n selectedExport: 'Exportar seleccionados',\n placeholder: 'Por favor escribe un nombre de fichero'\n },\n zip: {\n export: 'Exportar',\n placeholder: 'Por favor escribe un nombre de fichero'\n },\n pdf: {\n tips: 'Here we use window.print() to implement the feature of downloading pdf.'\n },\n theme: {\n change: 'Cambiar tema',\n documentation: 'Documentación del tema',\n tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'\n },\n tagsView: {\n refresh: 'Actualizar',\n close: 'Cerrar',\n closeOthers: 'Cerrar otros',\n closeAll: 'Cerrar todos'\n }\n}\n","export default {\n route: {\n dashboard: 'Tablèu de bòrd',\n introduction: 'Introduccion',\n documentation: 'Documentacion',\n guide: 'Guida',\n permission: 'Autorizacions',\n pagePermission: 'Pagina d’autorizacion',\n directivePermission: 'Politica d’autorizacion',\n icons: 'Icònas',\n components: 'Compausants',\n componentIndex: 'Introduccion',\n markdown: 'Markdown',\n jsonEditor: 'JSON Editor',\n dndList: 'Dnd List',\n splitPane: 'SplitPane',\n avatarUpload: 'Mandadís d’avatar',\n dropzone: 'Dropzone',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: 'Mixin',\n backToTop: 'BackToTop',\n dragDialog: 'Drag Dialog',\n dragSelect: 'Drag Select',\n dragKanban: 'Drag Kanban',\n charts: 'Charts',\n keyboardChart: 'Keyboard Chart',\n lineChart: 'Line Chart',\n mixChart: 'Mix Chart',\n example: 'Exemple',\n nested: 'Rotas imbricadas',\n menu1: 'Menú 1',\n 'menu1-1': 'Menu 1-1',\n 'menu1-2': 'Menu 1-2',\n 'menu1-2-1': 'Menu 1-2-1',\n 'menu1-2-2': 'Menu 1-2-2',\n 'menu1-3': 'Menu 1-3',\n menu2: 'Menú 2',\n Table: 'Tablèu',\n dynamicTable: 'Tablèu dinamic',\n dragTable: 'Drag Table',\n inlineEditTable: 'Inline Edit',\n complexTable: 'Tablèu complèx',\n treeTable: 'Arborescéncia',\n customTreeTable: 'Arborescéncia personalizada',\n tab: 'Onglet',\n form: 'Formulari',\n createArticle: 'Crear un article',\n editArticle: 'Modificar l’article',\n articleList: 'Lista d’articles',\n errorPages: 'Paginas d’error',\n page401: '401',\n page404: '404',\n errorLog: 'Jornal d’error',\n excel: 'Excel',\n exportExcel: 'Exportacion Excel',\n selectExcel: 'Exportar los seleccionats',\n uploadExcel: 'Importacion Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Exportacion Zip',\n theme: 'Tèma',\n clipboardDemo: 'Clipboard',\n i18n: 'I18n',\n externalLink: 'Ligams extèrnes',\n users: 'Utilizaires'\n },\n navbar: {\n logOut: 'Desconnexion',\n dashboard: 'Tablèu de bòrd',\n github: 'Github',\n theme: 'Tèma',\n size: 'Talha totala'\n },\n login: {\n title: 'Formulari de connexion',\n logIn: 'Se connectar',\n username: 'Nom d’’utilizaire',\n password: 'Senhal',\n any: 'qual que siá',\n thirdparty: 'O se connectar amb',\n thirdpartyTips: 'Pòt pas èsser simulat en local, doncas montatz vòstra pròpria simulacion ! ! !'\n },\n documentation: {\n documentation: 'Documentacion',\n github: 'Repertòri Github'\n },\n permission: {\n roles: 'Vòstres ròtles',\n switchRoles: 'Cambiar de ròtle',\n tips: 'Dins qualques cases es pas de bon far d’utilizar v-permission, coma element d’onglet compausant, el-table-column o d’autres renduts dom asincròns que pòdon pas que foncionar amb un parametratge manual de v-if.'\n },\n guide: {\n description: 'La pagina de guida es utila pel monde que dintran dins lo projècte pel primièr còp. Podètz presentar en un mot las foncionalitats del projèctes. La demo es fondada sus ',\n button: 'Mostrar la guida'\n },\n components: {\n documentation: 'Documentacion',\n dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.',\n stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',\n backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',\n backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',\n imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'\n },\n table: {\n dynamicTips1: 'Bandièra fixa, triada per òrdre de bandièra',\n dynamicTips2: 'Bandièra pas fixa, triada per òrdre de clic',\n dragTips1: 'L’’òrdre per defaut',\n dragTips2: 'L’’òrdre aprèp lisar-depausar',\n title: 'Títol',\n importance: 'Imp',\n type: 'Tipe',\n remark: 'Remarca',\n search: 'Recercar',\n add: 'Ajustar',\n export: 'Exportar',\n reviewer: 'examinator',\n id: 'ID',\n date: 'Data',\n author: 'Autor',\n readings: 'Lecturas',\n status: 'Estatuts',\n actions: 'Accions',\n edit: 'Modificar',\n publish: 'Publicar',\n draft: 'Ensag',\n delete: 'Suprimir',\n cancel: 'Anullar',\n confirm: 'Confirmar'\n },\n errorLog: {\n tips: 'Mercés de clicar l’’icòna del babau amont a man drecha',\n description: 'Ara que lo sistèma de gestion es coma un spa, melhora l’experiéncia dels utilizaire mas aumenta tanben lo risc de problèmas sus la pagina, una pichona negligéncia pòt menar a un blocatge complèt de la pagina. Urosament Vue fornís de manièras per gerir las excepcions, trobar las errors o senhalar las excepcions.',\n documentation: 'Presentacion del document'\n },\n excel: {\n export: 'Exportar',\n selectedExport: 'Exportar los elements seleccionats',\n placeholder: 'Mercés de picar lo nom de fichièr (per defaut excel-list)'\n },\n zip: {\n export: 'Exportar',\n placeholder: 'Mercés de picar lo nom de fichièr (per defaut file)'\n },\n pdf: {\n tips: 'Aquí utilizam window.print() per prepausar lo telecargament de pdf.'\n },\n theme: {\n change: 'Cambiar lo tèma',\n documentation: 'Documentacion dels tèmas',\n tips: 'Astúcia : es diferent del theme-pick de la barra de navigacion, i a dos metòdes de personalizacion, caduna amb un biais de far diferent. Referiscam a la documentacion per mai de detalhs.'\n },\n tagsView: {\n refresh: 'Actualizar',\n close: 'Tampar',\n closeOthers: 'Tampar los autres',\n closeAll: 'Los tampar totes'\n }\n}\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nimport _ from 'lodash'\n\nexport async function deletePack(host, token, name) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${name}`,\n method: 'delete',\n headers: authHeaders(token)\n })\n}\n\nexport async function reloadEmoji(host, token) {\n return await request({\n baseURL: baseName(host),\n url: '/api/pleroma/admin/reload_emoji',\n method: 'post',\n headers: authHeaders(token)\n })\n}\n\nexport async function importFromFS(host, token) {\n return await request({\n baseURL: baseName(host),\n url: '/api/pleroma/emoji/packs/import_from_fs',\n method: 'post',\n headers: authHeaders(token)\n })\n}\n\nexport async function createPack(host, token, name) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${name}`,\n method: 'put',\n headers: authHeaders(token)\n })\n}\n\nexport async function listPacks(host) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/`,\n method: 'get'\n })\n}\n\nexport async function listRemotePacks(host, token, instance) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/list_from`,\n method: 'post',\n headers: authHeaders(token),\n data: { instance_address: baseName(instance) }\n })\n}\n\nexport async function downloadFrom(host, instance_address, pack_name, as, token) {\n if (as.trim() === '') {\n as = null\n }\n\n return await request({\n baseURL: baseName(host),\n url: '/api/pleroma/emoji/packs/download_from',\n method: 'post',\n headers: authHeaders(token),\n data: { instance_address: baseName(instance_address), pack_name, as },\n timeout: 0\n })\n}\n\nexport async function savePackMetadata(host, token, name, new_data) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${name}/update_metadata`,\n method: 'post',\n headers: authHeaders(token),\n data: { name, new_data },\n timeout: 0 // This might take a long time\n })\n}\n\nfunction fileUpdateFormData(d) {\n const data = new FormData()\n\n _.each(d, (v, k) => {\n data.set(k, v)\n })\n\n return data\n}\n\nexport async function updatePackFile(host, token, args) {\n let data = null\n\n switch (args.action) {\n case 'add': {\n const { shortcode, file, fileName } = args\n\n data = fileUpdateFormData({\n action: 'add',\n shortcode: shortcode,\n file: file\n })\n if (fileName.trim() !== '') {\n data.set('filename', fileName)\n }\n\n break\n }\n\n case 'update': {\n const { oldName, newName, newFilename } = args\n\n data = fileUpdateFormData({\n action: 'update',\n shortcode: oldName,\n new_shortcode: newName,\n new_filename: newFilename\n })\n\n break\n }\n\n case 'remove': {\n const { name } = args\n data = fileUpdateFormData({\n action: 'remove',\n shortcode: name\n })\n\n break\n }\n }\n\n const { packName } = args\n\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}/update_file`,\n method: 'post',\n headers: authHeaders(token),\n data: data,\n timeout: 0\n })\n}\n\nexport function addressOfEmojiInPack(host, packName, name) {\n return `${baseName(host)}/emoji/${packName}/${name}`\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-icon\",\n \"use\": \"icon-icon-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-404\",\n \"use\": \"icon-404-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-edit\",\n \"use\": \"icon-edit-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-lock\",\n \"use\": \"icon-lock-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-user\",\n \"use\": \"icon-user-usage\",\n \"viewBox\": \"0 0 130 130\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","// extracted by mini-css-extract-plugin\nmodule.exports = {\"menuText\":\"#bfcbd9\",\"menuActiveText\":\"#409EFF\",\"subMenuActiveText\":\"#f4f4f5\",\"menuBg\":\"#304156\",\"menuHover\":\"#263445\",\"subMenuBg\":\"#1f2d3d\",\"subMenuHover\":\"#001528\",\"sideBarWidth\":\"180px\"};","import axios from 'axios'\nimport { Message } from 'element-ui'\n\n// create an axios instance\nconst service = axios.create({\n timeout: 60000 // request timeout\n})\n\n// response interceptor\nservice.interceptors.response.use(\n response => response,\n error => {\n let errorMessage\n console.log(`Error ${error}`)\n\n if (error.response) {\n const edata = error.response.data.error ? error.response.data.error : error.response.data\n errorMessage = !error.response.headers['content-type'].includes('application/json')\n ? `${error.message}`\n : `${error.message} - ${edata}`\n } else {\n errorMessage = error\n }\n\n Message({\n message: errorMessage,\n type: 'error',\n duration: 5 * 1000\n })\n return Promise.reject(error)\n }\n)\n\nexport default service\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-clipboard\",\n \"use\": \"icon-clipboard-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-email\",\n \"use\": \"icon-email-usage\",\n \"viewBox\": \"0 0 128 96\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-chart\",\n \"use\": \"icon-chart-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',_vm._g({class:_vm.svgClass,attrs:{\"aria-hidden\":\"true\"}},_vm.$listeners),[_c('use',{attrs:{\"xlink:href\":_vm.iconName}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=17178ffc&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=17178ffc&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"17178ffc\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","// extracted by mini-css-extract-plugin\nmodule.exports = {\"menuText\":\"#bfcbd9\",\"menuActiveText\":\"#409EFF\",\"subMenuActiveText\":\"#f4f4f5\",\"menuBg\":\"#304156\",\"menuHover\":\"#263445\",\"subMenuBg\":\"#1f2d3d\",\"subMenuHover\":\"#001528\",\"sideBarWidth\":\"180px\"};"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/app.3fcec8f6.js b/priv/static/adminfe/static/js/app.3fcec8f6.js new file mode 100644 index 000000000..9a6fb1307 --- /dev/null +++ b/priv/static/adminfe/static/js/app.3fcec8f6.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["app"],{"+aF5":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-pdf",use:"icon-pdf-usage",viewBox:"0 0 1024 1024",content:''});o.a.add(i);t.default=i},"0Fbn":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-people",use:"icon-people-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"1+ww":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});o.a.add(i);t.default=i},"18BR":function(e,t,n){"use strict";var a=n("CzPo");n.n(a).a},"28eg":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-exit-fullscreen",use:"icon-exit-fullscreen-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"3PhE":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"5TQQ":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-theme",use:"icon-theme-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"6xvN":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"94Jb":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});o.a.add(i);t.default=i},"9i3r":function(e,t,n){"use strict";n.d(t,"a",function(){return a});var a=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"localhost";return e.match(/https?:\/\//)?e:function(e){return e.startsWith("localhost:")||e.startsWith("127.0.0.1:")}(e)?"http://".concat(e):"https://".concat(e)}},CzPo:function(e,t,n){},EqXK:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-shopping",use:"icon-shopping-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},F3lI:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-bug",use:"icon-bug-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"F9+T":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-international",use:"icon-international-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},FDDl:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-qq",use:"icon-qq-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},GPBF:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},HIWW:function(e,t,n){"use strict";var a=n("MoCq");n.n(a).a},Hnev:function(e,t,n){"use strict";var a=n("UqWv");n.n(a).a},ICep:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-guide 2",use:"icon-guide 2-usage",viewBox:"0 0 1000 1000",content:''});o.a.add(i);t.default=i},JYDz:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-language",use:"icon-language-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},Kcm3:function(e,t,n){},Kj24:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},LxGF:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-peoples",use:"icon-peoples-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},MEYL:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-money",use:"icon-money-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},MMMJ:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},MoCq:function(e,t,n){},MokB:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-list",use:"icon-list-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},P8iQ:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-settings",use:"icon-settings-usage",viewBox:"0 0 490.2 490.2",content:'\r\n\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n'});o.a.add(i);t.default=i},"R/8a":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-message",use:"icon-message-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},"R/Hx":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},SZWj:function(e,t,n){"use strict";var a=n("Xm3t");n.n(a).a},TfVu:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});o.a.add(i);t.default=i},Tfa4:function(e,t,n){},"Uf/o":function(e,t,n){var a={"./404.svg":"oUrx","./bug.svg":"F3lI","./chart.svg":"yCkv","./clipboard.svg":"vDVG","./component.svg":"VtY+","./dashboard.svg":"94Jb","./documentation.svg":"kPu2","./drag.svg":"m7++","./edit.svg":"qkZ8","./email.svg":"y7eQ","./example.svg":"MMMJ","./excel.svg":"ZZmv","./exit-fullscreen.svg":"28eg","./eye-open.svg":"1+ww","./eye.svg":"TfVu","./form.svg":"6xvN","./fullscreen.svg":"mSHS","./guide 2.svg":"ICep","./guide.svg":"ZoO1","./icon.svg":"nZHn","./international.svg":"F9+T","./language.svg":"JYDz","./link.svg":"GPBF","./list.svg":"MokB","./lock.svg":"qwAt","./message.svg":"R/8a","./money.svg":"MEYL","./nested.svg":"3PhE","./password.svg":"Kj24","./pdf.svg":"+aF5","./people.svg":"0Fbn","./peoples.svg":"LxGF","./qq.svg":"FDDl","./search.svg":"jo2x","./settings.svg":"P8iQ","./shopping.svg":"EqXK","./size.svg":"hkRB","./star.svg":"cIpu","./tab.svg":"j7e1","./table.svg":"R/Hx","./theme.svg":"5TQQ","./tree.svg":"k80C","./user.svg":"s7Vf","./wechat.svg":"gNoN","./zip.svg":"iqZD"};function r(e){var t=s(e);return n(t)}function s(e){if(!n.o(a,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return a[e]}r.keys=function(){return Object.keys(a)},r.resolve=s,e.exports=r,r.id="Uf/o"},UqWv:function(e,t,n){},"VtY+":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-component",use:"icon-component-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},Vtdi:function(e,t,n){"use strict";n.r(t);var a={};n.r(a),n.d(a,"parseTime",function(){return me}),n.d(a,"formatTime",function(){return fe}),n.d(a,"timeAgo",function(){return na}),n.d(a,"numberFormatter",function(){return aa}),n.d(a,"toThousandFilter",function(){return ra});var r=n("Kw5r"),s=n("p46w"),o=n.n(s),i=(n("9d8Q"),n("XJYT")),c=n.n(i),u=(n("D66Q"),n("sg+I"),{name:"App"}),l=n("KHd+"),p=Object(l.a)(u,function(){var e=this.$createElement,t=this._self._c||e;return t("div",{attrs:{id:"app"}},[t("router-view")],1)},[],!1,null,null,null);p.options.__file="App.vue";var d=p.exports,h=n("L2JU"),m=n("o0o1"),f=n.n(m),v=n("yXPU"),g=n.n(v),w=n("t3Un"),b=n("X4fA"),y=n("9i3r");function T(e,t){return x.apply(this,arguments)}function x(){return(x=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/need_reboot",method:"get",headers:k(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function E(e,t){return S.apply(this,arguments)}function S(){return(S=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/restart",method:"get",headers:k(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var k=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},_={state:{sidebar:{opened:!o.a.get("sidebarStatus")||!!+o.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop",language:o.a.get("language")||"en",needReboot:!1,size:o.a.get("size")||"medium",invitesEnabled:!1},mutations:{TOGGLE_SIDEBAR:function(e){e.sidebar.opened=!e.sidebar.opened,e.sidebar.withoutAnimation=!1,e.sidebar.opened?o.a.set("sidebarStatus",1):o.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(e,t){o.a.set("sidebarStatus",0),e.sidebar.opened=!1,e.sidebar.withoutAnimation=t},TOGGLE_DEVICE:function(e,t){e.device=t},SET_INVITES_ENABLED:function(e,t){e.invitesEnabled=t},SET_LANGUAGE:function(e,t){e.language=t,o.a.set("language",t)},TOGGLE_REBOOT:function(e,t){e.needReboot=t},SET_SIZE:function(e,t){e.size=t,o.a.set("size",t)}},actions:{closeSideBar:function(e,t){(0,e.commit)("CLOSE_SIDEBAR",t.withoutAnimation)},NeedReboot:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,T(a.authHost,a.token);case 3:r=e.sent,n("TOGGLE_REBOOT",r.data.need_reboot);case 5:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),RestartApplication:function(){var e=g()(f.a.mark(function e(t){var n,a;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,E(a.authHost,a.token);case 3:n("TOGGLE_REBOOT",!1);case 4:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),SetInvitesEnabled:function(e,t){(0,e.commit)("SET_INVITES_ENABLED",t)},setLanguage:function(e,t){(0,e.commit)("SET_LANGUAGE",t)},setSize:function(e,t){(0,e.commit)("SET_SIZE",t)},toggleDevice:function(e,t){(0,e.commit)("TOGGLE_DEVICE",t)},toggleSideBar:function(e){(0,e.commit)("TOGGLE_SIDEBAR")}}},O={state:{logs:[]},mutations:{ADD_ERROR_LOG:function(e,t){e.logs.push(t)}},actions:{addErrorLog:function(e,t){(0,e.commit)("ADD_ERROR_LOG",t)}}},A=n("MVZn"),L=n.n(A),I=n("LvDl"),C=n.n(I);function R(e,t,n){return D.apply(this,arguments)}function D(){return(D=g()(f.a.mark(function e(t,n,a){var r,s,o=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r=o.length>3&&void 0!==o[3]?o[3]:1,s=new URLSearchParams(C.a.omitBy(L()({},a,{page:r}),C.a.isUndefined)).toString(),e.next=4,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/moderation_log?".concat(s),method:"get",headers:z(n)});case 4:return e.abrupt("return",e.sent);case 5:case"end":return e.stop()}},e)}))).apply(this,arguments)}function V(e,t){return j.apply(this,arguments)}function j(){return(j=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/users?filters=is_admin",method:"get",headers:z(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function P(e,t){return M.apply(this,arguments)}function M(){return(M=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/users?filters=is_moderator",method:"get",headers:z(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var z=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},U={state:{fetchedLog:[],logItemsCount:0,admins:[],moderators:[],logLoading:!0,adminsLoading:!0},mutations:{SET_LOG_LOADING:function(e,t){e.logLoading=t},SET_ADMINS_LOADING:function(e,t){e.adminsLoading=t},SET_MODERATION_LOG:function(e,t){e.fetchedLog=t},SET_MODERATION_LOG_COUNT:function(e,t){e.logItemsCount=t},SET_ADMINS:function(e,t){e.admins=t},SET_MODERATORS:function(e,t){e.moderators=t}},actions:{FetchModerationLog:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,r=o.length>1&&void 0!==o[1]?o[1]:{},e.next=4,R(a.authHost,a.token,r);case 4:s=e.sent,n("SET_MODERATION_LOG",s.data.items),n("SET_MODERATION_LOG_COUNT",s.data.total),n("SET_LOG_LOADING",!1);case 8:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),FetchAdmins:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,V(a.authHost,a.token);case 3:return r=e.sent,e.next=6,P(a.authHost,a.token);case 6:s=e.sent,n("SET_ADMINS",r.data),n("SET_MODERATORS",s.data),n("SET_ADMINS_LOADING",!1);case 10:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()}};function H(e,t,n,a){return B.apply(this,arguments)}function B(){return(B=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/invite_token",method:"post",headers:K(r),data:n&&n.length>0?{max_use:t,expires_at:n}:{max_use:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function N(e,t,n,a){return F.apply(this,arguments)}function F(){return(F=g()(f.a.mark(function e(t,n,a,r){var s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s=n.length>0?{email:t,name:n}:{email:t},e.next=3,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/email_invite",method:"post",headers:K(r),data:s});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function G(e,t){return Y.apply(this,arguments)}function Y(){return(Y=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/users/invites",method:"get",headers:K(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function $(e,t,n){return q.apply(this,arguments)}function q(){return(q=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/revoke_invite",method:"post",headers:K(a),data:{token:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var K=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},W=n("mSNy"),Z={state:{inviteTokens:[],loading:!1,newToken:{}},mutations:{SET_LOADING:function(e,t){e.loading=t},SET_NEW_TOKEN:function(e,t){e.newToken=t},SET_TOKENS:function(e,t){e.inviteTokens=t}},actions:{FetchInviteTokens:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,n("SET_LOADING",!0),e.next=4,G(a.authHost,a.token);case 4:r=e.sent,n("SET_TOKENS",r.data.invites.reverse()),n("SET_LOADING",!1);case 7:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),GenerateInviteToken:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=n.maxUse,i=n.expiresAt,e.prev=2,e.next=5,H(o,i,s.authHost,s.token);case 5:c=e.sent,u=c.data,a("SET_NEW_TOKEN",{token:u.token,maxUse:u.max_use,expiresAt:u.expires_at}),e.next=13;break;case 10:return e.prev=10,e.t0=e.catch(2),e.abrupt("return");case 13:r("FetchInviteTokens");case 14:case"end":return e.stop()}},e,null,[[2,10]])}));return function(t,n){return e.apply(this,arguments)}}(),InviteUserViaEmail:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t.commit,t.dispatch,a=t.getters,r=n.email,s=n.name,e.prev=2,e.next=5,N(r,s,a.authHost,a.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:Object(i.Message)({message:W.a.t("invites.emailSent"),type:"success",duration:5e3});case 11:case"end":return e.stop()}},e,null,[[2,7]])}));return function(t,n){return e.apply(this,arguments)}}(),RemoveNewToken:function(e){(0,e.commit)("SET_NEW_TOKEN",{})},RevokeToken:function(){var e=g()(f.a.mark(function e(t,n){var a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return t.commit,a=t.dispatch,r=t.getters,e.prev=1,e.next=4,$(n,r.authHost,r.token);case 4:e.next=9;break;case 6:return e.prev=6,e.t0=e.catch(1),e.abrupt("return");case 9:a("FetchInviteTokens");case 10:case"end":return e.stop()}},e,null,[[1,6]])}));return function(t,n){return e.apply(this,arguments)}}()}},Q=n("RIqP"),J=n.n(Q);function X(e,t){return ee.apply(this,arguments)}function ee(){return(ee=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/v1/instance/peers",method:"get",headers:te(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var te=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},ne={state:{fetchedPeers:[],loading:!0},mutations:{SET_PEERS:function(e,t){e.fetchedPeers=t},SET_LOADING:function(e,t){e.loading=t}},actions:{FetchPeers:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,X(a.authHost,a.token);case 3:r=e.sent,n("SET_PEERS",J()(r.data).sort()),n("SET_LOADING",!1);case 6:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}()}},ae=n("jE9Z"),re={name:"Hamburger",props:{isActive:{type:Boolean,default:!1},toggleClick:{type:Function,default:null}}},se=(n("18BR"),Object(l.a)(re,function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticStyle:{padding:"0 15px"},on:{click:this.toggleClick}},[t("svg",{staticClass:"hamburger",class:{"is-active":this.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[t("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},[],!1,null,"69c6c5c4",null));se.options.__file="index.vue";var oe={components:{Hamburger:se.exports},computed:L()({},Object(h.b)(["sidebar","name","avatar","device"])),methods:{toggleSideBar:function(){this.$store.dispatch("toggleSideBar")},logout:function(){this.$store.dispatch("LogOut").then(function(){location.reload()})}}},ie=(n("fhHp"),Object(l.a)(oe,function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"navbar"},[n("hamburger",{staticClass:"hamburger-container",attrs:{"toggle-click":e.toggleSideBar,"is-active":e.sidebar.opened}}),e._v(" "),n("div",{staticClass:"right-menu"},[n("el-dropdown",{staticClass:"avatar-container right-menu-item hover-effect",attrs:{trigger:"click"}},[n("div",{staticClass:"avatar-wrapper"},[n("img",{staticClass:"user-avatar",attrs:{src:e.avatar+"?imageView2/1/w/80/h/80"}})]),e._v(" "),n("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[n("el-dropdown-item",[n("span",{staticStyle:{display:"block"},on:{click:e.logout}},[e._v(e._s(e.$t("navbar.logOut")))])])],1)],1)],1)],1)},[],!1,null,"28de7ff2",null));ie.options.__file="Navbar.vue";var ce=ie.exports,ue=n("33yf"),le=n.n(ue);function pe(e){return this.$te("route."+e)?this.$t("route."+e):e}var de=n("cDf5"),he=n.n(de);function me(e,t){if(0===arguments.length)return null;var n,a=t||"{y}-{m}-{d} {h}:{i}:{s}";"object"===he()(e)?n=e:("string"==typeof e&&/^[0-9]+$/.test(e)&&(e=parseInt(e)),"number"==typeof e&&10===e.toString().length&&(e*=1e3),n=new Date(e));var r={y:n.getFullYear(),m:n.getMonth()+1,d:n.getDate(),h:n.getHours(),i:n.getMinutes(),s:n.getSeconds(),a:n.getDay()};return a.replace(/{(y|m|d|h|i|s|a)+}/g,function(e,t){var n=r[t];return"a"===t?["日","一","二","三","四","五","六"][n]:(e.length>0&&n<10&&(n="0"+n),n||0)})}function fe(e,t){e=1e3*+e;var n=new Date(e),a=(Date.now()-n)/1e3;return a<30?"刚刚":a<3600?Math.ceil(a/60)+"分钟前":a<86400?Math.ceil(a/3600)+"小时前":a<172800?"1天前":t?me(e,t):n.getMonth()+1+"月"+n.getDate()+"日"+n.getHours()+"时"+n.getMinutes()+"分"}function ve(e){return/^(https?:|mailto:|tel:)/.test(e)}var ge={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(e,t){var n=t.props,a=n.icon,r=n.title,s=[];return a&&s.push(e("svg-icon",{attrs:{"icon-class":a}})),r&&s.push(e("span",{slot:"title"},[r])),s}},we=Object(l.a)(ge,void 0,void 0,!1,null,null,null);we.options.__file="Item.vue";var be=we.exports,ye={props:{to:{type:String,required:!0}},methods:{linkProps:function(e){return ve(e)?{is:"a",href:e,target:"_blank",rel:"noopener"}:{is:"router-link",to:e}}}},Te=Object(l.a)(ye,function(){var e=this.$createElement;return(this._self._c||e)("component",this._b({},"component",this.linkProps(this.to),!1),[this._t("default")],2)},[],!1,null,null,null);Te.options.__file="Link.vue";var xe={name:"SidebarItem",components:{Item:be,AppLink:Te.exports},mixins:[{computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var e=this,t=this.$refs.subMenu;if(t){var n=t.handleMouseleave;t.handleMouseleave=function(t){"mobile"!==e.device&&n(t)}}}}}],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return{onlyOneChild:null}},computed:{invitesEnabled:function(){return"/invites"!==this.basePath||this.$store.state.app.invitesEnabled}},methods:{hasOneShowingChild:function(e,t){var n=this,a=e.filter(function(e){return!e.hidden&&(n.onlyOneChild=e,!0)});return 1===a.length||0===a.length&&(this.onlyOneChild=L()({},t,{path:"",noShowingChildren:!0}),!0)},resolvePath:function(e){return this.isExternalLink(e)?e:le.a.resolve(this.basePath,e)},isExternalLink:function(e){return ve(e)},generateTitle:pe}},Ee=Object(l.a)(xe,function(){var e=this,t=e.$createElement,n=e._self._c||t;return!e.item.hidden&&e.item.children&&e.invitesEnabled?n("div",{staticClass:"menu-wrapper"},[!e.hasOneShowingChild(e.item.children,e.item)||e.onlyOneChild.children&&!e.onlyOneChild.noShowingChildren||e.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:e.resolvePath(e.item.path)}},[n("template",{slot:"title"},[e.item.meta?n("item",{attrs:{icon:e.item.meta.icon,title:e.generateTitle(e.item.meta.title)}}):e._e()],1),e._v(" "),e._l(e.item.children,function(t){return[t.hidden?e._e():[t.children&&t.children.length>0?n("sidebar-item",{key:t.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:t,"base-path":e.resolvePath(t.path)}}):n("app-link",{key:t.name,attrs:{to:e.resolvePath(t.path)}},[n("el-menu-item",{attrs:{index:e.resolvePath(t.path)}},[t.meta?n("item",{attrs:{icon:t.meta.icon,title:e.generateTitle(t.meta.title)}}):e._e()],1)],1)]]})],2):[n("app-link",{attrs:{to:e.resolvePath(e.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!e.isNest},attrs:{index:e.resolvePath(e.onlyOneChild.path)}},[e.onlyOneChild.meta?n("item",{attrs:{icon:e.onlyOneChild.meta.icon||e.item.meta.icon,title:e.generateTitle(e.onlyOneChild.meta.title)}}):e._e()],1)],1)]],2):e._e()},[],!1,null,null,null);Ee.options.__file="SidebarItem.vue";var Se=Ee.exports,ke=n("zx4i"),_e=n.n(ke),Oe={components:{SidebarItem:Se},computed:L()({},Object(h.b)(["permission_routers","sidebar"]),{variables:function(){return _e.a},isCollapse:function(){return!this.sidebar.opened}})},Ae=Object(l.a)(Oe,function(){var e=this.$createElement,t=this._self._c||e;return t("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[t("el-menu",{attrs:{"default-active":this.$route.path,collapse:this.isCollapse,"background-color":this.variables.menuBg,"text-color":this.variables.menuText,"active-text-color":this.variables.menuActiveText,mode:"vertical"}},this._l(this.permission_routers,function(e){return t("sidebar-item",{key:e.path,attrs:{item:e,"base-path":e.path}})}),1)],1)},[],!1,null,null,null);Ae.options.__file="index.vue";var Le=Ae.exports,Ie={name:"ScrollPane",data:function(){return{left:0}},methods:{handleScroll:function(e){var t=e.wheelDelta||40*-e.deltaY,n=this.$refs.scrollContainer.$refs.wrap;n.scrollLeft=n.scrollLeft+t/4},moveToTarget:function(e){var t=this.$refs.scrollContainer.$el.offsetWidth,n=this.$refs.scrollContainer.$refs.wrap,a=this.$parent.$refs.tag,r=null,s=null;if(a.length>0&&(r=a[0],s=a[a.length-1]),r===e)n.scrollLeft=0;else if(s===e)n.scrollLeft=n.scrollWidth-t;else{var o=a.findIndex(function(t){return t===e}),i=a[o-1],c=a[o+1],u=c.$el.offsetLeft+c.$el.offsetWidth+4,l=i.$el.offsetLeft-4;u>n.scrollLeft+t?n.scrollLeft=u-t:l1&&void 0!==arguments[1]?arguments[1]:"/",a=[];return e.forEach(function(e){if(e.meta&&e.meta.affix&&a.push({path:le.a.resolve(n,e.path),name:e.name,meta:L()({},e.meta)}),e.children){var r=t.filterAffixTags(e.children,e.path);r.length>=1&&(a=[].concat(J()(a),J()(r)))}}),a},initTags:function(){var e=this.affixTags=this.filterAffixTags(this.routers),t=!0,n=!1,a=void 0;try{for(var r,s=e[Symbol.iterator]();!(t=(r=s.next()).done);t=!0){var o=r.value;o.name&&this.$store.dispatch("addVisitedView",o)}}catch(e){n=!0,a=e}finally{try{t||null==s.return||s.return()}finally{if(n)throw a}}},addTags:function(){return this.$route.name&&this.$store.dispatch("addView",this.$route),!1},moveToCurrentTag:function(){var e=this,t=this.$refs.tag;this.$nextTick(function(){var n=!0,a=!1,r=void 0;try{for(var s,o=t[Symbol.iterator]();!(n=(s=o.next()).done);n=!0){var i=s.value;if(i.to.path===e.$route.path){e.$refs.scrollPane.moveToTarget(i),i.to.fullPath!==e.$route.fullPath&&e.$store.dispatch("updateVisitedView",e.$route);break}}}catch(e){a=!0,r=e}finally{try{n||null==o.return||o.return()}finally{if(a)throw r}}})},refreshSelectedTag:function(e){var t=this;this.$store.dispatch("delCachedView",e).then(function(){var n=e.fullPath;t.$nextTick(function(){t.$router.replace({path:"/redirect"+n})})})},closeSelectedTag:function(e){var t=this;this.$store.dispatch("delView",e).then(function(n){var a=n.visitedViews;t.isActive(e)&&t.toLastView(a)})},closeOthersTags:function(){var e=this;this.$router.push(this.selectedTag),this.$store.dispatch("delOthersViews",this.selectedTag).then(function(){e.moveToCurrentTag()})},closeAllTags:function(e){var t=this;this.$store.dispatch("delAllViews").then(function(n){var a=n.visitedViews;t.affixTags.some(function(t){return t.path===e.path})||t.toLastView(a)})},toLastView:function(e){var t=e.slice(-1)[0];t?this.$router.push(t):this.$router.push("/")},openMenu:function(e,t){var n=this.$el.getBoundingClientRect().left,a=this.$el.offsetWidth-105,r=t.clientX-n+15;this.left=r>a?a:r,this.top=t.clientY,this.visible=!0,this.selectedTag=e},closeMenu:function(){this.visible=!1}}},De=(n("Hnev"),n("Yymj"),Object(l.a)(Re,function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"tags-view-container"},[n("scroll-pane",{ref:"scrollPane",staticClass:"tags-view-wrapper"},e._l(e.visitedViews,function(t){return n("router-link",{key:t.path,ref:"tag",refInFor:!0,staticClass:"tags-view-item",class:e.isActive(t)?"active":"",attrs:{to:{path:t.path,query:t.query,fullPath:t.fullPath},tag:"span"},nativeOn:{mouseup:function(n){return"button"in n&&1!==n.button?null:e.closeSelectedTag(t)},contextmenu:function(n){return n.preventDefault(),e.openMenu(t,n)}}},[e._v("\n "+e._s(e.generateTitle(t.title))+"\n "),t.meta.affix?e._e():n("span",{staticClass:"el-icon-close",on:{click:function(n){return n.preventDefault(),n.stopPropagation(),e.closeSelectedTag(t)}}})])}),1),e._v(" "),n("ul",{directives:[{name:"show",rawName:"v-show",value:e.visible,expression:"visible"}],staticClass:"contextmenu",style:{left:e.left+"px",top:e.top+"px"}},[n("li",{on:{click:function(t){return e.refreshSelectedTag(e.selectedTag)}}},[e._v(e._s(e.$t("tagsView.refresh")))]),e._v(" "),e.selectedTag.meta&&e.selectedTag.meta.affix?e._e():n("li",{on:{click:function(t){return e.closeSelectedTag(e.selectedTag)}}},[e._v(e._s(e.$t("tagsView.close")))]),e._v(" "),n("li",{on:{click:e.closeOthersTags}},[e._v(e._s(e.$t("tagsView.closeOthers")))]),e._v(" "),n("li",{on:{click:function(t){return e.closeAllTags(e.selectedTag)}}},[e._v(e._s(e.$t("tagsView.closeAll")))])])],1)},[],!1,null,"e1cdb714",null));De.options.__file="TagsView.vue";var Ve=De.exports,je={name:"AppMain",computed:{cachedViews:function(){return this.$store.state.tagsView.cachedViews},key:function(){return this.$route.fullPath}}},Pe=(n("Z+gY"),Object(l.a)(je,function(){var e=this.$createElement,t=this._self._c||e;return t("section",{staticClass:"app-main"},[t("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[t("keep-alive",{attrs:{include:this.cachedViews}},[t("router-view",{key:this.key})],1)],1)],1)},[],!1,null,"f852c4f2",null));Pe.options.__file="AppMain.vue";var Me=Pe.exports,ze=document.body,Ue={name:"Layout",components:{Navbar:ce,Sidebar:Le,AppMain:Me,TagsView:Ve},mixins:[{watch:{$route:function(e){"mobile"===this.device&&this.sidebar.opened&&Zn.dispatch("closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.resizeHandler)},mounted:function(){var e=this.isMobile(),t=this.isTablet();(e||t)&&(Zn.dispatch("toggleDevice",e?"mobile":"tablet"),Zn.dispatch("closeSideBar",{withoutAnimation:!0}))},methods:{isMobile:function(){return ze.getBoundingClientRect().width-3<480},isTablet:function(){var e=ze.getBoundingClientRect();return e.width-3<801&&e.width-3>480},resizeHandler:function(){if(!document.hidden){var e=this.isMobile(),t=this.isTablet();e||t?(Zn.dispatch("toggleDevice",e?"mobile":"tablet"),Zn.dispatch("closeSideBar",{withoutAnimation:!0})):Zn.dispatch("toggleDevice","desktop")}}}}],computed:{sidebar:function(){return this.$store.state.app.sidebar},device:function(){return this.$store.state.app.device},classObj:function(){return{hideSidebar:!this.sidebar.opened,openSidebar:this.sidebar.opened,withoutAnimation:this.sidebar.withoutAnimation,mobile:"mobile"===this.device}}},methods:{handleClickOutside:function(){this.$store.dispatch("closeSideBar",{withoutAnimation:!1})}}},He=(n("SZWj"),Object(l.a)(Ue,function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-wrapper",class:e.classObj},["mobile"===e.device&&e.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:e.handleClickOutside}}):e._e(),e._v(" "),n("sidebar",{staticClass:"sidebar-container"}),e._v(" "),n("div",{staticClass:"main-container"},[n("navbar"),e._v(" "),n("app-main")],1)],1)},[],!1,null,"767d264f",null));He.options.__file="Layout.vue";var Be=He.exports;r.default.use(ae.a);var Ne=[""]||!1,Fe=Ne.includes("settings"),Ge={path:"/settings",component:Be,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-5118"),n.e("chunk-43ca")]).then(n.bind(null,"YcIK"))},name:"Settings",meta:{title:"Settings",icon:"settings",noCache:!0}}]},Ye=Ne.includes("statuses"),$e={path:"/statuses",component:Be,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-df62"),n.e("ZhIB"),n.e("chunk-143c"),n.e("chunk-176e")]).then(n.bind(null,"FtQ1"))},name:"Statuses",meta:{title:"Statuses",icon:"form",noCache:!0}}]},qe=Ne.includes("reports"),Ke={path:"/reports",component:Be,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-df62"),n.e("ZhIB"),n.e("chunk-e404")]).then(n.bind(null,"cEOe"))},name:"Reports",meta:{title:"Reports",icon:"documentation",noCache:!0}}]},We=Ne.includes("invites"),Ze={path:"/invites",component:Be,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-7c6b")]).then(n.bind(null,"HMof"))},name:"Invites",meta:{title:"Invites",icon:"guide",noCache:!0}}]},Qe=Ne.includes("emoji-packs"),Je={path:"/emoji_packs",component:Be,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-c5f4")]).then(n.bind(null,"26YS"))},name:"Emoji Packs",meta:{title:"Emoji Packs",icon:"eye-open",noCache:!0}}]},Xe=Ne.includes("moderation-log"),et={path:"/moderation_log",component:Be,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-df62"),n.e("chunk-1609")]).then(n.bind(null,"CmY0"))},name:"Moderation Log",meta:{title:"moderationLog",icon:"list",noCache:!0}}]},tt=[{path:"/redirect",component:Be,hidden:!0,children:[{path:"/redirect/:path*",component:function(){return n.e("7zzA").then(n.bind(null,"7zzA"))}}]},{path:"/login-pleroma",component:function(){return Promise.all([n.e("oAJy"),n.e("chunk-16d0")]).then(n.bind(null,"iRgq"))},hidden:!0},{path:"/login",component:function(){return Promise.all([n.e("oAJy"),n.e("chunk-4e7e")]).then(n.bind(null,"ntYl"))},hidden:!0},{path:"/auth-redirect",component:function(){return n.e("JEtC").then(n.bind(null,"JEtC"))},hidden:!0},{path:"/404",component:function(){return n.e("chunk-070d").then(n.bind(null,"/eX4"))},hidden:!0},{path:"/401",component:function(){return n.e("chunk-6e81").then(n.bind(null,"UUO+"))},hidden:!0},{path:"",component:Be,redirect:"/users/index"}],nt=new ae.a({scrollBehavior:function(){return{y:0}},routes:tt}),at=[{path:"/users",component:Be,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-commons"),n.e("ZhIB"),n.e("chunk-143c"),n.e("chunk-0cbc")]).then(n.bind(null,"RGjw"))},name:"Users",meta:{title:"users",icon:"peoples",noCache:!0}}]}].concat(J()(Ye?[]:[$e]),J()(qe?[]:[Ke]),J()(We?[]:[Ze]),J()(Qe?[]:[Je]),J()(Xe?[]:[et]),J()(Fe?[]:[Ge]),[{path:"/users/:id",component:Be,children:[{path:"",name:"UsersShow",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-df62"),n.e("chunk-5882")]).then(n.bind(null,"4bFr"))}}],hidden:!0},{path:"/statuses/:id",component:Be,children:[{path:"",name:"StatusShow",component:function(){return Promise.all([n.e("chunk-commons"),n.e("chunk-df62"),n.e("chunk-7506")]).then(n.bind(null,"rwwt"))}}],hidden:!0},{path:"*",redirect:"/404",hidden:!0}]);var rt={state:{routers:[],addRouters:[]},mutations:{SET_ROUTERS:function(e,t){e.addRouters=t,e.routers=tt.concat(t)}},actions:{GenerateRoutes:function(e,t){var n=e.commit;return new Promise(function(e){var a,r=t.roles;a=r.includes("admin")?at:function e(t,n){var a=[];return t.forEach(function(t){var r=L()({},t);(function(e,t){return!t.meta||!t.meta.roles||e.some(function(e){return t.meta.roles.includes(e)})})(n,r)&&(r.children&&(r.children=e(r.children,n)),a.push(r))}),a}(at,r),n("SET_ROUTERS",a),e()})}}};function st(e,t){return ot.apply(this,arguments)}function ot(){return(ot=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/relay",method:"get",headers:pt(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function it(e,t,n){return ct.apply(this,arguments)}function ct(){return(ct=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/relay",method:"post",headers:pt(a),data:{relay_url:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function ut(e,t,n){return lt.apply(this,arguments)}function lt(){return(lt=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/relay",method:"delete",headers:pt(a),data:{relay_url:"https://".concat(t,"/actor")}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var pt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},dt={state:{fetchedRelays:[],loading:!0},mutations:{SET_LOADING:function(e,t){e.loading=t},SET_RELAYS:function(e,t){e.fetchedRelays=t},ADD_RELAY:function(e,t){e.fetchedRelays=[].concat(J()(e.fetchedRelays),[t])},DELETE_RELAY:function(e,t){e.fetchedRelays=e.fetchedRelays.filter(function(e){return e!==t})}},actions:{FetchRelays:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,n("SET_LOADING",!0),e.next=4,st(a.authHost,a.token);case 4:r=e.sent,n("SET_RELAYS",r.data.relays),n("SET_LOADING",!1);case 7:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),AddRelay:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,a("ADD_RELAY",n),e.prev=2,e.next=5,it(n,s.authHost,s.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:return e.prev=10,r("FetchRelays"),e.finish(10);case 13:case"end":return e.stop()}},e,null,[[2,7,10,13]])}));return function(t,n){return e.apply(this,arguments)}}(),DeleteRelay:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,a("DELETE_RELAY",n),e.prev=2,e.next=5,ut(n,s.authHost,s.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:return e.prev=10,r("FetchRelays"),e.finish(10);case 13:case"end":return e.stop()}},e,null,[[2,7,10,13]])}));return function(t,n){return e.apply(this,arguments)}}()}};function ht(e,t,n){return mt.apply(this,arguments)}function mt(){return(mt=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/reports",method:"patch",headers:bt(a),data:{reports:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function ft(e,t,n,a,r){return vt.apply(this,arguments)}function vt(){return(vt=g()(f.a.mark(function e(t,n,a,r,s){var o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return o=t.length>0?"/api/pleroma/admin/reports?state=".concat(t,"&page=").concat(n,"&page_size=").concat(a):"/api/pleroma/admin/reports?page=".concat(n,"&page_size=").concat(a),e.next=3,Object(w.a)({baseURL:Object(y.a)(r),url:o,method:"get",headers:bt(s)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function gt(){return(gt=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/reports/".concat(n,"/notes"),method:"post",headers:bt(r),data:{content:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function wt(){return(wt=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/reports/".concat(n,"/notes/").concat(t),method:"delete",headers:bt(r)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var bt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},yt={state:{fetchedReports:[],totalReportsCount:0,currentPage:1,pageSize:50,stateFilter:"",loading:!0},mutations:{SET_LAST_REPORT_ID:function(e,t){e.idOfLastReport=t},SET_LOADING:function(e,t){e.loading=t},SET_PAGE:function(e,t){e.currentPage=t},SET_REPORTS:function(e,t){e.fetchedReports=t},SET_REPORTS_COUNT:function(e,t){e.totalReportsCount=t},SET_REPORTS_FILTER:function(e,t){e.stateFilter=t}},actions:{ChangeReportState:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.commit,r=t.getters,s=t.state,ht(n,r.authHost,r.token),o=s.fetchedReports.map(function(e){return n.map(function(e){return e.id}).includes(e.id)?L()({},e,{state:n[0].state}):e}),a("SET_REPORTS",o);case 4:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ClearFetchedReports:function(e){(0,e.commit)("SET_REPORTS",[])},FetchReports:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=t.state,a("SET_LOADING",!0),e.next=4,ft(s.stateFilter,n,s.pageSize,r.authHost,r.token);case 4:o=e.sent,i=o.data,a("SET_REPORTS",i.reports),a("SET_REPORTS_COUNT",i.total),a("SET_PAGE",n),a("SET_LOADING",!1);case 10:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetFilter:function(e,t){(0,e.commit)("SET_REPORTS_FILTER",t)},CreateReportNote:function(e,t){var n=e.commit,a=e.getters,r=e.state,s=e.rootState,o=t.content,i=t.reportID;!function(e,t,n,a){gt.apply(this,arguments)}(o,i,a.authHost,a.token);var c={user:{avatar:s.user.avatar,nickname:s.user.name,id:s.user.id},content:o,created_at:(new Date).getTime()};n("SET_REPORTS",r.fetchedReports.map(function(e){return e.id===i&&(e.notes=[].concat(J()(e.notes),[c])),e}))},DeleteReportNote:function(e,t){var n=e.commit,a=e.getters,r=e.state,s=t.noteID,o=t.reportID;!function(e,t,n,a){wt.apply(this,arguments)}(s,o,a.authHost,a.token),n("SET_REPORTS",r.fetchedReports.map(function(e){return e.id===o&&(e.notes=e.notes.filter(function(e){return e.id!==s})),e}))}}},Tt=n("lSNA"),xt=n.n(Tt),Et=n("QILm"),St=n.n(Et);function kt(e,t){return _t.apply(this,arguments)}function _t(){return(_t=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/config/descriptions",method:"get",headers:Dt(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ot(e,t){return At.apply(this,arguments)}function At(){return(At=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(t),url:"/api/pleroma/admin/config",method:"get",headers:Dt(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Lt(e,t,n){return It.apply(this,arguments)}function It(){return(It=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/config",method:"post",headers:Dt(a),data:{configs:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ct(e,t,n){return Rt.apply(this,arguments)}function Rt(){return(Rt=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/config",method:"post",headers:Dt(a),data:{configs:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var Dt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},Vt=n("h74u");function jt(e){var t=function(e,t){if("object"!==he()(e)||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var a=n.call(e,t||"default");if("object"!==he()(a))return a;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"===he()(t)?t:String(t)}var Pt={state:{activeTab:"instance",configDisabled:!0,db:{},description:[],loading:!0,searchData:{},settings:{},updatedSettings:{}},mutations:{CLEAR_UPDATED_SETTINGS:function(e){e.updatedSettings={}},REMOVE_SETTING_FROM_UPDATED:function(e,t){var n=t.group,a=t.key,r=t.subkeys;if(C.a.get(e.updatedSettings,[n,a,r[0]])){var s=e.updatedSettings[n][a],o=(s[r[0]],St()(s,[r[0]].map(jt)));e.updatedSettings=o}},SET_ACTIVE_TAB:function(e,t){e.activeTab=t},SET_DESCRIPTION:function(e,t){e.description=t},SET_LOADING:function(e,t){e.loading=t},SET_SEARCH:function(e,t){e.searchData=t},SET_SETTINGS:function(e,t){var n=t.reduce(function(e,t){var n=t.group,a=t.key,r=t.value,s=Object(Vt.g)(a,r)?{value:Object(Vt.d)(a,r)}:Object(Vt.e)(r,a);return e[n]=e[n]?L()({},e[n],xt()({},a,s)):xt()({},a,s),e},{}),a=t.reduce(function(e,t){var n=t.group,a=t.key,r=t.db;return r&&(e[n]=e[n]?L()({},e[n],xt()({},a,r)):xt()({},a,r)),e},{});e.settings=n,e.db=a},TOGGLE_TABS:function(e,t){e.configDisabled=t},UPDATE_SETTINGS:function(e,t){var n=t.group,a=t.key,r=t.input,s=t.value,o=t.type,i=!e.updatedSettings[n]||"Pleroma.Emails.Mailer"===a&&":adapter"===r?xt()({},a,xt()({},r,[o,s])):xt()({},a,L()({},e.updatedSettings[n][a],xt()({},r,[o,s])));e.updatedSettings[n]=L()({},e.updatedSettings[n],i)},UPDATE_STATE:function(e,t){var n=t.group,a=t.key,r=t.input,s=t.value,o="Pleroma.Emails.Mailer"===a&&":adapter"===r?xt()({},a,xt()({},r,s)):xt()({},a,L()({},e.settings[n][a],xt()({},r,s)));e.settings[n]=L()({},e.settings[n],o)}},actions:{FetchSettings:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,n("SET_LOADING",!0),e.prev=2,e.next=5,Ot(a.authHost,a.token);case 5:return r=e.sent,e.next=8,kt(a.authHost,a.token);case 8:s=e.sent,n("SET_DESCRIPTION",s.data),o=Object(Vt.b)(s.data),n("SET_SEARCH",o),n("SET_SETTINGS",r.data.configs),e.next=21;break;case 15:return e.prev=15,e.t0=e.catch(2),n("TOGGLE_TABS",!0),n("SET_ACTIVE_TAB","relays"),n("SET_LOADING",!1),e.abrupt("return");case 21:n("TOGGLE_TABS",!1),n("SET_LOADING",!1);case 23:case"end":return e.stop()}},e,null,[[2,15]])}));return function(t){return e.apply(this,arguments)}}(),RemoveSetting:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,e.next=3,Ct(n,r.authHost,r.token);case 3:return e.next=5,Ot(r.authHost,r.token);case 5:s=e.sent,o=n[0],i=o.group,c=o.key,u=o.subkeys,a("SET_SETTINGS",s.data.configs),a("TOGGLE_REBOOT",s.data.need_reboot),a("REMOVE_SETTING_FROM_UPDATED",{group:i,key:c,subkeys:u||[]});case 10:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetActiveTab:function(e,t){(0,e.commit)("SET_ACTIVE_TAB",t)},SubmitChanges:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.getters,a=t.commit,r=t.state,s=Object(Vt.a)(r.settings,r.updatedSettings,r.description),o=Object.keys(s).reduce(function(e,t){return[].concat(J()(e),J()(Object(Vt.h)(t,s[t],r.settings)))},[]),e.next=5,Lt(o,n.authHost,n.token);case 5:return e.next=7,Ot(n.authHost,n.token);case 7:i=e.sent,a("SET_SETTINGS",i.data.configs),a("TOGGLE_REBOOT",i.data.need_reboot),a("CLEAR_UPDATED_SETTINGS");case 11:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),UpdateSettings:function(e,t){var n=e.commit,a=t.group,r=t.key,s=t.input,o=t.value,i=t.type;n("UPDATE_SETTINGS",r?{group:a,key:r,input:s,value:o,type:i}:{group:a,key:s,input:"_value",value:o,type:i})},UpdateState:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l,p;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.commit,r=t.getters,s=t.state,o=n.group,i=n.key,c=n.input,u=n.value,"Pleroma.Emails.Mailer"!==i||":adapter"!==c){e.next=8;break}return l=Object.keys(s.settings[o][i]).filter(function(e){return":adapter"!==e}),e.next=6,Ct([{group:o,key:i,delete:!0,subkeys:l}],r.authHost,r.token);case 6:e.next=12;break;case 8:if("Pleroma.Upload"!==i||":uploader"!==c){e.next=12;break}return p="Pleroma.Uploaders.Local"===u?"Pleroma.Uploaders.S3":"Pleroma.Uploaders.Local",e.next=12,Ct([{group:o,key:p,delete:!0}],r.authHost,r.token);case 12:a("UPDATE_STATE",i?{group:o,key:i,input:c,value:u}:{group:o,key:c,input:"value",value:u});case 13:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}};function Mt(e,t,n,a,r){return zt.apply(this,arguments)}function zt(){return(zt=g()(f.a.mark(function e(t,n,a,r,s){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(r),url:"/api/pleroma/admin/statuses/".concat(t),method:"put",headers:Wt(s),data:{sensitive:n,visibility:a}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ut(e,t,n){return Ht.apply(this,arguments)}function Ht(){return(Ht=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/statuses/".concat(t),method:"delete",headers:Wt(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Bt(e,t,n){return Nt.apply(this,arguments)}function Nt(){return(Nt=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/statuses/".concat(t),method:"get",headers:Wt(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ft(e){return Gt.apply(this,arguments)}function Gt(){return(Gt=g()(f.a.mark(function e(t){var n,a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.godmode,a=t.localOnly,r=t.authHost,s=t.token,o=t.pageSize,i=t.page,e.next=3,Object(w.a)({baseURL:Object(y.a)(r),url:"/api/pleroma/admin/statuses?godmode=".concat(n,"&local_only=").concat(a,"&page=").concat(i,"&page_size=").concat(o),method:"get",headers:Wt(s)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Yt(e,t,n){return $t.apply(this,arguments)}function $t(){return($t=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:t?"/api/pleroma/admin/stats?instance=".concat(t):"/api/pleroma/admin/stats",method:"get",headers:Wt(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function qt(e){return Kt.apply(this,arguments)}function Kt(){return(Kt=g()(f.a.mark(function e(t){var n,a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.instance,a=t.authHost,r=t.token,s=t.pageSize,o=t.page,e.next=3,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/instances/".concat(n,"/statuses?page=").concat(o,"&page_size=").concat(s),method:"get",headers:Wt(r)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}var Wt=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},Zt={state:{fetchedStatus:{},fetchedStatuses:[],loading:!1,statusAuthor:{},statusesByInstance:{selectedInstance:"",showLocal:!1,showPrivate:!1,page:1,pageSize:20,buttonLoading:!1,allLoaded:!1},statusVisibility:{}},mutations:{CHANGE_GODMODE_CHECKBOX_VALUE:function(e,t){e.statusesByInstance.showPrivate=t},CHANGE_LOCAL_CHECKBOX_VALUE:function(e,t){e.statusesByInstance.showLocal=t},CHANGE_PAGE:function(e,t){e.statusesByInstance.page=t},CHANGE_SELECTED_INSTANCE:function(e,t){e.statusesByInstance.selectedInstance=t},SET_STATUS:function(e,t){e.fetchedStatus=t},SET_STATUSES_BY_INSTANCE:function(e,t){e.fetchedStatuses=t},PUSH_STATUSES:function(e,t){e.fetchedStatuses=[].concat(J()(e.fetchedStatuses),J()(t))},SET_ALL_LOADED:function(e,t){e.statusesByInstance.allLoaded=t},SET_BUTTON_LOADING:function(e,t){e.statusesByInstance.buttonLoading=t},SET_LOADING:function(e,t){e.loading=t},SET_STATUS_VISIBILITY:function(e,t){e.statusVisibility=t},SET_STATUS_AUTHOR:function(e,t){e.statusAuthor=t}},actions:{ChangeStatusScope:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l,p;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.statusId,o=n.isSensitive,i=n.visibility,c=n.reportCurrentPage,u=n.userId,l=n.godmode,p=n.fetchStatusesByInstance,e.next=4,Mt(s,o,i,r.authHost,r.token);case 4:0!==c?a("FetchReports",c):u.length>0?a("FetchUserStatuses",{userId:u,godmode:l}):p?a("FetchStatusesByInstance"):a("FetchStatusAfterUserModeration",s);case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ClearState:function(e){var t=e.commit;t("CHANGE_SELECTED_INSTANCE",""),t("SET_STATUSES_BY_INSTANCE",[]),t("CHANGE_LOCAL_CHECKBOX_VALUE",!1),t("CHANGE_GODMODE_CHECKBOX_VALUE",!1),t("SET_ALL_LOADED",!1),t("CHANGE_PAGE",1)},DeleteStatus:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.statusId,o=n.reportCurrentPage,i=n.userId,c=n.godmode,u=n.fetchStatusesByInstance,e.next=4,Ut(s,r.authHost,r.token);case 4:0!==o?a("FetchReports",o):i.length>0?a("FetchUserStatuses",{userId:i,godmode:c}):u&&a("FetchStatusesByInstance");case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),FetchStatus:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=t.state,a("SET_LOADING",!0),e.next=4,Bt(n,s.authHost,s.token);case 4:i=e.sent,a("SET_STATUS",i.data),a("SET_STATUS_AUTHOR",i.data.account),a("SET_LOADING",!1),r("FetchUserStatuses",{userId:o.fetchedStatus.account.id,godmode:!1});case 9:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),FetchStatusAfterUserModeration:function(e,t){var n=e.commit,a=e.dispatch,r=e.getters;e.state;n("SET_LOADING",!0),Bt(t,r.authHost,r.token).then(function(e){return a("SetStatus",e.data)}),n("SET_LOADING",!1)},FetchStatusesCount:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,a("SET_LOADING",!0),e.next=4,Yt(n,r.authHost,r.token);case 4:s=e.sent,o=s.data,a("SET_STATUS_VISIBILITY",o.status_visibility),a("SET_LOADING",!1);case 8:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),FetchStatusesByInstance:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.commit,a=t.dispatch,r=t.getters,s=t.state,o=t.rootState,n("SET_LOADING",!0),a("FetchStatusesCount",s.statusesByInstance.selectedInstance),""!==s.statusesByInstance.selectedInstance){e.next=7;break}n("SET_STATUSES_BY_INSTANCE",[]),e.next=19;break;case 7:if(s.statusesByInstance.selectedInstance!==o.user.authHost){e.next=13;break}return e.next=10,Ft({godmode:s.statusesByInstance.showPrivate,localOnly:s.statusesByInstance.showLocal,authHost:r.authHost,token:r.token,pageSize:s.statusesByInstance.pageSize,page:s.statusesByInstance.page});case 10:e.t0=e.sent,e.next=16;break;case 13:return e.next=15,qt({instance:s.statusesByInstance.selectedInstance,authHost:r.authHost,token:r.token,pageSize:s.statusesByInstance.pageSize,page:s.statusesByInstance.page});case 15:e.t0=e.sent;case 16:i=e.t0,n("SET_STATUSES_BY_INSTANCE",i.data),i.data.lengthThis user doesn`t have admin rights. Try another credentials or see the docs to find out how to make this user an admin'),t("SET_NAME",r.username),t("SET_ID",r.id),t("SET_AVATAR",r.avatar),t("SET_INTRODUCTION",""),e(n)}).catch(function(e){a(e)})})},LogOut:function(e){var t=e.commit;t("SET_TOKEN",""),t("SET_ROLES",[]),Object(b.d)(),Object(b.c)()},FedLogOut:function(e){var t=e.commit;return new Promise(function(e){t("SET_TOKEN",""),Object(b.d)(),Object(b.c)(),e()})},LoginByPleromaFE:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.commit,r=t.dispatch,s=n.token,a("SET_TOKEN",s),Object(b.f)(s),a("SET_AUTH_HOST",window.location.host),Object(b.e)(window.location.host),r("GetUserInfo");case 7:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}};function on(e,t,n){return cn.apply(this,arguments)}function cn(){return(cn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/activate",method:"patch",headers:Nn(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function un(e,t,n,a){return ln.apply(this,arguments)}function ln(){return(ln=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/permission_group/".concat(n),method:"post",headers:Nn(r),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function pn(e,t,n,a,r){return dn.apply(this,arguments)}function dn(){return(dn=g()(f.a.mark(function e(t,n,a,r,s){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(r),url:"/api/pleroma/admin/users",method:"post",headers:Nn(s),data:{users:[{nickname:t,email:n,password:a}]}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function hn(e,t,n){return mn.apply(this,arguments)}function mn(){return(mn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/deactivate",method:"patch",headers:Nn(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function fn(e,t,n,a){return vn.apply(this,arguments)}function vn(){return(vn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/permission_group/".concat(n),method:"delete",headers:Nn(r),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function gn(e,t,n){return wn.apply(this,arguments)}function wn(){return(wn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users",method:"delete",headers:Nn(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function bn(e,t,n){return yn.apply(this,arguments)}function yn(){return(yn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t),method:"get",headers:Nn(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Tn(e,t,n){return xn.apply(this,arguments)}function xn(){return(xn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t,"/credentials"),method:"get",headers:Nn(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function En(e,t,n,a){return Sn.apply(this,arguments)}function Sn(){return(Sn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/".concat(t,"/credentials"),method:"patch",headers:Nn(r),data:n});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function kn(e,t,n){return _n.apply(this,arguments)}function _n(){return(_n=g()(f.a.mark(function e(t,n,a){var r,s=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return r=s.length>3&&void 0!==s[3]?s[3]:1,e.next=3,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users?page=".concat(r,"&filters=").concat(t),method:"get",headers:Nn(a)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function On(e,t,n){return An.apply(this,arguments)}function An(){return(An=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t,"/password_reset"),method:"get",headers:Nn(a)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Ln(e,t,n){return In.apply(this,arguments)}function In(){return(In=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/force_password_reset",method:"patch",headers:Nn(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Cn(e,t,n,a){return Rn.apply(this,arguments)}function Rn(){return(Rn=g()(f.a.mark(function e(t,n,a,r){var s,o=arguments;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return s=o.length>4&&void 0!==o[4]?o[4]:1,e.next=3,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users?query=".concat(t,"&page=").concat(s,"&filters=").concat(n),method:"get",headers:Nn(r)});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Dn(e,t,n,a){return Vn.apply(this,arguments)}function Vn(){return(Vn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/tag",method:"put",headers:Nn(r),data:{nicknames:t,tags:n}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function jn(e,t,n,a){return Pn.apply(this,arguments)}function Pn(){return(Pn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(a),url:"/api/pleroma/admin/users/tag",method:"delete",headers:Nn(r),data:{nicknames:t,tags:n}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Mn(){return(Mn=g()(f.a.mark(function e(t,n,a,r){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/".concat(t,"/statuses?godmode=").concat(a),method:"get",headers:Nn(r)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function zn(e,t,n){return Un.apply(this,arguments)}function Un(){return(Un=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/confirm_email",method:"patch",headers:Nn(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function Hn(e,t,n){return Bn.apply(this,arguments)}function Bn(){return(Bn=g()(f.a.mark(function e(t,n,a){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(w.a)({baseURL:Object(y.a)(n),url:"/api/pleroma/admin/users/resend_confirmation_email",method:"patch",headers:Nn(a),data:{nicknames:t}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var Nn=function(e){return e?{Authorization:"Bearer ".concat(Object(b.b)())}:{}},Fn={state:{statuses:[],statusesLoading:!0,user:{},userCredentials:{},userProfileLoading:!0},mutations:{SET_STATUSES:function(e,t){e.statuses=t},SET_STATUSES_LOADING:function(e,t){e.statusesLoading=t},SET_USER:function(e,t){e.user=t},SET_USER_PROFILE_LOADING:function(e,t){e.userProfileLoading=t},SET_USER_CREDENTIALS:function(e,t){e.userCredentials=t}},actions:{FetchUserProfile:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=n.userId,i=n.godmode,a("SET_USER_PROFILE_LOADING",!0),e.next=5,bn(o,s.authHost,s.token);case 5:c=e.sent,a("SET_USER",c.data),a("SET_USER_PROFILE_LOADING",!1),r("FetchUserStatuses",{userId:o,godmode:i});case 9:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),FetchUserStatuses:function(e,t){var n=e.commit,a=e.dispatch,r=e.getters,s=t.userId,o=t.godmode;n("SET_STATUSES_LOADING",!0),function(e,t,n,a){return Mn.apply(this,arguments)}(s,r.authHost,o,r.token).then(function(e){return a("SetStatuses",e.data)}),n("SET_STATUSES_LOADING",!1)},FetchUserCredentials:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.nickname,e.next=4,Tn(s,r.authHost,r.token);case 4:o=e.sent,a("SET_USER_CREDENTIALS",o.data);case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetStatuses:function(e,t){(0,e.commit)("SET_STATUSES",t)},UpdateUserCredentials:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.nickname,o=n.credentials,e.next=4,En(s,o,r.authHost,r.token);case 4:a("FetchUserCredentials",{nickname:s});case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}},Gn={state:{fetchedUsers:[],loading:!0,searchQuery:"",totalUsersCount:0,currentPage:1,pageSize:50,filters:{local:!1,external:!1,active:!1,deactivated:!1},passwordResetToken:{token:"",link:""}},mutations:{SET_USERS:function(e,t){e.fetchedUsers=t},SET_LOADING:function(e,t){e.loading=t},SWAP_USERS:function(e,t){var n=t.reduce(function(e,t){return e.filter(function(e){return e.id!==t.id})},e.fetchedUsers);if(0!==e.fetchedUsers.length){var a=[].concat(J()(n),J()(t));e.fetchedUsers=a.filter(function(e){return e.nickname&&e.id}).sort(function(e,t){return e.nickname.localeCompare(t.nickname)}).concat(a.filter(function(e){return!e.nickname||!e.id}))}},SET_COUNT:function(e,t){e.totalUsersCount=t},SET_PAGE:function(e,t){e.currentPage=t},SET_PAGE_SIZE:function(e,t){e.pageSize=t},SET_PASSWORD_RESET_TOKEN:function(e,t){var n=t.token,a=t.link;e.passwordResetToken.token=n,e.passwordResetToken.link=a},SET_SEARCH_QUERY:function(e,t){e.searchQuery=t},SET_USERS_FILTERS:function(e,t){e.filters=t}},actions:{ActivateUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n._userId,i=s.map(function(e){return L()({},e,{deactivated:!1})}),c=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:i,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,on(c,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:o});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ApplyChanges:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.state,o=n.updatedUsers,i=n.callApiFn,c=n.userId,u=n.statusId,a("SWAP_USERS",o),e.prev=3,e.next=6,i();case 6:e.next=11;break;case 8:return e.prev=8,e.t0=e.catch(3),e.abrupt("return");case 11:return e.prev=11,r("SearchUsers",{query:s.searchQuery,page:s.currentPage}),e.finish(11);case 14:u?r("FetchStatusAfterUserModeration",u):c&&r("FetchUserProfile",{userId:c,godmode:!1}),r("SuccessMessage");case 16:case"end":return e.stop()}},e,null,[[3,8,11,14]])}));return function(t,n){return e.apply(this,arguments)}}(),AddRight:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.right,i=n._userId,c=n._statusId,u=s.map(function(e){return e.local?L()({},e,{roles:L()({},e.roles,xt()({},o,!0))}):e}),l=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:u,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,un(l,o,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i,statusId:c});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),AddTag:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.tag,i=n._userId,c=n._statusId,u=s.map(function(e){return L()({},e,{tags:[].concat(J()(e.tags),[o])})}),l=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:u,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Dn(l,[o],r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i,statusId:c});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ClearUsersState:function(e){var t=e.commit;t("SET_SEARCH_QUERY",""),t("SET_USERS_FILTERS",{local:!1,external:!1,active:!1,deactivated:!1})},ClearFilters:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:n=t.commit,a=t.dispatch,r=t.state,n("CLEAR_USERS_FILTERS"),a("SearchUsers",{query:r.searchQuery,page:1});case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),CreateNewAccount:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=t.state,o=n.nickname,i=n.email,c=n.password,e.prev=2,e.next=5,pn(o,i,c,r.authHost,r.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:return e.prev=10,a("SearchUsers",{query:s.searchQuery,page:s.currentPage}),e.finish(10);case 13:a("SuccessMessage");case 14:case"end":return e.stop()}},e,null,[[2,7,10,13]])}));return function(t,n){return e.apply(this,arguments)}}(),DeactivateUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n._userId,i=s.map(function(e){return L()({},e,{deactivated:!0})}),c=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:i,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,hn(c,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:o});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ConfirmUsersEmail:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n._userId,i=n._statusId,c=s.map(function(e){return L()({},e,{confirmation_pending:!1})}),u=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:c,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,zn(u,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:o,statusId:i});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ResendConfirmationEmail:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.map(function(e){return e.nickname}),e.prev=2,e.next=5,Hn(s,r.authHost,r.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:a("SuccessMessage");case 11:case"end":return e.stop()}},e,null,[[2,7]])}));return function(t,n){return e.apply(this,arguments)}}(),DeleteRight:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.right,i=n._userId,c=n._statusId,u=s.map(function(e){return e.local?L()({},e,{roles:L()({},e.roles,xt()({},o,!1))}):e}),l=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:u,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fn(l,o,r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i,statusId:c});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),DeleteUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l,p;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=t.state,i=n.users,c=n._userId,u=i.map(function(e){return e.nickname}),e.prev=3,e.next=6,gn(u,s.authHost,s.token);case 6:e.next=11;break;case 8:return e.prev=8,e.t0=e.catch(3),e.abrupt("return");case 11:l=i.map(function(e){return e.id}),p=o.fetchedUsers.filter(function(e){return!l.includes(e.id)}),a("SET_USERS",p),r("FetchUserProfile",{userId:c,godmode:!1}),r("SuccessMessage");case 16:case"end":return e.stop()}},e,null,[[3,8]])}));return function(t,n){return e.apply(this,arguments)}}(),FetchUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.dispatch,s=t.getters,o=t.state,i=n.page,a("SET_LOADING",!0),c=Object.keys(o.filters).filter(function(e){return o.filters[e]}).join(),e.next=6,kn(c,s.authHost,s.token,i);case 6:return u=e.sent,e.next=9,r("GetNodeInfo");case 9:Yn(a,i,u.data);case 10:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),GetPasswordResetToken:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,e.next=3,On(n,r.authHost,r.token);case 3:s=e.sent,o=s.data,a("SET_PASSWORD_RESET_TOKEN",o);case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),RemovePasswordToken:function(e){(0,e.commit)("SET_PASSWORD_RESET_TOKEN",{link:"",token:""})},RemoveTag:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.dispatch,r=t.getters,s=n.users,o=n.tag,i=n._userId,c=n._statusId,u=s.map(function(e){return L()({},e,{tags:e.tags.filter(function(e){return e!==o})})}),l=s.map(function(e){return e.nickname}),a("ApplyChanges",{updatedUsers:u,callApiFn:function(){var e=g()(f.a.mark(function e(){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,jn(l,[o],r.authHost,r.token);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(){return e.apply(this,arguments)}}(),userId:i,statusId:c});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),RequirePasswordReset:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.dispatch,r=t.getters,s=n.map(function(e){return e.nickname}),e.prev=2,e.next=5,Ln(s,r.authHost,r.token);case 5:e.next=10;break;case 7:return e.prev=7,e.t0=e.catch(2),e.abrupt("return");case 10:a("SuccessMessage");case 11:case"end":return e.stop()}},e,null,[[2,7]])}));return function(t,n){return e.apply(this,arguments)}}(),SearchUsers:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i,c,u,l;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.commit,r=t.dispatch,s=t.state,o=t.getters,i=n.query,c=n.page,0!==i.length){e.next=7;break}a("SET_SEARCH_QUERY",i),r("FetchUsers",{page:c}),e.next=14;break;case 7:return a("SET_LOADING",!0),a("SET_SEARCH_QUERY",i),u=Object.keys(s.filters).filter(function(e){return s.filters[e]}).join(),e.next=12,Cn(i,u,o.authHost,o.token,c);case 12:l=e.sent,Yn(a,c,l.data);case 14:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SuccessMessage:function(){i.Message.success({message:W.a.t("users.completed"),duration:5e3})},ToggleUsersFilter:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.commit,r=t.dispatch,s=t.state,o={local:!1,external:!1,active:!1,deactivated:!1},i=L()({},o,n),a("SET_USERS_FILTERS",i),r("SearchUsers",{query:s.searchQuery,page:1});case 5:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}},Yn=function(e,t,n){var a=n.users,r=n.count,s=n.page_size;e("SET_USERS",a),e("SET_COUNT",r),e("SET_PAGE",t),e("SET_PAGE_SIZE",s),e("SET_LOADING",!1)},$n=Gn,qn={sidebar:function(e){return e.app.sidebar},language:function(e){return e.app.language},size:function(e){return e.app.size},device:function(e){return e.app.device},visitedViews:function(e){return e.tagsView.visitedViews},cachedViews:function(e){return e.tagsView.cachedViews},token:function(e){return e.user.token},avatar:function(e){return e.user.avatar},name:function(e){return e.user.name},introduction:function(e){return e.user.introduction},status:function(e){return e.user.status},roles:function(e){return e.user.roles},setting:function(e){return e.user.setting},permission_routers:function(e){return e.permission.routers},addRouters:function(e){return e.permission.addRouters},errorLogs:function(e){return e.errorLog.logs},users:function(e){return e.users.fetchedUsers},authHost:function(e){return e.user.authHost},settings:function(e){return e.settings}},Kn=n("mm8V"),Wn={state:{activeCollapseItems:[],localPacks:{},remoteInstance:"",remotePacks:{}},mutations:{SET_ACTIVE_COLLAPSE_ITEMS:function(e,t){e.activeCollapseItems=t},SET_LOCAL_PACKS:function(e,t){e.localPacks=t},SET_REMOTE_INSTANCE:function(e,t){e.remoteInstance=t},SET_REMOTE_PACKS:function(e,t){e.remotePacks=t},UPDATE_LOCAL_PACK_VAL:function(e,t){var n=t.name,a=t.key,s=t.value;r.default.set(e.localPacks[n].pack,a,s)},UPDATE_LOCAL_PACK_PACK:function(e,t){var n=t.name,a=t.pack;e.localPacks[n].pack=a},UPDATE_LOCAL_PACK_FILES:function(e,t){var n=t.name,a=t.files;r.default.set(e.localPacks[n],"files",a)}},actions:{AddNewEmojiFile:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,c,u,l;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.packName,o=n.file,c=n.shortcode,u=n.filename,e.prev=2,e.next=5,Object(Kn.a)(s,o,c,u,r.authHost,r.token);case 5:l=e.sent,e.next=11;break;case 8:return e.prev=8,e.t0=e.catch(2),e.abrupt("return");case 11:Object(i.Message)({message:"".concat(W.a.t("settings.successfullyUpdated")," ").concat(s," ").concat(W.a.t("settings.metadatLowerCase")),type:"success",duration:5e3}),a("UPDATE_LOCAL_PACK_FILES",{name:s,files:l.data});case 13:case"end":return e.stop()}},e,null,[[2,8]])}));return function(t,n){return e.apply(this,arguments)}}(),DeleteEmojiFile:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.packName,o=n.shortcode,e.prev=2,e.next=5,Object(Kn.d)(s,o,r.authHost,r.token);case 5:c=e.sent,e.next=11;break;case 8:return e.prev=8,e.t0=e.catch(2),e.abrupt("return");case 11:Object(i.Message)({message:"".concat(W.a.t("settings.successfullyUpdated")," ").concat(s," ").concat(W.a.t("settings.metadatLowerCase")),type:"success",duration:5e3}),a("UPDATE_LOCAL_PACK_FILES",{name:s,files:c.data});case 13:case"end":return e.stop()}},e,null,[[2,8]])}));return function(t,n){return e.apply(this,arguments)}}(),CreatePack:function(){var e=g()(f.a.mark(function e(t,n){var a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.getters,r=n.name,e.next=4,Object(Kn.c)(a.authHost,a.token,r);case 4:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),DeletePack:function(){var e=g()(f.a.mark(function e(t,n){var a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.getters,r=n.name,e.next=4,Object(Kn.e)(a.authHost,a.token,r);case 4:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),DownloadFrom:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.getters,r=n.instanceAddress,s=n.packName,o=n.as,e.next=4,Object(Kn.f)(a.authHost,r,s,o,a.token);case 4:"ok"===e.sent.data&&Object(i.Message)({message:"".concat(W.a.t("settings.successfullyDownloaded")," ").concat(s),type:"success",duration:5e3});case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),ImportFromFS:function(){var e=g()(f.a.mark(function e(t){var n,a,r;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.getters,e.next=3,Object(Kn.g)(n.authHost,n.token);case 3:200===(a=e.sent).status&&(r=a.data.length>0?"".concat(W.a.t("settings.successfullyImported")," ").concat(a.data):W.a.t("settings.nowNewPacksToImport"),Object(i.Message)({message:r,type:"success",duration:5e3}));case 5:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),ReloadEmoji:function(){var e=g()(f.a.mark(function e(t){var n;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.getters,e.next=3,Object(Kn.j)(n.authHost,n.token);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),SavePackMetadata:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,c;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=t.state,o=n.packName,e.next=4,Object(Kn.k)(r.authHost,r.token,o,s.localPacks[o].pack);case 4:200===(c=e.sent).status&&(Object(i.Message)({message:"".concat(W.a.t("settings.successfullyUpdated")," ").concat(o," ").concat(W.a.t("settings.metadatLowerCase")),type:"success",duration:5e3}),a("UPDATE_LOCAL_PACK_PACK",{name:o,pack:c.data}));case 6:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetActiveCollapseItems:function(e,t){var n=e.commit;e.state;n("SET_ACTIVE_COLLAPSE_ITEMS",t)},SetLocalEmojiPacks:function(){var e=g()(f.a.mark(function e(t){var n,a,r,s;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=t.commit,a=t.getters,e.next=3,Object(Kn.h)(a.authHost);case 3:r=e.sent,s=r.data,n("SET_LOCAL_PACKS",s);case 6:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),SetRemoteEmojiPacks:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,i;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.remoteInstance,e.next=4,Object(Kn.i)(r.authHost,r.token,s);case 4:o=e.sent,i=o.data,a("SET_REMOTE_INSTANCE",s),a("SET_REMOTE_PACKS",i);case 8:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}(),SetRemoteInstance:function(e,t){(0,e.commit)("SET_REMOTE_INSTANCE",t)},UpdateEmojiFile:function(){var e=g()(f.a.mark(function e(t,n){var a,r,s,o,c,u,l,p;return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return a=t.commit,r=t.getters,s=n.packName,o=n.shortcode,c=n.newShortcode,u=n.newFilename,l=n.force,e.prev=2,e.next=5,Object(Kn.l)(s,o,c,u,l,r.authHost,r.token);case 5:p=e.sent,e.next=11;break;case 8:return e.prev=8,e.t0=e.catch(2),e.abrupt("return");case 11:Object(i.Message)({message:"".concat(W.a.t("settings.successfullyUpdated")," ").concat(s," ").concat(W.a.t("settings.metadatLowerCase")),type:"success",duration:5e3}),a("UPDATE_LOCAL_PACK_FILES",{name:s,files:p.data});case 13:case"end":return e.stop()}},e,null,[[2,8]])}));return function(t,n){return e.apply(this,arguments)}}(),UpdateLocalPackVal:function(){var e=g()(f.a.mark(function e(t,n){return f.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:(0,t.commit)("UPDATE_LOCAL_PACK_VAL",n);case 2:case"end":return e.stop()}},e)}));return function(t,n){return e.apply(this,arguments)}}()}};r.default.use(h.a);var Zn=new h.a.Store({modules:{app:_,errorLog:O,moderationLog:U,invites:Z,peers:ne,permission:rt,relays:dt,reports:yt,settings:Pt,status:Zt,tagsView:Xt,user:sn,userProfile:Fn,users:$n,emojiPacks:Wn},getters:qn}),Qn=n("zT9a");r.default.component("svg-icon",Qn.a);!function(e){e.keys().map(e)}(n("Uf/o")),r.default.config.errorHandler=function(e,t,n,a){r.default.nextTick(function(){Zn.dispatch("addErrorLog",{err:e,vm:t,info:n,url:window.location.href}),console.error(e,n)})};var Jn=n("Mj6V"),Xn=n.n(Jn);n("pdi6");Xn.a.configure({showSpinner:!1});var ea=["/login","/auth-redirect","/login-pleroma"];function ta(e,t){return 1===e?e+t:e+t+"s"}function na(e){var t=Date.now()/1e3-Number(e);return t<3600?ta(~~(t/60)," minute"):t<86400?ta(~~(t/3600)," hour"):ta(~~(t/86400)," day")}function aa(e,t){for(var n=[{value:1e18,symbol:"E"},{value:1e15,symbol:"P"},{value:1e12,symbol:"T"},{value:1e9,symbol:"G"},{value:1e6,symbol:"M"},{value:1e3,symbol:"k"}],a=0;a=n[a].value)return(e/n[a].value+.1).toFixed(t).replace(/\.0+$|(\.[0-9]*[1-9])0+$/,"$1")+n[a].symbol;return e.toString()}function ra(e){return(+e||0).toString().replace(/^-?\d+/g,function(e){return e.replace(/(?=(?!\b)(\d{3})+$)/g,",")})}nt.beforeEach(function(e,t,n){Xn.a.start(),Object(b.b)()?"/login"===e.path?(n({path:"/"}),Xn.a.done()):0===Zn.getters.roles.length?Zn.dispatch("GetUserInfo").then(function(t){var a=t.data.pleroma.is_admin?["admin"]:[];Zn.dispatch("GenerateRoutes",{roles:a}).then(function(){nt.addRoutes(Zn.getters.addRouters),n(L()({},e,{replace:!0}))})}).catch(function(e){Zn.dispatch("FedLogOut").then(function(){Object(i.Message)({dangerouslyUseHTMLString:!0,message:e,type:"error",duration:1e4}),n({path:"/"})})}):function(e,t){return e.indexOf("admin")>=0||!t||e.some(function(e){return t.indexOf(e)>=0})}(Zn.getters.roles,e.meta.roles)?n():n({path:"/401",replace:!0,query:{noGoBack:!0}}):-1!==ea.indexOf(e.path)?n():(n("/login?redirect=".concat(e.path)),Xn.a.done())}),nt.afterEach(function(){Xn.a.done()}),r.default.use(c.a,{size:o.a.get("size")||"medium",i18n:function(e,t){return W.a.t(e,t)}}),Object.keys(a).forEach(function(e){r.default.filter(e,a[e])}),r.default.config.productionTip=!1,new r.default({el:"#app",router:nt,store:Zn,i18n:W.a,render:function(e){return e(d)}})},X4fA:function(e,t,n){"use strict";n.d(t,"b",function(){return i}),n.d(t,"f",function(){return c}),n.d(t,"d",function(){return u}),n.d(t,"a",function(){return l}),n.d(t,"e",function(){return p}),n.d(t,"c",function(){return d});var a=n("p46w"),r=n.n(a),s="Admin-Token",o="Auth-Host";function i(){return r.a.get(s)}function c(e){return r.a.set(s,e)}function u(){return r.a.remove(s)}function l(){return r.a.get(o)}function p(e){return r.a.set(o,e)}function d(){return r.a.remove(o)}},Xm3t:function(e,t,n){},Yymj:function(e,t,n){"use strict";var a=n("jf83");n.n(a).a},"Z+gY":function(e,t,n){"use strict";var a=n("Kcm3");n.n(a).a},ZZmv:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-excel",use:"icon-excel-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},ZoO1:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-guide",use:"icon-guide-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},cIpu:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-star",use:"icon-star-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},fhHp:function(e,t,n){"use strict";var a=n("lt0h");n.n(a).a},gNoN:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-wechat",use:"icon-wechat-usage",viewBox:"0 0 128 110",content:''});o.a.add(i);t.default=i},h74u:function(e,t,n){"use strict";n.d(t,"c",function(){return g}),n.d(t,"a",function(){return w}),n.d(t,"d",function(){return y}),n.d(t,"e",function(){return T}),n.d(t,"f",function(){return k}),n.d(t,"g",function(){return O}),n.d(t,"h",function(){return A}),n.d(t,"b",function(){return I});var a=n("RIqP"),r=n.n(a),s=n("cDf5"),o=n.n(s),i=n("lSNA"),c=n.n(i),u=n("MVZn"),l=n.n(u),p=n("J4zp"),d=n.n(p),h=n("SA+Z"),m=n.n(h),f=n("LvDl"),v=n.n(f),g=function(e){return"true"===e||"false"!==e&&e},w=function(e,t,n){return Object.keys(t).reduce(function(a,r){return a[r]=Object.keys(t[r]).reduce(function(a,s){if(!S(r,s)){var o=Object.keys(e[r][s]).reduce(function(t,a){var o=n.find(function(e){return e.group===r&&e.key===s}).children.find(function(e){return e.key===a}),i=o?o.type:"";return t[a]=[i,e[r][s][a]],t},{});return a[s]=o,a}return a[s]=t[r][s],a},{}),a},{})},b=function(e,t,n){if("state"===e)return v.a.get(t,n);var a=m()(n),r=a[0],s=a.slice(1),o=t[r];if(0!==s.length&&o){return function e(t,n){var a=m()(n),r=a[0],s=a.slice(1);return 0===n.length?t:e(t[1][r],s)}(o,s)}return o||!1},y=function(e,t){if(":backends"===e){var n=t.findIndex(function(e){return"object"===o()(e)&&e.tuple.includes(":ex_syslogger")});return t.map(function(e,t){return t===n?":ex_syslogger":e})}if(":args"===e){if("string"==typeof t)return[t];var a=t.findIndex(function(e){return"object"===o()(e)&&e.tuple.includes("implode")});return t.map(function(e,t){return t===a?"implode":e})}return t},T=function e(t,n){return t.reduce(function(t,a){return":rate_limit"===n?t[a.tuple[0]]=Array.isArray(a.tuple[1])?a.tuple[1].map(function(e){return e.tuple}):a.tuple[1].tuple:":mascots"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].reduce(function(e,t){return[].concat(r()(e),[c()({},t.tuple[0],l()({},t.tuple[1],{id:"f".concat((~~(1e8*Math.random())).toString(16))}))])},[]):!Array.isArray(a.tuple[1])||":groups"!==a.tuple[0]&&":replace"!==a.tuple[0]&&":retries"!==a.tuple[0]?":crontab"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].reduce(function(e,t){return l()({},e,c()({},t.tuple[1],t.tuple[0]))},{}):":match_actor"===a.tuple[0]?t[a.tuple[0]]=Object.keys(a.tuple[1]).reduce(function(e,t){return[].concat(r()(e),[c()({},t,{value:a.tuple[1][t],id:"f".concat((~~(1e8*Math.random())).toString(16))})])},[]):":icons"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].map(function(e){return Object.keys(e).map(function(t){return{key:t,value:e[t],id:"f".concat((~~(1e8*Math.random())).toString(16))}})},[]):":prune"===a.tuple[0]?t[a.tuple[0]]=":disabled"===a.tuple[1]?[a.tuple[1]]:a.tuple[1].tuple:":proxy_url"===a.tuple[0]?t[a.tuple[0]]=E(a.tuple[1]):":args"===a.tuple[0]?t[a.tuple[0]]=y(a.tuple[0],a.tuple[1]):Array.isArray(a.tuple[1])&&"object"===o()(a.tuple[1][0])&&!Array.isArray(a.tuple[1][0])&&a.tuple[1][0].tuple?t[a.tuple[0]]=e(a.tuple[1],a.tuple[0]):Array.isArray(a.tuple[1])?t[a.tuple[0]]=a.tuple[1]:":ip"===a.tuple[0]?t[a.tuple[0]]=a.tuple[1].tuple.join("."):a.tuple[1]&&"object"===o()(a.tuple[1])?t[a.tuple[0]]=x(a.tuple[1]):t[a.tuple[0]]=a.tuple[1]:t[a.tuple[0]]=a.tuple[1].reduce(function(e,t){return[].concat(r()(e),[c()({},t.tuple[0],{value:t.tuple[1],id:"f".concat((~~(1e8*Math.random())).toString(16))})])},[]),t},{})},x=function(e){return Object.keys(e).reduce(function(t,n){return t[n]=e[n],t},{})},E=function(e){if(e&&!Array.isArray(e)&&"object"===o()(e)&&3===e.tuple.length&&":socks5"===e.tuple[0]){var t=d()(e.tuple,3);return{socks5:!0,host:t[1],port:t[2]}}if("string"==typeof e){var n=e.split(":"),a=d()(n,2);return{socks5:!1,host:a[0],port:a[1]}}return{socks5:!1,host:null,port:null}},S=function(e,t){return!(":auto_linker"===e&&":opts"===t)},k=function e(t,n,a,s,o,i,u){var p=m()(o),d=p[0],h=d.key,f=d.type,v=p.slice(1),g=[a,s].concat(r()(o.reverse().map(function(e){return e.key}).slice(0,-1))),w=_("state",i,g)?l()({},b("state",i[a][s],o.map(function(e){return e.key}).slice(0,-1)),c()({},h,t)):c()({},h,t),y=_("updatedSettings",u,g)?l()({},b("updatedSettings",u[a][s],o.map(function(e){return e.key}).slice(0,-1))[1],c()({},h,[f,n])):c()({},h,[f,n]);return":mime"===a&&":types"===o[0].key&&(w=i[a][o[0].key]?l()({},i[a][o[0].key].value,w):w,y=i[a][o[0].key]?l()({},Object.keys(i[a][o[0].key].value).reduce(function(e,t){return l()({},e,c()({},t,[f,i[a][o[0].key].value[t]]))},{}),y):y),1===v.length?{valueForState:w,valueForUpdatedSettings:y,setting:v[0]}:e(w,y,a,s,v,i,u)},_=function(e,t,n){if("state"===e)return v.a.get(t,n);var a=m()(n),r=a[0],s=a[1],o=a[2],i=a.slice(3),c=v.a.get(t,[r,s,o]);if(0!==i.length&&c){return function e(t,n){if(0===n.length)return!0;var a=m()(n),r=a[0],s=a.slice(1);return!!t[1][r]&&e(t[1][r],s)}(c,i)}return c||!1},O=function(e,t){var n=Array.isArray(t)&&t.length>0&&t.every(function(e){return"object"!==o()(e)});return":meta"===e||":types"===e||":backends"===e||":compiled_template_engines"===e||":compiled_format_encoders"===e||"string"==typeof t||"number"==typeof t||"boolean"==typeof t||null===t||n},A=function(e,t,n){return Object.keys(t).map(function(a){return t[a]._value?{group:e,key:a,value:function(e,t){var n=d()(t,2),a=n[0],r=n[1];if("atom"===a&&r.length>1)return":".concat(r);if(":backends"===e){var s=r.findIndex(function(e){return":ex_syslogger"===e}),o=r.slice();return-1!==s&&(o[s]={tuple:["ExSyslogger",":ex_syslogger"]}),o}return":types"===e?Object.keys(r).reduce(function(e,t){return l()({},e,c()({},t,r[t][1]))},{}):r}(a,t[a]._value)}:{group:e,key:a,value:L(t[a],n[e][a])}})},L=function e(t,n){return Object.keys(t).map(function(a){var r=d()(t[a],2),s=r[0],o=r[1];if("keyword"===s||s.includes("keyword")||s.includes("tuple")&&s.includes("list")||":replace"===a)return{tuple:[a,e(o,n)]};if("atom"===s&&o.length>0)return{tuple:[a,":".concat(o)]};if(s.includes("tuple")&&(s.includes("string")||s.includes("atom")))return"string"==typeof o?{tuple:[a,o]}:{tuple:[a,{tuple:o}]};if("reversed_tuple"===s)return{tuple:[o,a]};if("map"===s){var i=Object.keys(o).reduce(function(e,t){return e[t]=":match_actor"===a?o[t]:o[t][1],e},{}),u=":match_actor"===a?n[a].reduce(function(e,t){return l()({},e,c()({},Object.keys(t)[0],Object.values(t)[0].value))},{}):n[a];return{tuple:[a,l()({},u,i)]}}if(":ip"===a){var p=o.split(".").map(function(e){return parseInt(e,10)});return{tuple:[a,{tuple:p}]}}if(":args"===a){var h=o.findIndex(function(e){return"implode"===e}),m=o.slice();return-1!==h&&(m[h]={tuple:["implode","1"]}),{tuple:[a,m]}}return{tuple:[a,o]}})},I=function(e){return e.reduce(function(e,t){var n=v.a.compact([t.key,t.label,t.description]).map(function(e){return e.toLowerCase()}),a={label:t.label,key:t.key||t.group,groupKey:t.key||t.group,groupLabel:t.label,search:n};if(t.children){var s=t.key||":pleroma"!==t.group?[].concat(r()(e),[a]):e;return[].concat(r()(s),r()(function e(t,n,a){return t.reduce(function(t,s){var o=v.a.compact([s.key,s.label,s.description]).map(function(e){return e.toLowerCase()}),i={label:s.label,key:s.key||s.group,groupKey:a,groupLabel:n,search:o};if(s.children){var c=[].concat(r()(t),[i]);return[].concat(r()(c),r()(e(s.children,n,a)))}return[].concat(r()(t),[i])},[])}(t.children,t.label,t.key||t.group)))}return t.key||":pleroma"!==t.group?[].concat(r()(e),[a]):e},[])}},hkRB:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-size",use:"icon-size-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},iqZD:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-zip",use:"icon-zip-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},j7e1:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-tab",use:"icon-tab-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},jf83:function(e,t,n){},jo2x:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-search",use:"icon-search-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},k80C:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-tree",use:"icon-tree-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},kPu2:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-documentation",use:"icon-documentation-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},lt0h:function(e,t,n){},"m7++":function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-drag",use:"icon-drag-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},mDMp:function(e,t,n){"use strict";var a=n("Tfa4");n.n(a).a},mSHS:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-fullscreen",use:"icon-fullscreen-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},mSNy:function(e,t,n){"use strict";var a=n("MVZn"),r=n.n(a),s=n("Kw5r"),o=n("qSUR"),i=n("p46w"),c=n.n(i),u=n("stYL"),l=n.n(u),p=n("8NkQ"),d=n.n(p),h=n("PtZe"),m=n.n(h);s.default.use(o.a);var f={en:r()({},{route:{dashboard:"Dashboard",introduction:"Introduction",documentation:"Documentation",guide:"Guide",permission:"Permission",pagePermission:"Page Permission",directivePermission:"Directive Permission",icons:"Icons",components:"Components",componentIndex:"Introduction",markdown:"Markdown",jsonEditor:"JSON Editor",dndList:"Dnd List",splitPane:"SplitPane",avatarUpload:"Avatar Upload",dropzone:"Dropzone",sticky:"Sticky",countTo:"CountTo",componentMixin:"Mixin",backToTop:"BackToTop",dragDialog:"Drag Dialog",dragSelect:"Drag Select",dragKanban:"Drag Kanban",charts:"Charts",keyboardChart:"Keyboard Chart",lineChart:"Line Chart",mixChart:"Mix Chart",example:"Example",nested:"Nested Routes",menu1:"Menu 1","menu1-1":"Menu 1-1","menu1-2":"Menu 1-2","menu1-2-1":"Menu 1-2-1","menu1-2-2":"Menu 1-2-2","menu1-3":"Menu 1-3",menu2:"Menu 2",Table:"Table",dynamicTable:"Dynamic Table",dragTable:"Drag Table",inlineEditTable:"Inline Edit",complexTable:"Complex Table",treeTable:"Tree Table",customTreeTable:"Custom TreeTable",tab:"Tab",form:"Form",createArticle:"Create Article",editArticle:"Edit Article",articleList:"Article List",errorPages:"Error Pages",page401:"401",page404:"404",errorLog:"Error Log",excel:"Excel",exportExcel:"Export Excel",selectExcel:"Export Selected",uploadExcel:"Upload Excel",zip:"Zip",pdf:"PDF",exportZip:"Export Zip",theme:"Theme",clipboardDemo:"Clipboard",i18n:"I18n",externalLink:"External Link",users:"Users",reports:"Reports",settings:"Settings",moderationLog:"Moderation Log","emoji-packs":"Emoji packs"},navbar:{logOut:"Log Out",dashboard:"Dashboard",github:"Github",theme:"Theme",size:"Global Size"},login:{title:"Login Form",logIn:"Log in",logInViaPleromaFE:"Log in via PleromaFE",username:"username@host",password:"password",omitHostname:"omit hostname if Pleroma is located on this domain",errorMessage:"Username must contain username and host, e.g. john@pleroma.social",any:"any",thirdparty:"Or connect with",pleromaFELoginFailed:"Failed to login via PleromaFE, please login with username/password",pleromaFELoginSucceed:"Logged in via PleromaFE"},documentation:{documentation:"Documentation",github:"Github Repository"},permission:{roles:"Your roles",switchRoles:"Switch roles",tips:"In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if."},guide:{description:"The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ",button:"Show Guide"},components:{documentation:"Documentation",dropzoneTips:"Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.",stickyTips:"when the page is scrolled to the preset position will be sticky on the top.",backToTopTips1:"When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner",backToTopTips2:"You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally",imageUploadTips:"Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version."},table:{dynamicTips1:"Fixed header, sorted by header order",dynamicTips2:"Not fixed header, sorted by click order",dragTips1:"The default order",dragTips2:"The after dragging order",title:"Title",importance:"Imp",type:"Type",remark:"Remark",search:"Search",add:"Add",export:"Export",reviewer:"reviewer",id:"ID",date:"Date",author:"Author",readings:"Readings",status:"Status",actions:"Actions",edit:"Edit",publish:"Publish",draft:"Draft",delete:"Delete",cancel:"Cancel",confirm:"Confirm"},errorLog:{tips:"Please click the bug icon in the upper right corner",description:"Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.",documentation:"Document introduction"},excel:{export:"Export",selectedExport:"Export Selected Items",placeholder:"Please enter the file name(default excel-list)"},zip:{export:"Export",placeholder:"Please enter the file name(default file)"},pdf:{tips:"Here we use window.print() to implement the feature of downloading pdf."},theme:{change:"Change Theme",documentation:"Theme documentation",tips:"Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details."},tagsView:{refresh:"Refresh",close:"Close",closeOthers:"Close Others",closeAll:"Close All"},users:{users:"Users",localUsersOnly:"Local users only",search:"Search",id:"ID",name:"Name",status:"Status",local:"Local",external:"External",deactivated:"Deactivated",active:"Active",unconfirmed:"Unconfirmed",actions:"Actions",activate:"Activate",deactivate:"Deactivate",admin:"Admin",moderator:"Moderator",moderation:"Moderation",revokeAdmin:"Revoke Admin",grantAdmin:"Grant Admin",revokeModerator:"Revoke Moderator",grantModerator:"Grant Moderator",activateAccount:"Activate Account",activateAccounts:"Activate Accounts",deactivateAccount:"Deactivate Account",deactivateAccounts:"Deactivate Accounts",deleteAccount:"Delete Account",deleteAccounts:"Delete Accounts",forceNsfw:"Force posts to be NSFW",stripMedia:"Force posts to not have media",forceUnlisted:"Force posts to be unlisted",sandbox:"Force posts to be followers-only",disableRemoteSubscription:"Disallow following user from remote instances",disableRemoteSubscriptionForMultiple:"Disallow following users from remote instances",disableAnySubscription:"Disallow following user at all",disableAnySubscriptionForMultiple:"Disallow following users at all",requirePasswordReset:"Require password reset on next login",selectUsers:"Select users to apply actions to multiple users",moderateUser:"Moderate user",moderateUsers:"Moderate multiple users",createAccount:"Create new account",apply:"Apply",remove:"Remove",grantRightConfirmation:"Are you sure you want to grant {right} rights to all selected users?",revokeRightConfirmation:"Are you sure you want to revoke {right} rights from all selected users?",activateMultipleUsersConfirmation:"Are you sure you want to activate accounts of all selected users?",deactivateMultipleUsersConfirmation:"Are you sure you want to deactivate accounts of all selected users?",deleteMultipleUsersConfirmation:"Are you sure you want to delete accounts of all selected users?",addTagForMultipleUsersConfirmation:"Are you sure you want to apply tag to all selected users?",removeTagFromMultipleUsersConfirmation:"Are you sure you want to remove tag from all selected users?",requirePasswordResetConfirmation:"Are you sure you want to require password reset for all selected users?",confirmAccountsConfirmation:"Are you sure you want to confirm emails for all selected users?",resendEmailConfirmation:"Are you sure you want to resend confirmation email for all selected users?",mailerMustBeEnabled:"To require user's password reset you must enable mailer.",ok:"Okay",completed:"Completed",cancel:"Cancel",canceled:"Canceled",username:"Username",email:"E-mail",password:"Password",create:"Create",submitFormError:"There are invalid values in the form. Please fix them before continuing.",emptyEmailError:"Please input the e-mail",invalidEmailError:"Please input valid e-mail",emptyPasswordError:"Please input the password",emptyNicknameError:"Please input the username",invalidNicknameError:'Username can include "a-z", "A-Z" and "0-9" characters',getPasswordResetToken:"Get password reset token",passwordResetTokenCreated:"Password reset token was created",accountCreated:"New account was created!",unconfirmedEmail:"User didn't confirm the email",confirmAccount:"Confirm account",confirmAccounts:"Confirm accounts",resendConfirmation:"Resend confirmation email",invalidAccount:"This account has invalid nickname and can't be modified",invalidNickname:"invalid nickname",passwordResetTokenGenerated:"Password reset token was generated:",linkToResetPassword:"You can also use this link to reset password:"},statuses:{statuses:"Statuses",instanceFilter:"Instance filter",loadMore:"Load more",noInstances:"No other instances found",onlyLocalStatuses:"Show only local statuses",showPrivateStatuses:"Show private statuses",direct:"Direct",private:"Private",public:"Public",unlisted:"Unlisted",openStatusInInstance:"Open status in instance"},userProfile:{tags:"Tags",moderator:"Moderator",admin:"Admin",local:"Local",external:"External",accountType:"Account type",nickname:"Nickname",recentStatuses:"Recent Statuses",roles:"Roles",active:"Active",status:"Status",deactivated:"Deactivated",noStatuses:"No statuses to show",openAccountInInstance:"Open account in instance",securitySettings:{email:"Email",password:"Password",securitySettings:"Security settings",passwordChangeWarning1:"Setting a new password will cause the user to be signed out from any client they have used before.",passwordChangeWarning2:"When the user signs in with this password, they will be asked to set a new one.",passwordLengthNotice:"Make sure it's at least {minLength} characters long.",inputNewEmail:"Input new email",inputNewPassword:"Input new password",passwordUpdated:"The password has been updated",emailUpdated:"The email has been updated",success:"Success",submit:"Submit",close:"Close"}},usersFilter:{inputPlaceholder:"Select filter",byAccountType:"By account type",local:"Local",external:"External",byStatus:"By status",active:"Active",deactivated:"Deactivated"},reports:{reports:"Reports",report:"Report",reply:"Reply",from:"From",showNotes:"Show notes",newNote:"New note",submit:"Submit",confirmMsg:"Are you sure you want to delete this note?",delete:"Delete",cancel:"Cancel",deleteCompleted:"Delete comleted",deleteCanceled:"Delete canceled",noNotes:"No notes to display",changeState:"Change report's state",changeAllReports:"Change all reports",changeScope:"Change scope",moderateUser:"Moderate user",resolve:"Resolve",reopen:"Reopen",close:"Close",resolveAll:"Resolve all",reopenAll:"Reopen all",closeAll:"Close all",addSensitive:"Add Sensitive flag",removeSensitive:"Remove Sensitive flag",public:"Make status public",private:"Make status private",unlisted:"Make status unlisted",sensitive:"Sensitive",deleteStatus:"Delete status",reportOn:"Report on",reportsOn:"Reports on",id:"ID",account:"Account",actor:"Actor",actors:"Actors",content:"Content",reportedStatus:"Reported status",statusDeleted:"This status has been deleted",leaveNote:"Leave a note",postNote:"Send",deleteNote:"Delete",notFound:"account not found"},reportsFilter:{inputPlaceholder:"Select filter",open:"Open",closed:"Closed",resolved:"Resolved"},moderationLog:{moderationLog:"Moderation Log"},settings:{settings:"Settings",instance:"Instance",upload:"Upload",mailer:"Mailer",logger:"Logger",activityPub:"ActivityPub",auth:"Authentication",autoLinker:"Auto Linker",captcha:"Captcha",frontend:"Frontend",http:"HTTP",mrf:"MRF",mediaProxy:"Media Proxy",metadata:"Metadata",gopher:"Gopher",jobQueue:"Job queue",webPush:"Web push encryption",esshd:"BBS / SSH access",rateLimiters:"Rate limiters",other:"Other",relays:"Relays",follow:"Follow",followRelay:"Follow new relay",instanceUrl:"Instance URL",success:"Settings changed successfully!",description:"Description",removeFromDB:"Remove setting from the DB",successfullyDownloaded:"Successfully downloaded",successfullyImported:"Successfully imported",nowNewPacksToImport:"No new packs to import",successfullyUpdated:"Successfully updated",metadatLowerCase:"metadata",files:"files",successfullyRemoved:"Setting removed successfully!",seeDocs:"See Documentation",assets:"Assets",emoji:"Emoji",markup:"Markup settings",corsPlug:"CORS plug config",instanceReboot:"Reboot Instance",restartApp:"You must restart the instance to apply settings",restartSuccess:"Instance rebooted successfully!",removeSettingConfirmation:"Are you sure you want to remove this setting's value from the database?"},invites:{inviteTokens:"Invite tokens",createInviteToken:"Generate invite token",pickDate:"Pick a date",maxUse:"Max use",expiresAt:"Expires at",tokenCreated:"Invite token was created",token:"Token",inviteLink:"Invite link",uses:"Uses",used:"Used",cancel:"Cancel",create:"Create",revoke:"Revoke",id:"ID",actions:"Actions",active:"Active",inviteUserViaEmail:"Invite user via email",sendRegistration:"Send registration invite via email",email:"Email",name:"Name",emptyEmailError:"Please input the e-mail",invalidEmailError:"Please input valid e-mail",emailSent:"Invite was sent",submitFormError:"There are invalid values in the form. Please fix them before continuing.",inviteViaEmailAlert:"To send invite via email make sure to enable `invites_enabled` and disable `registrations_open`"},emoji:{emojiPacks:"Emoji packs",reloaded:"Emoji reloaded successfully!",refreshed:"Emoji refreshed successfully!",importEmojiTooltip:"Importing from the filesystem will scan the directories and import those without pack.json but with emoji.txt or without neither",reloadEmoji:"Reload emoji",importPacks:"Import packs from the server filesystem",localPacks:"Local packs",refreshLocalPacks:"Refresh local packs",createLocalPack:"Create a new local pack",remotePacks:"Remote packs",remoteInstanceAddress:"Remote instance address",refreshRemote:"Refresh remote packs",sharePack:"Share pack",required:"required",homepage:"Homepage",description:"Description",packs:"Packs",license:"License",shortcode:"Shortcode",fallbackSrc:"Fallback source",fallbackSrcSha:"Fallback source SHA",saveMetadata:"Save metadata",deletePack:"Delete pack",downloadPack:"Download pack",downloadPackArchive:"Download pack archive",addNewEmoji:"Add new emoji to the pack",manageEmoji:"Manage existing emoji",thisWillDownload:"This will download the",downloadToCurrentInstance:"pack to the current instance under the name",canBeChanged:"can be changed below",willBeUsable:"It will then be usable and shareable from the current instance",downloadAsOptional:"Download as (optional)",downloadSharedPack:"Download shared pack to current instance",downloadSharedPackMobile:"Download pack to instance",optional:"optional",uploadFile:"Upload a file",url:"URL",clickToUpload:"Click to upload",upload:"Upload",customFilename:"Custom filename",customFilenameDesc:"Custom file name (optional)",file:"File",localPack:"Local pack",leaveEmptyShortcode:"leave empty to use the same shortcode",leaveEmptyFilename:"leave empty to use the same filename",update:"Update",remove:"Remove",selectLocalPack:"Select the local pack to copy to",specifyShortcode:"Specify a custom shortcode",specifyFilename:"Specify a custom filename",copy:"Copy",copyToLocalPack:"Copy to local pack"}},l.a),zh:r()({},{route:{dashboard:"首页",introduction:"简述",documentation:"文档",guide:"引导页",permission:"权限测试页",pagePermission:"页面权限",directivePermission:"指令权限",icons:"图标",components:"组件",componentIndex:"介绍",markdown:"Markdown",jsonEditor:"JSON编辑器",dndList:"列表拖拽",splitPane:"Splitpane",avatarUpload:"头像上传",dropzone:"Dropzone",sticky:"Sticky",countTo:"CountTo",componentMixin:"小组件",backToTop:"返回顶部",dragDialog:"拖拽 Dialog",dragSelect:"拖拽 Select",dragKanban:"可拖拽看板",charts:"图表",keyboardChart:"键盘图表",lineChart:"折线图",mixChart:"混合图表",example:"综合实例",nested:"路由嵌套",menu1:"菜单1","menu1-1":"菜单1-1","menu1-2":"菜单1-2","menu1-2-1":"菜单1-2-1","menu1-2-2":"菜单1-2-2","menu1-3":"菜单1-3",menu2:"菜单2",Table:"Table",dynamicTable:"动态Table",dragTable:"拖拽Table",inlineEditTable:"Table内编辑",complexTable:"综合Table",treeTable:"树形表格",customTreeTable:"自定义树表",tab:"Tab",form:"表单",createArticle:"创建文章",editArticle:"编辑文章",articleList:"文章列表",errorPages:"错误页面",page401:"401",page404:"404",errorLog:"错误日志",excel:"Excel",exportExcel:"Export Excel",selectExcel:"Export Selected",uploadExcel:"Upload Excel",zip:"Zip",pdf:"PDF",exportZip:"Export Zip",theme:"换肤",clipboardDemo:"Clipboard",i18n:"国际化",externalLink:"外链"},navbar:{logOut:"退出登录",dashboard:"首页",github:"项目地址",theme:"换肤",size:"布局大小"},login:{title:"系统登录",logIn:"登录",username:"账号",password:"密码",any:"随便填",thirdparty:"第三方登录",thirdpartyTips:"本地不能模拟,请结合自己业务进行模拟!!!"},documentation:{documentation:"文档",github:"Github 地址"},permission:{roles:"你的权限",switchRoles:"切换权限",tips:"在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。"},guide:{description:"引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于",button:"打开引导"},components:{documentation:"文档",dropzoneTips:"由于我司业务有特殊需求,而且要传七牛 所以没用第三方,选择了自己封装。代码非常的简单,具体代码你可以在这里看到 @/components/element-ui/Dropzone",stickyTips:"当页面滚动到预设的位置会吸附在顶部",backToTopTips1:"页面滚动到指定位置会在右下角出现返回顶部按钮",backToTopTips2:"可自定义按钮的样式、show/hide、出现的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素",imageUploadTips:"由于我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。"},table:{dynamicTips1:"固定表头, 按照表头顺序排序",dynamicTips2:"不固定表头, 按照点击顺序排序",dragTips1:"默认顺序",dragTips2:"拖拽后顺序",title:"标题",importance:"重要性",type:"类型",remark:"点评",search:"搜索",add:"添加",export:"导出",reviewer:"审核人",id:"序号",date:"时间",author:"作者",readings:"阅读数",status:"状态",actions:"操作",edit:"编辑",publish:"发布",draft:"草稿",delete:"删除",cancel:"取 消",confirm:"确 定"},errorLog:{tips:"请点击右上角bug小图标",description:"现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。",documentation:"文档介绍"},excel:{export:"导出",selectedExport:"导出已选择项",placeholder:"请输入文件名(默认excel-list)"},zip:{export:"导出",placeholder:"请输入文件名(默认file)"},pdf:{tips:"这里使用 window.print() 来实现下载pdf的功能"},theme:{change:"换肤",documentation:"换肤文档",tips:"Tips: 它区别于 navbar 上的 theme-pick, 是两种不同的换肤方法,各自有不同的应用场景,具体请参考文档。"},tagsView:{refresh:"刷新",close:"关闭",closeOthers:"关闭其它",closeAll:"关闭所有"}},d.a),es:r()({},{route:{dashboard:"Panel de control",introduction:"Introducción",documentation:"Documentación",guide:"Guía",permission:"Permisos",pagePermission:"Permisos de la página",directivePermission:"Permisos de la directiva",icons:"Iconos",components:"Componentes",componentIndex:"Introducción",markdown:"Markdown",jsonEditor:"Editor JSON",dndList:"Lista Dnd",splitPane:"Panel dividido",avatarUpload:"Subir avatar",dropzone:"Subir ficheros",sticky:"Sticky",countTo:"CountTo",componentMixin:"Mixin",backToTop:"Ir arriba",dragDialog:"Drag Dialog",dragSelect:"Drag Select",dragKanban:"Drag Kanban",charts:"Gráficos",keyboardChart:"Keyboard Chart",lineChart:"Gráfico de líneas",mixChart:"Mix Chart",example:"Ejemplo",nested:"Rutas anidadass",menu1:"Menu 1","menu1-1":"Menu 1-1","menu1-2":"Menu 1-2","menu1-2-1":"Menu 1-2-1","menu1-2-2":"Menu 1-2-2","menu1-3":"Menu 1-3",menu2:"Menu 2",Table:"Tabla",dynamicTable:"Tabla dinámica",dragTable:"Arrastrar tabla",inlineEditTable:"Editor",complexTable:"Complex Table",treeTable:"Tree Table",customTreeTable:"Custom TreeTable",tab:"Pestaña",form:"Formulario",createArticle:"Crear artículo",editArticle:"Editar artículo",articleList:"Listado de artículos",errorPages:"Páginas de error",page401:"401",page404:"404",errorLog:"Registro de errores",excel:"Excel",exportExcel:"Exportar a Excel",selectExcel:"Export seleccionado",uploadExcel:"Subir Excel",zip:"Zip",pdf:"PDF",exportZip:"Exportar a Zip",theme:"Tema",clipboardDemo:"Clipboard",i18n:"I18n",externalLink:"Enlace externo"},navbar:{logOut:"Salir",dashboard:"Panel de control",github:"Github",theme:"Tema",size:"Tamaño global"},login:{title:"Formulario de acceso",logIn:"Acceso",username:"Usuario",password:"Contraseña",any:"nada",thirdparty:"Conectar con",thirdpartyTips:"No se puede simular en local, así que combine su propia simulación de negocios. ! !"},documentation:{documentation:"Documentación",github:"Repositorio Github"},permission:{roles:"Tus permisos",switchRoles:"Cambiar permisos",tips:"In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if."},guide:{description:"The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ",button:"Ver guía"},components:{documentation:"Documentación",dropzoneTips:"Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.",stickyTips:"when the page is scrolled to the preset position will be sticky on the top.",backToTopTips1:"When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner",backToTopTips2:"You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally",imageUploadTips:"Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version."},table:{dynamicTips1:"Fixed header, sorted by header order",dynamicTips2:"Not fixed header, sorted by click order",dragTips1:"Orden por defecto",dragTips2:"The after dragging order",title:"Título",importance:"Importancia",type:"Tipo",remark:"Remark",search:"Buscar",add:"Añadir",export:"Exportar",reviewer:"reviewer",id:"ID",date:"Fecha",author:"Autor",readings:"Lector",status:"Estado",actions:"Acciones",edit:"Editar",publish:"Publicar",draft:"Draft",delete:"Eliminar",cancel:"Cancelar",confirm:"Confirmar"},errorLog:{tips:"Please click the bug icon in the upper right corner",description:"Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.",documentation:"Documento de introducción"},excel:{export:"Exportar",selectedExport:"Exportar seleccionados",placeholder:"Por favor escribe un nombre de fichero"},zip:{export:"Exportar",placeholder:"Por favor escribe un nombre de fichero"},pdf:{tips:"Here we use window.print() to implement the feature of downloading pdf."},theme:{change:"Cambiar tema",documentation:"Documentación del tema",tips:"Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details."},tagsView:{refresh:"Actualizar",close:"Cerrar",closeOthers:"Cerrar otros",closeAll:"Cerrar todos"}},m.a),oc:r()({},{route:{dashboard:"Tablèu de bòrd",introduction:"Introduccion",documentation:"Documentacion",guide:"Guida",permission:"Autorizacions",pagePermission:"Pagina d’autorizacion",directivePermission:"Politica d’autorizacion",icons:"Icònas",components:"Compausants",componentIndex:"Introduccion",markdown:"Markdown",jsonEditor:"JSON Editor",dndList:"Dnd List",splitPane:"SplitPane",avatarUpload:"Mandadís d’avatar",dropzone:"Dropzone",sticky:"Sticky",countTo:"CountTo",componentMixin:"Mixin",backToTop:"BackToTop",dragDialog:"Drag Dialog",dragSelect:"Drag Select",dragKanban:"Drag Kanban",charts:"Charts",keyboardChart:"Keyboard Chart",lineChart:"Line Chart",mixChart:"Mix Chart",example:"Exemple",nested:"Rotas imbricadas",menu1:"Menú 1","menu1-1":"Menu 1-1","menu1-2":"Menu 1-2","menu1-2-1":"Menu 1-2-1","menu1-2-2":"Menu 1-2-2","menu1-3":"Menu 1-3",menu2:"Menú 2",Table:"Tablèu",dynamicTable:"Tablèu dinamic",dragTable:"Drag Table",inlineEditTable:"Inline Edit",complexTable:"Tablèu complèx",treeTable:"Arborescéncia",customTreeTable:"Arborescéncia personalizada",tab:"Onglet",form:"Formulari",createArticle:"Crear un article",editArticle:"Modificar l’article",articleList:"Lista d’articles",errorPages:"Paginas d’error",page401:"401",page404:"404",errorLog:"Jornal d’error",excel:"Excel",exportExcel:"Exportacion Excel",selectExcel:"Exportar los seleccionats",uploadExcel:"Importacion Excel",zip:"Zip",pdf:"PDF",exportZip:"Exportacion Zip",theme:"Tèma",clipboardDemo:"Clipboard",i18n:"I18n",externalLink:"Ligams extèrnes",users:"Utilizaires"},navbar:{logOut:"Desconnexion",dashboard:"Tablèu de bòrd",github:"Github",theme:"Tèma",size:"Talha totala"},login:{title:"Formulari de connexion",logIn:"Se connectar",username:"Nom d’’utilizaire",password:"Senhal",any:"qual que siá",thirdparty:"O se connectar amb",thirdpartyTips:"Pòt pas èsser simulat en local, doncas montatz vòstra pròpria simulacion ! ! !"},documentation:{documentation:"Documentacion",github:"Repertòri Github"},permission:{roles:"Vòstres ròtles",switchRoles:"Cambiar de ròtle",tips:"Dins qualques cases es pas de bon far d’utilizar v-permission, coma element d’onglet compausant, el-table-column o d’autres renduts dom asincròns que pòdon pas que foncionar amb un parametratge manual de v-if."},guide:{description:"La pagina de guida es utila pel monde que dintran dins lo projècte pel primièr còp. Podètz presentar en un mot las foncionalitats del projèctes. La demo es fondada sus ",button:"Mostrar la guida"},components:{documentation:"Documentacion",dropzoneTips:"Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.",stickyTips:"when the page is scrolled to the preset position will be sticky on the top.",backToTopTips1:"When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner",backToTopTips2:"You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally",imageUploadTips:"Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version."},table:{dynamicTips1:"Bandièra fixa, triada per òrdre de bandièra",dynamicTips2:"Bandièra pas fixa, triada per òrdre de clic",dragTips1:"L’’òrdre per defaut",dragTips2:"L’’òrdre aprèp lisar-depausar",title:"Títol",importance:"Imp",type:"Tipe",remark:"Remarca",search:"Recercar",add:"Ajustar",export:"Exportar",reviewer:"examinator",id:"ID",date:"Data",author:"Autor",readings:"Lecturas",status:"Estatuts",actions:"Accions",edit:"Modificar",publish:"Publicar",draft:"Ensag",delete:"Suprimir",cancel:"Anullar",confirm:"Confirmar"},errorLog:{tips:"Mercés de clicar l’’icòna del babau amont a man drecha",description:"Ara que lo sistèma de gestion es coma un spa, melhora l’experiéncia dels utilizaire mas aumenta tanben lo risc de problèmas sus la pagina, una pichona negligéncia pòt menar a un blocatge complèt de la pagina. Urosament Vue fornís de manièras per gerir las excepcions, trobar las errors o senhalar las excepcions.",documentation:"Presentacion del document"},excel:{export:"Exportar",selectedExport:"Exportar los elements seleccionats",placeholder:"Mercés de picar lo nom de fichièr (per defaut excel-list)"},zip:{export:"Exportar",placeholder:"Mercés de picar lo nom de fichièr (per defaut file)"},pdf:{tips:"Aquí utilizam window.print() per prepausar lo telecargament de pdf."},theme:{change:"Cambiar lo tèma",documentation:"Documentacion dels tèmas",tips:"Astúcia : es diferent del theme-pick de la barra de navigacion, i a dos metòdes de personalizacion, caduna amb un biais de far diferent. Referiscam a la documentacion per mai de detalhs."},tagsView:{refresh:"Actualizar",close:"Tampar",closeOthers:"Tampar los autres",closeAll:"Los tampar totes"}})},v=new o.a({locale:c.a.get("language")||"en",messages:f});t.a=v},mm8V:function(e,t,n){"use strict";n.d(t,"a",function(){return l}),n.d(t,"b",function(){return d}),n.d(t,"c",function(){return h}),n.d(t,"d",function(){return f}),n.d(t,"e",function(){return g}),n.d(t,"f",function(){return b}),n.d(t,"g",function(){return T}),n.d(t,"h",function(){return E}),n.d(t,"i",function(){return k}),n.d(t,"j",function(){return O}),n.d(t,"k",function(){return L}),n.d(t,"l",function(){return C});var a=n("o0o1"),r=n.n(a),s=n("yXPU"),o=n.n(s),i=n("t3Un"),c=n("X4fA"),u=n("9i3r");function l(e,t,n,a,r,s){return p.apply(this,arguments)}function p(){return(p=o()(r.a.mark(function e(t,n,a,s,o,c){var l;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return l=new FormData,""!==s.trim()&&l.set("filename",s),""!==a.trim()&&l.set("shortcode",a),l.set("file",n),e.next=6,Object(i.a)({baseURL:Object(u.a)(o),url:"/api/pleroma/emoji/packs/".concat(t,"/files"),method:"post",headers:D(c),data:l});case 6:return e.abrupt("return",e.sent);case 7:case"end":return e.stop()}},e)}))).apply(this,arguments)}function d(e,t,n){return"".concat(Object(u.a)(e),"/emoji/").concat(t,"/").concat(n)}function h(e,t,n){return m.apply(this,arguments)}function m(){return(m=o()(r.a.mark(function e(t,n,a){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/".concat(a),method:"post",headers:D(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function f(e,t,n,a){return v.apply(this,arguments)}function v(){return(v=o()(r.a.mark(function e(t,n,a,s){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(a),url:"/api/pleroma/emoji/packs/".concat(t,"/files"),method:"delete",headers:D(s),data:{shortcode:n}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function g(e,t,n){return w.apply(this,arguments)}function w(){return(w=o()(r.a.mark(function e(t,n,a){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/".concat(a),method:"delete",headers:D(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function b(e,t,n,a,r){return y.apply(this,arguments)}function y(){return(y=o()(r.a.mark(function e(t,n,a,s,o){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return""===s.trim()&&(s=null),e.next=3,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/download",method:"post",headers:D(o),data:{url:Object(u.a)(n),name:a,as:s},timeout:0});case 3:return e.abrupt("return",e.sent);case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function T(e,t){return x.apply(this,arguments)}function x(){return(x=o()(r.a.mark(function e(t,n){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/import",method:"get",headers:D(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function E(e){return S.apply(this,arguments)}function S(){return(S=o()(r.a.mark(function e(t){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/",method:"get"});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function k(e,t,n){return _.apply(this,arguments)}function _(){return(_=o()(r.a.mark(function e(t,n,a){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/remote?url=".concat(Object(u.a)(a)),method:"get",headers:D(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function O(e,t){return A.apply(this,arguments)}function A(){return(A=o()(r.a.mark(function e(t,n){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/admin/reload_emoji",method:"post",headers:D(n)});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function L(e,t,n,a){return I.apply(this,arguments)}function I(){return(I=o()(r.a.mark(function e(t,n,a,s){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(t),url:"/api/pleroma/emoji/packs/".concat(a),method:"patch",headers:D(n),data:{metadata:s},timeout:0});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}function C(e,t,n,a,r,s,o){return R.apply(this,arguments)}function R(){return(R=o()(r.a.mark(function e(t,n,a,s,o,c,l){return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Object(i.a)({baseURL:Object(u.a)(c),url:"/api/pleroma/emoji/packs/".concat(t,"/files"),method:"patch",headers:D(l),data:{shortcode:n,new_shortcode:a,new_filename:s,force:o}});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}))).apply(this,arguments)}var D=function(e){return e?{Authorization:"Bearer ".concat(Object(c.b)())}:{}}},nZHn:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-icon",use:"icon-icon-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},oUrx:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-404",use:"icon-404-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},qkZ8:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-edit",use:"icon-edit-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},qwAt:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-lock",use:"icon-lock-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},s7Vf:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});o.a.add(i);t.default=i},"sg+I":function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"180px"}},t3Un:function(e,t,n){"use strict";var a=n("vDqi"),r=n.n(a),s=n("XJYT"),o=r.a.create({timeout:6e4});o.interceptors.response.use(function(e){return e},function(e){var t;if(console.log("Error ".concat(e)),e.response){var n=e.response.data.error?e.response.data.error:e.response.data;t=e.response.headers["content-type"].includes("application/json")?"".concat(e.message," - ").concat(n):"".concat(e.message)}else t=e;return Object(s.Message)({message:t,type:"error",duration:5e3}),Promise.reject(e)}),t.a=o},vDVG:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-clipboard",use:"icon-clipboard-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},y7eQ:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-email",use:"icon-email-usage",viewBox:"0 0 128 96",content:''});o.a.add(i);t.default=i},yCkv:function(e,t,n){"use strict";n.r(t);var a=n("4BeY"),r=n.n(a),s=n("IaFt"),o=n.n(s),i=new r.a({id:"icon-chart",use:"icon-chart-usage",viewBox:"0 0 128 128",content:''});o.a.add(i);t.default=i},zT9a:function(e,t,n){"use strict";var a={name:"SvgIcon",props:{iconClass:{type:String,required:!0},className:{type:String,default:""}},computed:{iconName:function(){return"#icon-".concat(this.iconClass)},svgClass:function(){return this.className?"svg-icon "+this.className:"svg-icon"}}},r=(n("mDMp"),n("KHd+")),s=Object(r.a)(a,function(){var e=this.$createElement,t=this._self._c||e;return t("svg",this._g({class:this.svgClass,attrs:{"aria-hidden":"true"}},this.$listeners),[t("use",{attrs:{"xlink:href":this.iconName}})])},[],!1,null,"17178ffc",null);s.options.__file="index.vue";t.a=s.exports},zx4i:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"180px"}}},[["Vtdi","runtime","chunk-elementUI","chunk-libs"]]]); +//# sourceMappingURL=app.3fcec8f6.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/app.3fcec8f6.js.map b/priv/static/adminfe/static/js/app.3fcec8f6.js.map new file mode 100644 index 000000000..cc4ce87b3 --- /dev/null +++ b/priv/static/adminfe/static/js/app.3fcec8f6.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/icons/svg/pdf.svg","webpack:///./src/icons/svg/people.svg","webpack:///./src/icons/svg/eye-open.svg","webpack:///./src/components/element-ui/Hamburger/index.vue?8f92","webpack:///./src/icons/svg/exit-fullscreen.svg","webpack:///./src/icons/svg/nested.svg","webpack:///./src/icons/svg/theme.svg","webpack:///./src/icons/svg/form.svg","webpack:///./src/icons/svg/dashboard.svg","webpack:///./src/api/utils.js","webpack:///./src/icons/svg/shopping.svg","webpack:///./src/icons/svg/bug.svg","webpack:///./src/icons/svg/international.svg","webpack:///./src/icons/svg/qq.svg","webpack:///./src/icons/svg/link.svg","webpack:///./src/components/element-ui/ScrollPane/index.vue?8407","webpack:///./src/views/layout/components/TagsView.vue?6ab0","webpack:///./src/icons/svg/guide 2.svg","webpack:///./src/icons/svg/language.svg","webpack:///./src/icons/svg/password.svg","webpack:///./src/icons/svg/peoples.svg","webpack:///./src/icons/svg/money.svg","webpack:///./src/icons/svg/example.svg","webpack:///./src/icons/svg/list.svg","webpack:///./src/icons/svg/settings.svg","webpack:///./src/icons/svg/message.svg","webpack:///./src/icons/svg/table.svg","webpack:///./src/views/layout/Layout.vue?d1f6","webpack:///./src/icons/svg/eye.svg","webpack:///./src/icons/svg sync nonrecursive \\.svg$","webpack:///./src/icons/svg/component.svg","webpack:///./src/App.vue?9edb","webpack:///src/App.vue","webpack:///./src/App.vue","webpack:///./src/App.vue?1e50","webpack:///./src/api/app.js","webpack:///./src/store/modules/app.js","webpack:///./src/store/modules/errorLog.js","webpack:///./src/api/moderationLog.js","webpack:///./src/store/modules/moderationLog.js","webpack:///./src/api/invites.js","webpack:///./src/store/modules/invites.js","webpack:///./src/api/peers.js","webpack:///./src/store/modules/peers.js","webpack:///./src/components/element-ui/Hamburger/index.vue?1751","webpack:///src/components/element-ui/Hamburger/index.vue","webpack:///./src/components/element-ui/Hamburger/index.vue","webpack:///./src/components/element-ui/Hamburger/index.vue?78c1","webpack:///./src/views/layout/components/Navbar.vue?138b","webpack:///src/views/layout/components/Navbar.vue","webpack:///./src/views/layout/components/Navbar.vue","webpack:///./src/views/layout/components/Navbar.vue?b672","webpack:///./src/utils/i18n.js","webpack:///./src/utils/index.js","webpack:///src/views/layout/components/Sidebar/Item.vue","webpack:///./src/views/layout/components/Sidebar/Item.vue?425b","webpack:///./src/views/layout/components/Sidebar/Item.vue","webpack:///./src/views/layout/components/Sidebar/Link.vue?a99f","webpack:///src/views/layout/components/Sidebar/Link.vue","webpack:///./src/views/layout/components/Sidebar/Link.vue","webpack:///./src/views/layout/components/Sidebar/Link.vue?d88c","webpack:///./src/views/layout/components/Sidebar/SidebarItem.vue?f0b2","webpack:///src/views/layout/components/Sidebar/SidebarItem.vue","webpack:///./src/views/layout/components/Sidebar/FixiOSBug.js","webpack:///./src/views/layout/components/Sidebar/SidebarItem.vue","webpack:///./src/views/layout/components/Sidebar/SidebarItem.vue?4829","webpack:///./src/views/layout/components/Sidebar/index.vue?3b50","webpack:///src/views/layout/components/Sidebar/index.vue","webpack:///./src/views/layout/components/Sidebar/index.vue","webpack:///./src/views/layout/components/Sidebar/index.vue?29d8","webpack:///./src/components/element-ui/ScrollPane/index.vue?a39e","webpack:///src/components/element-ui/ScrollPane/index.vue","webpack:///./src/components/element-ui/ScrollPane/index.vue","webpack:///./src/components/element-ui/ScrollPane/index.vue?7344","webpack:///./src/views/layout/components/TagsView.vue?f016","webpack:///src/views/layout/components/TagsView.vue","webpack:///./src/views/layout/components/TagsView.vue","webpack:///./src/views/layout/components/TagsView.vue?d863","webpack:///./src/views/layout/components/AppMain.vue?4460","webpack:///src/views/layout/components/AppMain.vue","webpack:///./src/views/layout/components/AppMain.vue","webpack:///./src/views/layout/components/AppMain.vue?367b","webpack:///./src/views/layout/mixin/ResizeHandler.js","webpack:///./src/views/layout/Layout.vue?de6d","webpack:///src/views/layout/Layout.vue","webpack:///./src/views/layout/Layout.vue","webpack:///./src/views/layout/Layout.vue?9516","webpack:///./src/router/index.js","webpack:///./src/store/modules/permission.js","webpack:///./src/api/relays.js","webpack:///./src/store/modules/relays.js","webpack:///./src/api/reports.js","webpack:///./src/store/modules/reports.js","webpack:///./src/api/settings.js","webpack:///./src/store/modules/settings.js","webpack:///./src/api/status.js","webpack:///./src/store/modules/status.js","webpack:///./src/store/modules/tagsView.js","webpack:///./src/api/login.js","webpack:///./src/api/nodeInfo.js","webpack:///./src/store/modules/user.js","webpack:///./src/api/users.js","webpack:///./src/store/modules/userProfile.js","webpack:///./src/store/modules/users.js","webpack:///./src/store/getters.js","webpack:///./src/store/modules/emojiPacks.js","webpack:///./src/store/index.js","webpack:///./src/icons/index.js","webpack:///./src/errorLog.js","webpack:///./src/permission.js","webpack:///./src/filters/index.js","webpack:///./src/main.js","webpack:///./src/utils/auth.js","webpack:///./src/views/layout/components/TagsView.vue?da45","webpack:///./src/views/layout/components/AppMain.vue?2c3a","webpack:///./src/icons/svg/excel.svg","webpack:///./src/icons/svg/guide.svg","webpack:///./src/icons/svg/star.svg","webpack:///./src/views/layout/components/Navbar.vue?a40e","webpack:///./src/icons/svg/wechat.svg","webpack:///./src/store/modules/normalizers.js","webpack:///./src/icons/svg/size.svg","webpack:///./src/icons/svg/zip.svg","webpack:///./src/icons/svg/tab.svg","webpack:///./src/icons/svg/search.svg","webpack:///./src/icons/svg/tree.svg","webpack:///./src/icons/svg/documentation.svg","webpack:///./src/icons/svg/drag.svg","webpack:///./src/components/element-ui/SvgIcon/index.vue?928c","webpack:///./src/icons/svg/fullscreen.svg","webpack:///./src/lang/index.js","webpack:///./src/lang/en.js","webpack:///./src/lang/zh.js","webpack:///./src/lang/es.js","webpack:///./src/lang/oc.js","webpack:///./src/api/emojiPacks.js","webpack:///./src/icons/svg/icon.svg","webpack:///./src/icons/svg/404.svg","webpack:///./src/icons/svg/edit.svg","webpack:///./src/icons/svg/lock.svg","webpack:///./src/icons/svg/user.svg","webpack:///./src/styles/index.scss","webpack:///./src/utils/request.js","webpack:///./src/icons/svg/clipboard.svg","webpack:///./src/icons/svg/email.svg","webpack:///./src/icons/svg/chart.svg","webpack:///./src/components/element-ui/SvgIcon/index.vue?8767","webpack:///./src/components/element-ui/SvgIcon/index.vue?c01f","webpack:///src/components/element-ui/SvgIcon/index.vue","webpack:///./src/components/element-ui/SvgIcon/index.vue","webpack:///./src/styles/variables.scss"],"names":["__webpack_require__","r","__webpack_exports__","svg_baker_runtime_browser_symbol__WEBPACK_IMPORTED_MODULE_0__","svg_baker_runtime_browser_symbol__WEBPACK_IMPORTED_MODULE_0___default","n","svg_sprite_loader_runtime_browser_sprite_build__WEBPACK_IMPORTED_MODULE_1__","svg_sprite_loader_runtime_browser_sprite_build__WEBPACK_IMPORTED_MODULE_1___default","symbol","a","id","use","viewBox","content","add","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_69c6c5c4_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","d","baseName","instanceName","arguments","length","undefined","match","startsWith","isLocalhost","concat","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_591d6778_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_TagsView_vue_vue_type_style_index_0_id_e1cdb714_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Layout_vue_vue_type_style_index_0_id_767d264f_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","map","./404.svg","./bug.svg","./chart.svg","./clipboard.svg","./component.svg","./dashboard.svg","./documentation.svg","./drag.svg","./edit.svg","./email.svg","./example.svg","./excel.svg","./exit-fullscreen.svg","./eye-open.svg","./eye.svg","./form.svg","./fullscreen.svg","./guide 2.svg","./guide.svg","./icon.svg","./international.svg","./language.svg","./link.svg","./list.svg","./lock.svg","./message.svg","./money.svg","./nested.svg","./password.svg","./pdf.svg","./people.svg","./peoples.svg","./qq.svg","./search.svg","./settings.svg","./shopping.svg","./size.svg","./star.svg","./tab.svg","./table.svg","./theme.svg","./tree.svg","./user.svg","./wechat.svg","./zip.svg","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","Object","resolve","module","exports","src_Appvue_type_script_lang_js_","name","component","componentNormalizer","_h","this","$createElement","_c","_self","attrs","options","__file","App","needReboot","_x","_x2","_needReboot","apply","_callee","authHost","token","regenerator_default","wrap","_context","prev","next","request","baseURL","url","method","headers","authHeaders","abrupt","sent","stop","restartApp","_x3","_x4","_restartApp","_callee2","_context2","Authorization","getToken","app","state","sidebar","opened","Cookies","get","withoutAnimation","device","language","size","invitesEnabled","mutations","TOGGLE_SIDEBAR","set","CLOSE_SIDEBAR","TOGGLE_DEVICE","SET_INVITES_ENABLED","SET_LANGUAGE","TOGGLE_REBOOT","SET_SIZE","actions","closeSideBar","_ref","_ref2","commit","NeedReboot","_NeedReboot","asyncToGenerator_default","mark","_ref3","getters","response","data","RestartApplication","_RestartApplication","_ref4","SetInvitesEnabled","_ref5","setLanguage","_ref6","setSize","_ref7","toggleDevice","_ref8","toggleSideBar","_ref9","errorLog","logs","ADD_ERROR_LOG","log","push","addErrorLog","fetchLog","_fetchLog","params","page","normalizedParams","_args","URLSearchParams","_","omitBy","objectSpread_default","isUndefined","toString","fetchAdmins","_x5","_fetchAdmins","fetchModerators","_x6","_x7","_fetchModerators","_callee3","_context3","moderationLog","fetchedLog","logItemsCount","admins","moderators","logLoading","adminsLoading","SET_LOG_LOADING","status","SET_ADMINS_LOADING","SET_MODERATION_LOG","SET_MODERATION_LOG_COUNT","count","SET_ADMINS","SET_MODERATORS","FetchModerationLog","_FetchModerationLog","opts","items","total","FetchAdmins","_FetchAdmins","adminsResponse","moderatorsResponse","generateInviteToken","_generateInviteToken","max_use","expires_at","inviteViaEmail","_x8","_inviteViaEmail","email","listInviteTokens","_x9","_x10","_listInviteTokens","revokeToken","_x11","_x12","_x13","_revokeToken","_callee4","tokenToRevoke","_context4","invites","inviteTokens","loading","newToken","SET_LOADING","SET_NEW_TOKEN","SET_TOKENS","tokens","FetchInviteTokens","_FetchInviteTokens","reverse","GenerateInviteToken","_GenerateInviteToken","dispatch","maxUse","expiresAt","t0","InviteUserViaEmail","_InviteUserViaEmail","Message","message","i18n","t","type","duration","RemoveNewToken","RevokeToken","_RevokeToken","fetchPeers","_fetchPeers","peers","fetchedPeers","SET_PEERS","FetchPeers","_FetchPeers","toConsumableArray_default","sort","element_ui_Hamburgervue_type_script_lang_js_","props","isActive","Boolean","default","toggleClick","Function","Hamburger_component","staticStyle","padding","on","click","staticClass","class","is-active","xmlns","width","height","components_Navbarvue_type_script_lang_js_","components","Hamburger","computed","vuex_esm","methods","$store","logout","then","location","reload","Navbar_component","_vm","toggle-click","_v","trigger","src","avatar","slot","display","_s","$t","Navbar","generateTitle","title","$te","parseTime","time","cFormat","date","format","typeof_default","test","parseInt","Date","formatObj","y","getFullYear","m","getMonth","getDate","h","getHours","i","getMinutes","s","getSeconds","getDay","replace","result","key","value","formatTime","option","diff","now","Math","ceil","isExternal","path","Sidebar_Itemvue_type_script_lang_js_","functional","icon","String","render","context","_context$props","vnodes","icon-class","Item_component","Item_render","Item_staticRenderFns","Item","Sidebar_Linkvue_type_script_lang_js_","to","required","linkProps","is","href","target","rel","Link_component","_b","_t","Sidebar_SidebarItemvue_type_script_lang_js_","AppLink","mixins","mounted","fixBugIniOS","_this","$subMenu","$refs","subMenu","handleMouseleave","item","isNest","basePath","onlyOneChild","hasOneShowingChild","children","parent","showingChildren","filter","hidden","noShowingChildren","resolvePath","routePath","isExternalLink","path_browserify_default","SidebarItem_component","alwaysShow","ref","index","meta","_e","_l","child","is-nest","base-path","submenu-title-noDropdown","SidebarItem","components_Sidebarvue_type_script_lang_js_","variables","variables_default","isCollapse","Sidebar_component","wrap-class","default-active","$route","collapse","background-color","menuBg","text-color","menuText","active-text-color","menuActiveText","mode","route","Sidebar","element_ui_ScrollPanevue_type_script_lang_js_","left","handleScroll","eventDelta","wheelDelta","deltaY","$scrollWrapper","scrollContainer","scrollLeft","moveToTarget","currentTag","$containerWidth","$el","offsetWidth","tagList","$parent","tag","firstTag","lastTag","scrollWidth","currentIndex","findIndex","prevTag","nextTag","afterNextTagOffsetLeft","offsetLeft","beforePrevTagOffsetLeft","ScrollPane_component","vertical","nativeOn","wheel","$event","preventDefault","components_TagsViewvue_type_script_lang_js_","ScrollPane","visible","top","selectedTag","affixTags","visitedViews","tagsView","routers","permission","watch","addTags","moveToCurrentTag","document","body","addEventListener","closeMenu","removeEventListener","initTags","filterAffixTags","routes","tags","forEach","affix","tempTags","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","done","err","return","_this2","$nextTick","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","scrollPane","fullPath","refreshSelectedTag","view","_this3","$router","closeSelectedTag","_this4","toLastView","closeOthersTags","_this5","closeAllTags","_this6","some","latestView","slice","openMenu","getBoundingClientRect","maxLeft","clientX","clientY","TagsView_component","refInFor","query","mouseup","button","contextmenu","stopPropagation","directives","rawName","expression","style","TagsView","components_AppMainvue_type_script_lang_js_","cachedViews","AppMain_component","include","AppMain","layout_Layoutvue_type_script_lang_js_","store","beforeMount","window","resizeHandler","isMobile","isTablet","rect","classObj","hideSidebar","openSidebar","mobile","handleClickOutside","Layout_component","Layout","Vue","Router","disabledFeatures","process","settingsDisabled","includes","settings","Promise","all","bind","noCache","statusesDisabled","statuses","reportsDisabled","reports","invitesDisabled","emojiPacksDisabled","emojiPacks","moderationLogDisabled","constantRouterMap","redirect","router","scrollBehavior","asyncRouterMap","addRouters","SET_ROUTERS","GenerateRoutes","accessedRouters","roles","filterAsyncRouter","res","tmp","role","hasPermission","fetchRelays","_fetchRelays","addRelay","_addRelay","relay","relay_url","deleteRelay","_deleteRelay","relays","fetchedRelays","SET_RELAYS","ADD_RELAY","DELETE_RELAY","fetchedRelay","FetchRelays","_FetchRelays","AddRelay","_AddRelay","finish","DeleteRelay","_DeleteRelay","changeState","_changeState","fetchReports","_fetchReports","pageSize","reportID","noteID","fetchedReports","totalReportsCount","currentPage","stateFilter","SET_LAST_REPORT_ID","idOfLastReport","SET_PAGE","SET_REPORTS","SET_REPORTS_COUNT","SET_REPORTS_FILTER","ChangeReportState","_ChangeReportState","reportsData","updatedReports","report","ClearFetchedReports","FetchReports","_FetchReports","SetFilter","CreateReportNote","rootState","_createNote","createNote","optimisticNote","user","nickname","created_at","getTime","notes","DeleteReportNote","_ref10","_x14","_x15","_x16","_deleteNote","deleteNote","note","fetchDescription","_fetchDescription","fetchSettings","_fetchSettings","updateSettings","_updateSettings","configs","removeSettings","_removeSettings","activeTab","configDisabled","db","description","searchData","updatedSettings","CLEAR_UPDATED_SETTINGS","REMOVE_SETTING_FROM_UPDATED","group","subkeys","_state$updatedSetting","objectWithoutProperties_default","_toPropertyKey","SET_ACTIVE_TAB","tab","SET_DESCRIPTION","SET_SEARCH","searchObject","SET_SETTINGS","newSettings","reduce","acc","parsedValue","valueHasTuples","parseNonTuples","parseTuples","defineProperty_default","newDbSettings","TOGGLE_TABS","UPDATE_SETTINGS","input","updatedSetting","UPDATE_STATE","updatedState","FetchSettings","_FetchSettings","_ref12","formSearchObject","RemoveSetting","_RemoveSetting","_ref13","_configs$","need_reboot","SetActiveTab","_ref14","SubmitChanges","_SubmitChanges","_ref15","updatedData","checkPartialUpdate","wrapUpdatedSettings","UpdateSettings","_ref16","_ref17","UpdateState","_UpdateState","_ref18","_ref19","deletedKey","el","delete","changeStatusScope","_changeStatusScope","sensitive","visibility","deleteStatus","_deleteStatus","fetchStatus","_fetchStatus","fetchStatuses","_fetchStatuses","godmode","localOnly","fetchStatusesCount","_fetchStatusesCount","_callee5","instance","_context5","fetchStatusesByInstance","_fetchStatusesByInstance","_callee6","_context6","fetchedStatus","fetchedStatuses","statusAuthor","statusesByInstance","selectedInstance","showLocal","showPrivate","buttonLoading","allLoaded","statusVisibility","CHANGE_GODMODE_CHECKBOX_VALUE","CHANGE_LOCAL_CHECKBOX_VALUE","CHANGE_PAGE","CHANGE_SELECTED_INSTANCE","SET_STATUS","SET_STATUSES_BY_INSTANCE","PUSH_STATUSES","SET_ALL_LOADED","SET_BUTTON_LOADING","SET_STATUS_VISIBILITY","SET_STATUS_AUTHOR","ChangeStatusScope","_ChangeStatusScope","statusId","isSensitive","reportCurrentPage","userId","ClearState","DeleteStatus","_DeleteStatus","FetchStatus","_FetchStatus","account","FetchStatusAfterUserModeration","FetchStatusesCount","_FetchStatusesCount","status_visibility","FetchStatusesByInstance","_FetchStatusesByInstance","FetchStatusesPageByInstance","_FetchStatusesPageByInstance","_ref11","HandleGodmodeCheckboxChange","HandleLocalCheckboxChange","HandleFilterChange","HandlePageChange","SetStatus","ADD_VISITED_VIEW","v","assign","ADD_CACHED_VIEW","DEL_VISITED_VIEW","entries","_step$value","slicedToArray_default","splice","DEL_CACHED_VIEW","indexOf","DEL_OTHERS_VISITED_VIEWS","DEL_OTHERS_CACHED_VIEWS","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","DEL_ALL_VISITED_VIEWS","DEL_ALL_CACHED_VIEWS","UPDATE_VISITED_VIEW","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","addView","addVisitedView","addCachedView","delView","delVisitedView","delCachedView","delOthersViews","delOthersVisitedViews","delOthersCachedViews","delAllViews","delAllVisitedViews","delAllCachedViews","updateVisitedView","loginByUsername","_loginByUsername","username","password","appsRequest","client_name","random","redirect_uris","origin","scopes","client_id","client_secret","grant_type","getUserInfo","getNodeInfo","_getNodeInfo","getAuthHost","introduction","setting","articlePlatform","nodeInfo","SET_CODE","SET_TOKEN","SET_INTRODUCTION","SET_SETTING","SET_NAME","SET_AVATAR","SET_ROLES","SET_ID","SET_AUTH_HOST","SET_NODE_INFO","LoginByUsername","reject","access_token","setToken","setAuthHost","catch","error","GetNodeInfo","_GetNodeInfo","metadata","GetUserInfo","pleroma","is_admin","LogOut","removeToken","removeAuthHost","FedLogOut","LoginByPleromaFE","_LoginByPleromaFE","host","activateUsers","_activateUsers","nicknames","addRight","_addRight","right","createNewAccount","_createNewAccount","users","deactivateUsers","_deactivateUsers","deleteRight","_x17","_x18","_x19","_deleteRight","deleteUsers","_x20","_x21","_x22","_deleteUsers","fetchUser","_x23","_x24","_x25","_fetchUser","_callee7","_context7","fetchUserCredentials","_x26","_x27","_x28","_fetchUserCredentials","_callee8","_context8","updateUserCredentials","_x29","_x30","_x31","_x32","_updateUserCredentials","_callee9","credentials","_context9","fetchUsers","_x33","_x34","_x35","_fetchUsers","_callee10","filters","_args10","_context10","getPasswordResetToken","_x36","_x37","_x38","_getPasswordResetToken","_callee11","_context11","forcePasswordReset","_x39","_x40","_x41","_forcePasswordReset","_callee12","_context12","searchUsers","_x42","_x43","_x44","_x45","_searchUsers","_callee13","_args13","_context13","tagUser","_x46","_x47","_x48","_x49","_tagUser","_callee14","_context14","untagUser","_x50","_x51","_x52","_x53","_untagUser","_callee15","_context15","_callee16","_context16","confirmUserEmail","_x58","_x59","_x60","_confirmUserEmail","_callee17","_context17","resendConfirmationEmail","_x61","_x62","_x63","_resendConfirmationEmail","_callee18","_context18","userProfile","statusesLoading","userCredentials","userProfileLoading","SET_STATUSES","SET_STATUSES_LOADING","SET_USER","SET_USER_PROFILE_LOADING","SET_USER_CREDENTIALS","FetchUserProfile","_FetchUserProfile","userResponse","FetchUserStatuses","_x54","_x55","_x56","_x57","_fetchUserStatuses","fetchUserStatuses","FetchUserCredentials","_FetchUserCredentials","SetStatuses","UpdateUserCredentials","_UpdateUserCredentials","fetchedUsers","searchQuery","totalUsersCount","local","external","active","deactivated","passwordResetToken","link","SET_USERS","SWAP_USERS","usersWithoutSwapped","u","updatedUsers","b","localeCompare","SET_COUNT","SET_PAGE_SIZE","SET_PASSWORD_RESET_TOKEN","SET_SEARCH_QUERY","SET_USERS_FILTERS","ActivateUsers","_ActivateUsers","_userId","callApiFn","ApplyChanges","_ApplyChanges","AddRight","_AddRight","_statusId","AddTag","_AddTag","ClearUsersState","ClearFilters","_ClearFilters","CreateNewAccount","_CreateNewAccount","DeactivateUsers","_DeactivateUsers","ConfirmUsersEmail","_ConfirmUsersEmail","_ref20","_ref21","confirmation_pending","_ref22","ResendConfirmationEmail","_ResendConfirmationEmail","_ref23","usersNicknames","DeleteRight","_DeleteRight","_ref24","_ref25","_ref26","DeleteUsers","_DeleteUsers","_ref27","_ref28","deletedUsersIds","deletedUser","FetchUsers","_FetchUsers","_ref29","_ref30","join","loadUsers","GetPasswordResetToken","_GetPasswordResetToken","_callee19","_ref31","_ref32","_context19","RemovePasswordToken","_ref33","RemoveTag","_RemoveTag","_callee21","_ref34","_ref35","_context21","userTag","_ref36","_callee20","_context20","RequirePasswordReset","_RequirePasswordReset","_callee22","_ref37","_context22","SearchUsers","_SearchUsers","_callee23","_ref38","_ref39","_context23","SuccessMessage","success","ToggleUsersFilter","_ToggleUsersFilter","_callee24","_ref40","defaultFilters","currentFilters","_context24","_ref41","page_size","permission_routers","errorLogs","packs","activeCollapseItems","localPacks","remoteInstance","remotePacks","SET_ACTIVE_COLLAPSE_ITEMS","SET_LOCAL_PACKS","SET_REMOTE_INSTANCE","SET_REMOTE_PACKS","UPDATE_LOCAL_PACK_VAL","UPDATE_LOCAL_PACK_PACK","pack","UPDATE_LOCAL_PACK_FILES","files","AddNewEmojiFile","_AddNewEmojiFile","packName","file","shortcode","filename","addNewEmojiFile","DeleteEmojiFile","_DeleteEmojiFile","deleteEmojiFile","CreatePack","_CreatePack","createPack","DeletePack","_DeletePack","deletePack","DownloadFrom","_DownloadFrom","instanceAddress","as","downloadFrom","ImportFromFS","_ImportFromFS","importFromFS","ReloadEmoji","_ReloadEmoji","reloadEmoji","SavePackMetadata","_SavePackMetadata","savePackMetadata","SetActiveCollapseItems","activeItems","SetLocalEmojiPacks","_SetLocalEmojiPacks","listPacks","SetRemoteEmojiPacks","_SetRemoteEmojiPacks","listRemotePacks","SetRemoteInstance","UpdateEmojiFile","_UpdateEmojiFile","newShortcode","newFilename","force","updateEmojiFile","UpdateLocalPackVal","_UpdateLocalPackVal","args","Vuex","Store","modules","SvgIcon","requireContext","requireAll","require","config","errorHandler","vm","info","nextTick","console","NProgress","configure","showSpinner","whiteList","pluralize","label","timeAgo","between","Number","numberFormatter","num","digits","si","toFixed","toThousandFilter","beforeEach","from","start","addRoutes","dangerouslyUseHTMLString","permissionRoles","noGoBack","afterEach","Element","productionTip","js_cookie__WEBPACK_IMPORTED_MODULE_0__","js_cookie__WEBPACK_IMPORTED_MODULE_0___default","TokenKey","AuthHostKey","remove","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_TagsView_vue_vue_type_style_index_1_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_AppMain_vue_vue_type_style_index_0_id_f852c4f2_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Navbar_vue_vue_type_style_index_0_id_28de7ff2_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","getBooleanValue","partialUpdate","updated","settingName","find","element","getCurrentValue","_path","_babel_runtime_helpers_toArray__WEBPACK_IMPORTED_MODULE_5___default","firstSettingName","restKeys","firstSegment","secondSegment","_keys","rest","_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_1___default","tuple","tuples","accum","Array","isArray","mascot","_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default","_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_2___default","_babel_runtime_helpers_objectSpread__WEBPACK_IMPORTED_MODULE_3___default","regex","parseProxyUrl","parseObject","object","_value$tuple","_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_4___default","socks5","port","_value$split","split","_value$split2","processNested","valueForState","valueForUpdatedSettings","parentKey","parents","_parents","_parents$","otherParents","updatedValueForState","valueExists","updatedValueForUpdatedSettings","_path2","_keys2","valueIsArrayOfNonObjects","every","currentState","_value","updatedArray","getValueWithoutKey","wrapValues","_settings$setting","mapValue","mapCurrentState","values","ip","searchArray","compact","toLowerCase","resultObject","groupKey","groupLabel","search","updatedAcc","parseNestedSettings","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_7_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_7_2_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_17178ffc_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__","VueI18n","messages","en","dashboard","documentation","guide","pagePermission","directivePermission","icons","componentIndex","markdown","jsonEditor","dndList","splitPane","avatarUpload","dropzone","sticky","countTo","componentMixin","backToTop","dragDialog","dragSelect","dragKanban","charts","keyboardChart","lineChart","mixChart","example","nested","menu1","menu1-1","menu1-2","menu1-2-1","menu1-2-2","menu1-3","menu2","Table","dynamicTable","dragTable","inlineEditTable","complexTable","treeTable","customTreeTable","form","createArticle","editArticle","articleList","errorPages","page401","page404","excel","exportExcel","selectExcel","uploadExcel","zip","pdf","exportZip","theme","clipboardDemo","externalLink","emoji-packs","navbar","logOut","github","login","logIn","logInViaPleromaFE","omitHostname","errorMessage","any","thirdparty","pleromaFELoginFailed","pleromaFELoginSucceed","switchRoles","tips","dropzoneTips","stickyTips","backToTopTips1","backToTopTips2","imageUploadTips","table","dynamicTips1","dynamicTips2","dragTips1","dragTips2","importance","remark","export","reviewer","author","readings","edit","publish","draft","cancel","confirm","selectedExport","placeholder","change","refresh","close","closeOthers","closeAll","localUsersOnly","unconfirmed","activate","deactivate","admin","moderator","moderation","revokeAdmin","grantAdmin","revokeModerator","grantModerator","activateAccount","activateAccounts","deactivateAccount","deactivateAccounts","deleteAccount","deleteAccounts","forceNsfw","stripMedia","forceUnlisted","sandbox","disableRemoteSubscription","disableRemoteSubscriptionForMultiple","disableAnySubscription","disableAnySubscriptionForMultiple","requirePasswordReset","selectUsers","moderateUser","moderateUsers","createAccount","grantRightConfirmation","revokeRightConfirmation","activateMultipleUsersConfirmation","deactivateMultipleUsersConfirmation","deleteMultipleUsersConfirmation","addTagForMultipleUsersConfirmation","removeTagFromMultipleUsersConfirmation","requirePasswordResetConfirmation","confirmAccountsConfirmation","resendEmailConfirmation","mailerMustBeEnabled","ok","completed","canceled","create","submitFormError","emptyEmailError","invalidEmailError","emptyPasswordError","emptyNicknameError","invalidNicknameError","passwordResetTokenCreated","accountCreated","unconfirmedEmail","confirmAccount","confirmAccounts","resendConfirmation","invalidAccount","invalidNickname","passwordResetTokenGenerated","linkToResetPassword","instanceFilter","loadMore","noInstances","onlyLocalStatuses","showPrivateStatuses","direct","private","public","unlisted","openStatusInInstance","accountType","recentStatuses","noStatuses","openAccountInInstance","securitySettings","passwordChangeWarning1","passwordChangeWarning2","passwordLengthNotice","inputNewEmail","inputNewPassword","passwordUpdated","emailUpdated","submit","usersFilter","inputPlaceholder","byAccountType","byStatus","reply","showNotes","newNote","confirmMsg","deleteCompleted","deleteCanceled","noNotes","changeAllReports","changeScope","reopen","resolveAll","reopenAll","addSensitive","removeSensitive","reportOn","reportsOn","actor","actors","reportedStatus","statusDeleted","leaveNote","postNote","notFound","reportsFilter","open","closed","resolved","upload","mailer","logger","activityPub","auth","autoLinker","captcha","frontend","http","mrf","mediaProxy","gopher","jobQueue","webPush","esshd","rateLimiters","other","follow","followRelay","instanceUrl","removeFromDB","successfullyDownloaded","successfullyImported","nowNewPacksToImport","successfullyUpdated","metadatLowerCase","successfullyRemoved","seeDocs","assets","emoji","markup","corsPlug","instanceReboot","restartSuccess","removeSettingConfirmation","createInviteToken","pickDate","tokenCreated","inviteLink","uses","used","revoke","inviteUserViaEmail","sendRegistration","emailSent","inviteViaEmailAlert","reloaded","refreshed","importEmojiTooltip","importPacks","refreshLocalPacks","createLocalPack","remoteInstanceAddress","refreshRemote","sharePack","homepage","license","fallbackSrc","fallbackSrcSha","saveMetadata","downloadPack","downloadPackArchive","addNewEmoji","manageEmoji","thisWillDownload","downloadToCurrentInstance","canBeChanged","willBeUsable","downloadAsOptional","downloadSharedPack","downloadSharedPackMobile","optional","uploadFile","clickToUpload","customFilename","customFilenameDesc","localPack","leaveEmptyShortcode","leaveEmptyFilename","update","selectLocalPack","specifyShortcode","specifyFilename","copy","copyToLocalPack","elementEnLocale","zh","thirdpartyTips","elementZhLocale","es","elementEsLocale","oc","locale","_addNewEmojiFile","_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default","FormData","trim","addressOfEmojiInPack","_createPack","_deleteEmojiFile","_deletePack","_downloadFrom","timeout","_importFromFS","_listPacks","_listRemotePacks","_reloadEmoji","_savePackMetadata","_updateEmojiFile","new_shortcode","new_filename","subMenuActiveText","menuHover","subMenuBg","subMenuHover","sideBarWidth","axios__WEBPACK_IMPORTED_MODULE_0__","axios__WEBPACK_IMPORTED_MODULE_0___default","element_ui__WEBPACK_IMPORTED_MODULE_1__","service","axios","interceptors","edata","element_ui_SvgIconvue_type_script_lang_js_","iconClass","className","iconName","svgClass","_g","aria-hidden","$listeners","xlink:href"],"mappings":"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","file":"static/js/app.3fcec8f6.js","sourcesContent":["import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-pdf\",\n \"use\": \"icon-pdf-usage\",\n \"viewBox\": \"0 0 1024 1024\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-people\",\n \"use\": \"icon-people-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-eye-open\",\n \"use\": \"icon-eye-open-usage\",\n \"viewBox\": \"0 0 1024 1024\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=69c6c5c4&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=69c6c5c4&scoped=true&lang=css&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-exit-fullscreen\",\n \"use\": \"icon-exit-fullscreen-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-nested\",\n \"use\": \"icon-nested-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-theme\",\n \"use\": \"icon-theme-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-form\",\n \"use\": \"icon-form-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-dashboard\",\n \"use\": \"icon-dashboard-usage\",\n \"viewBox\": \"0 0 128 100\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","const isLocalhost = (instanceName) =>\n instanceName.startsWith('localhost:') || instanceName.startsWith('127.0.0.1:')\n\nexport const baseName = (instanceName = 'localhost') => {\n if (instanceName.match(/https?:\\/\\//)) {\n return instanceName\n } else {\n return isLocalhost(instanceName) ? `http://${instanceName}` : `https://${instanceName}`\n }\n}\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-shopping\",\n \"use\": \"icon-shopping-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-bug\",\n \"use\": \"icon-bug-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-international\",\n \"use\": \"icon-international-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-qq\",\n \"use\": \"icon-qq-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-link\",\n \"use\": \"icon-link-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=591d6778&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=591d6778&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=0&id=e1cdb714&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=0&id=e1cdb714&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-guide 2\",\n \"use\": \"icon-guide 2-usage\",\n \"viewBox\": \"0 0 1000 1000\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-language\",\n \"use\": \"icon-language-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-password\",\n \"use\": \"icon-password-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-peoples\",\n \"use\": \"icon-peoples-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-money\",\n \"use\": \"icon-money-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-example\",\n \"use\": \"icon-example-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-list\",\n \"use\": \"icon-list-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-settings\",\n \"use\": \"icon-settings-usage\",\n \"viewBox\": \"0 0 490.2 490.2\",\n \"content\": \"\\r\\n\\r\\n\\t\\r\\n\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\t\\r\\n\\t\\t\\r\\n\\t\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-message\",\n \"use\": \"icon-message-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-table\",\n \"use\": \"icon-table-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=style&index=0&id=767d264f&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=style&index=0&id=767d264f&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-eye\",\n \"use\": \"icon-eye-usage\",\n \"viewBox\": \"0 0 128 64\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","var map = {\n\t\"./404.svg\": \"oUrx\",\n\t\"./bug.svg\": \"F3lI\",\n\t\"./chart.svg\": \"yCkv\",\n\t\"./clipboard.svg\": \"vDVG\",\n\t\"./component.svg\": \"VtY+\",\n\t\"./dashboard.svg\": \"94Jb\",\n\t\"./documentation.svg\": \"kPu2\",\n\t\"./drag.svg\": \"m7++\",\n\t\"./edit.svg\": \"qkZ8\",\n\t\"./email.svg\": \"y7eQ\",\n\t\"./example.svg\": \"MMMJ\",\n\t\"./excel.svg\": \"ZZmv\",\n\t\"./exit-fullscreen.svg\": \"28eg\",\n\t\"./eye-open.svg\": \"1+ww\",\n\t\"./eye.svg\": \"TfVu\",\n\t\"./form.svg\": \"6xvN\",\n\t\"./fullscreen.svg\": \"mSHS\",\n\t\"./guide 2.svg\": \"ICep\",\n\t\"./guide.svg\": \"ZoO1\",\n\t\"./icon.svg\": \"nZHn\",\n\t\"./international.svg\": \"F9+T\",\n\t\"./language.svg\": \"JYDz\",\n\t\"./link.svg\": \"GPBF\",\n\t\"./list.svg\": \"MokB\",\n\t\"./lock.svg\": \"qwAt\",\n\t\"./message.svg\": \"R/8a\",\n\t\"./money.svg\": \"MEYL\",\n\t\"./nested.svg\": \"3PhE\",\n\t\"./password.svg\": \"Kj24\",\n\t\"./pdf.svg\": \"+aF5\",\n\t\"./people.svg\": \"0Fbn\",\n\t\"./peoples.svg\": \"LxGF\",\n\t\"./qq.svg\": \"FDDl\",\n\t\"./search.svg\": \"jo2x\",\n\t\"./settings.svg\": \"P8iQ\",\n\t\"./shopping.svg\": \"EqXK\",\n\t\"./size.svg\": \"hkRB\",\n\t\"./star.svg\": \"cIpu\",\n\t\"./tab.svg\": \"j7e1\",\n\t\"./table.svg\": \"R/Hx\",\n\t\"./theme.svg\": \"5TQQ\",\n\t\"./tree.svg\": \"k80C\",\n\t\"./user.svg\": \"s7Vf\",\n\t\"./wechat.svg\": \"gNoN\",\n\t\"./zip.svg\": \"iqZD\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"Uf/o\";","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-component\",\n \"use\": \"icon-component-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../node_modules/babel-loader/lib/index.js?cacheDirectory!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/babel-loader/lib/index.js?cacheDirectory!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=6b42edcf&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"App.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('router-view')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function needReboot(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/need_reboot`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function restartApp(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/restart`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import Cookies from 'js-cookie'\nimport { needReboot, restartApp } from '@/api/app'\n\nconst app = {\n state: {\n sidebar: {\n opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,\n withoutAnimation: false\n },\n device: 'desktop',\n language: Cookies.get('language') || 'en',\n needReboot: false,\n size: Cookies.get('size') || 'medium',\n invitesEnabled: false\n },\n mutations: {\n TOGGLE_SIDEBAR: state => {\n state.sidebar.opened = !state.sidebar.opened\n state.sidebar.withoutAnimation = false\n if (state.sidebar.opened) {\n Cookies.set('sidebarStatus', 1)\n } else {\n Cookies.set('sidebarStatus', 0)\n }\n },\n CLOSE_SIDEBAR: (state, withoutAnimation) => {\n Cookies.set('sidebarStatus', 0)\n state.sidebar.opened = false\n state.sidebar.withoutAnimation = withoutAnimation\n },\n TOGGLE_DEVICE: (state, device) => {\n state.device = device\n },\n SET_INVITES_ENABLED: (state, invitesEnabled) => {\n state.invitesEnabled = invitesEnabled\n },\n SET_LANGUAGE: (state, language) => {\n state.language = language\n Cookies.set('language', language)\n },\n TOGGLE_REBOOT: (state, needReboot) => {\n state.needReboot = needReboot\n },\n SET_SIZE: (state, size) => {\n state.size = size\n Cookies.set('size', size)\n }\n },\n actions: {\n closeSideBar({ commit }, { withoutAnimation }) {\n commit('CLOSE_SIDEBAR', withoutAnimation)\n },\n async NeedReboot({ commit, getters }) {\n const response = await needReboot(getters.authHost, getters.token)\n commit('TOGGLE_REBOOT', response.data['need_reboot'])\n },\n async RestartApplication({ commit, getters }) {\n await restartApp(getters.authHost, getters.token)\n commit('TOGGLE_REBOOT', false)\n },\n SetInvitesEnabled({ commit }, invitesEnabled) {\n commit('SET_INVITES_ENABLED', invitesEnabled)\n },\n setLanguage({ commit }, language) {\n commit('SET_LANGUAGE', language)\n },\n setSize({ commit }, size) {\n commit('SET_SIZE', size)\n },\n toggleDevice({ commit }, device) {\n commit('TOGGLE_DEVICE', device)\n },\n toggleSideBar({ commit }) {\n commit('TOGGLE_SIDEBAR')\n }\n }\n}\n\nexport default app\n","const errorLog = {\n state: {\n logs: []\n },\n mutations: {\n ADD_ERROR_LOG: (state, log) => {\n state.logs.push(log)\n }\n },\n actions: {\n addErrorLog({ commit }, log) {\n commit('ADD_ERROR_LOG', log)\n }\n }\n}\n\nexport default errorLog\n","import _ from 'lodash'\n\nimport request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchLog(authHost, token, params, page = 1) {\n const normalizedParams = new URLSearchParams(\n _.omitBy({ ...params, page }, _.isUndefined)\n ).toString()\n\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/moderation_log?${normalizedParams}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchAdmins(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?filters=is_admin`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchModerators(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?filters=is_moderator`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchLog, fetchAdmins, fetchModerators } from '@/api/moderationLog'\n\nconst moderationLog = {\n state: {\n fetchedLog: [],\n logItemsCount: 0,\n admins: [],\n moderators: [],\n logLoading: true,\n adminsLoading: true\n },\n mutations: {\n SET_LOG_LOADING: (state, status) => {\n state.logLoading = status\n },\n SET_ADMINS_LOADING: (state, status) => {\n state.adminsLoading = status\n },\n SET_MODERATION_LOG: (state, log) => {\n state.fetchedLog = log\n },\n SET_MODERATION_LOG_COUNT: (state, count) => {\n state.logItemsCount = count\n },\n SET_ADMINS: (state, admins) => {\n state.admins = admins\n },\n SET_MODERATORS: (state, moderators) => {\n state.moderators = moderators\n }\n },\n actions: {\n async FetchModerationLog({ commit, getters }, opts = {}) {\n const response = await fetchLog(getters.authHost, getters.token, opts)\n\n commit('SET_MODERATION_LOG', response.data.items)\n commit('SET_MODERATION_LOG_COUNT', response.data.total)\n commit('SET_LOG_LOADING', false)\n },\n async FetchAdmins({ commit, getters }) {\n const adminsResponse = await fetchAdmins(getters.authHost, getters.token)\n const moderatorsResponse = await fetchModerators(getters.authHost, getters.token)\n\n commit('SET_ADMINS', adminsResponse.data)\n commit('SET_MODERATORS', moderatorsResponse.data)\n commit('SET_ADMINS_LOADING', false)\n }\n }\n}\n\nexport default moderationLog\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function generateInviteToken(max_use, expires_at, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/invite_token`,\n method: 'post',\n headers: authHeaders(token),\n data: expires_at && expires_at.length > 0 ? { max_use, expires_at } : { max_use }\n })\n}\n\nexport async function inviteViaEmail(email, name, authHost, token) {\n const data = name.length > 0 ? { email, name } : { email }\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/email_invite',\n method: 'post',\n headers: authHeaders(token),\n data\n })\n}\n\nexport async function listInviteTokens(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/invites`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function revokeToken(tokenToRevoke, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/revoke_invite`,\n method: 'post',\n headers: authHeaders(token),\n data: { token: tokenToRevoke }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { generateInviteToken, inviteViaEmail, listInviteTokens, revokeToken } from '@/api/invites'\nimport { Message } from 'element-ui'\nimport i18n from '@/lang'\n\nconst invites = {\n state: {\n inviteTokens: [],\n loading: false,\n newToken: {}\n },\n mutations: {\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_NEW_TOKEN: (state, token) => {\n state.newToken = token\n },\n SET_TOKENS: (state, tokens) => {\n state.inviteTokens = tokens\n }\n },\n actions: {\n async FetchInviteTokens({ commit, getters }) {\n commit('SET_LOADING', true)\n const response = await listInviteTokens(getters.authHost, getters.token)\n commit('SET_TOKENS', response.data.invites.reverse())\n commit('SET_LOADING', false)\n },\n async GenerateInviteToken({ commit, dispatch, getters }, { maxUse, expiresAt }) {\n try {\n const { data } = await generateInviteToken(maxUse, expiresAt, getters.authHost, getters.token)\n commit('SET_NEW_TOKEN', { token: data.token, maxUse: data.max_use, expiresAt: data.expires_at })\n } catch (_e) {\n return\n }\n dispatch('FetchInviteTokens')\n },\n async InviteUserViaEmail({ commit, dispatch, getters }, { email, name }) {\n try {\n await inviteViaEmail(email, name, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n Message({\n message: i18n.t('invites.emailSent'),\n type: 'success',\n duration: 5 * 1000\n })\n },\n RemoveNewToken({ commit }) {\n commit('SET_NEW_TOKEN', {})\n },\n async RevokeToken({ commit, dispatch, getters }, token) {\n try {\n await revokeToken(token, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n dispatch('FetchInviteTokens')\n }\n }\n}\n\nexport default invites\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchPeers(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/v1/instance/peers`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchPeers } from '@/api/peers'\n\nconst peers = {\n state: {\n fetchedPeers: [],\n loading: true\n },\n\n mutations: {\n SET_PEERS: (state, peers) => {\n state.fetchedPeers = peers\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n }\n },\n\n actions: {\n async FetchPeers({ commit, getters }) {\n const peers = await fetchPeers(getters.authHost, getters.token)\n\n commit('SET_PEERS', [...peers.data].sort())\n commit('SET_LOADING', false)\n }\n }\n}\n\nexport default peers\n","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=69c6c5c4&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=69c6c5c4&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"69c6c5c4\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticStyle:{\"padding\":\"0 15px\"},on:{\"click\":_vm.toggleClick}},[_c('svg',{staticClass:\"hamburger\",class:{'is-active':_vm.isActive},attrs:{\"viewBox\":\"0 0 1024 1024\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"64\",\"height\":\"64\"}},[_c('path',{attrs:{\"d\":\"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z\"}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Navbar.vue?vue&type=template&id=28de7ff2&scoped=true&\"\nimport script from \"./Navbar.vue?vue&type=script&lang=js&\"\nexport * from \"./Navbar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Navbar.vue?vue&type=style&index=0&id=28de7ff2&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"28de7ff2\",\n null\n \n)\n\ncomponent.options.__file = \"Navbar.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"navbar\"},[_c('hamburger',{staticClass:\"hamburger-container\",attrs:{\"toggle-click\":_vm.toggleSideBar,\"is-active\":_vm.sidebar.opened}}),_vm._v(\" \"),_c('div',{staticClass:\"right-menu\"},[_c('el-dropdown',{staticClass:\"avatar-container right-menu-item hover-effect\",attrs:{\"trigger\":\"click\"}},[_c('div',{staticClass:\"avatar-wrapper\"},[_c('img',{staticClass:\"user-avatar\",attrs:{\"src\":_vm.avatar+'?imageView2/1/w/80/h/80'}})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[_c('el-dropdown-item',[_c('span',{staticStyle:{\"display\":\"block\"},on:{\"click\":_vm.logout}},[_vm._v(_vm._s(_vm.$t('navbar.logOut')))])])],1)],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// translate router.meta.title, be used in breadcrumb sidebar tagsview\nexport function generateTitle(title) {\n const hasKey = this.$te('route.' + title)\n\n if (hasKey) {\n // $t :this method from vue-i18n, inject in @/lang/index.js\n const translatedTitle = this.$t('route.' + title)\n\n return translatedTitle\n }\n return title\n}\n","/**\n * Created by jiachenpan on 16/11/18.\n */\n\nexport function parseTime(time, cFormat) {\n if (arguments.length === 0) {\n return null\n }\n const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'\n let date\n if (typeof time === 'object') {\n date = time\n } else {\n if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {\n time = parseInt(time)\n }\n if ((typeof time === 'number') && (time.toString().length === 10)) {\n time = time * 1000\n }\n date = new Date(time)\n }\n const formatObj = {\n y: date.getFullYear(),\n m: date.getMonth() + 1,\n d: date.getDate(),\n h: date.getHours(),\n i: date.getMinutes(),\n s: date.getSeconds(),\n a: date.getDay()\n }\n const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {\n let value = formatObj[key]\n // Note: getDay() returns 0 on Sunday\n if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] }\n if (result.length > 0 && value < 10) {\n value = '0' + value\n }\n return value || 0\n })\n return time_str\n}\n\nexport function formatTime(time, option) {\n time = +time * 1000\n const d = new Date(time)\n const now = Date.now()\n\n const diff = (now - d) / 1000\n\n if (diff < 30) {\n return '刚刚'\n } else if (diff < 3600) {\n // less 1 hour\n return Math.ceil(diff / 60) + '分钟前'\n } else if (diff < 3600 * 24) {\n return Math.ceil(diff / 3600) + '小时前'\n } else if (diff < 3600 * 24 * 2) {\n return '1天前'\n }\n if (option) {\n return parseTime(time, option)\n } else {\n return (\n d.getMonth() +\n 1 +\n '月' +\n d.getDate() +\n '日' +\n d.getHours() +\n '时' +\n d.getMinutes() +\n '分'\n )\n }\n}\n\n// 格式化时间\nexport function getQueryObject(url) {\n url = url == null ? window.location.href : url\n const search = url.substring(url.lastIndexOf('?') + 1)\n const obj = {}\n const reg = /([^?&=]+)=([^?&=]*)/g\n search.replace(reg, (rs, $1, $2) => {\n const name = decodeURIComponent($1)\n let val = decodeURIComponent($2)\n val = String(val)\n obj[name] = val\n return rs\n })\n return obj\n}\n\n/**\n *get getByteLen\n * @param {Sting} val input value\n * @returns {number} output value\n */\nexport function getByteLen(val) {\n let len = 0\n for (let i = 0; i < val.length; i++) {\n if (val[i].match(/[^\\x00-\\xff]/gi) != null) {\n len += 1\n } else {\n len += 0.5\n }\n }\n return Math.floor(len)\n}\n\nexport function cleanArray(actual) {\n const newArray = []\n for (let i = 0; i < actual.length; i++) {\n if (actual[i]) {\n newArray.push(actual[i])\n }\n }\n return newArray\n}\n\nexport function param(json) {\n if (!json) return ''\n return cleanArray(\n Object.keys(json).map(key => {\n if (json[key] === undefined) return ''\n return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])\n })\n ).join('&')\n}\n\nexport function param2Obj(url) {\n const search = url.split('?')[1]\n if (!search) {\n return {}\n }\n return JSON.parse(\n '{\"' +\n decodeURIComponent(search)\n .replace(/\"/g, '\\\\\"')\n .replace(/&/g, '\",\"')\n .replace(/=/g, '\":\"') +\n '\"}'\n )\n}\n\nexport function html2Text(val) {\n const div = document.createElement('div')\n div.innerHTML = val\n return div.textContent || div.innerText\n}\n\nexport function objectMerge(target, source) {\n /* Merges two objects,\n giving the last one precedence */\n\n if (typeof target !== 'object') {\n target = {}\n }\n if (Array.isArray(source)) {\n return source.slice()\n }\n Object.keys(source).forEach(property => {\n const sourceProperty = source[property]\n if (typeof sourceProperty === 'object') {\n target[property] = objectMerge(target[property], sourceProperty)\n } else {\n target[property] = sourceProperty\n }\n })\n return target\n}\n\nexport function toggleClass(element, className) {\n if (!element || !className) {\n return\n }\n let classString = element.className\n const nameIndex = classString.indexOf(className)\n if (nameIndex === -1) {\n classString += '' + className\n } else {\n classString =\n classString.substr(0, nameIndex) +\n classString.substr(nameIndex + className.length)\n }\n element.className = classString\n}\n\nexport const pickerOptions = [\n {\n text: '今天',\n onClick(picker) {\n const end = new Date()\n const start = new Date(new Date().toDateString())\n end.setTime(start.getTime())\n picker.$emit('pick', [start, end])\n }\n },\n {\n text: '最近一周',\n onClick(picker) {\n const end = new Date(new Date().toDateString())\n const start = new Date()\n start.setTime(end.getTime() - 3600 * 1000 * 24 * 7)\n picker.$emit('pick', [start, end])\n }\n },\n {\n text: '最近一个月',\n onClick(picker) {\n const end = new Date(new Date().toDateString())\n const start = new Date()\n start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)\n picker.$emit('pick', [start, end])\n }\n },\n {\n text: '最近三个月',\n onClick(picker) {\n const end = new Date(new Date().toDateString())\n const start = new Date()\n start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)\n picker.$emit('pick', [start, end])\n }\n }\n]\n\nexport function getTime(type) {\n if (type === 'start') {\n return new Date().getTime() - 3600 * 1000 * 24 * 90\n } else {\n return new Date(new Date().toDateString())\n }\n}\n\nexport function debounce(func, wait, immediate) {\n let timeout, args, context, timestamp, result\n\n const later = function() {\n // 据上一次触发时间间隔\n const last = +new Date() - timestamp\n\n // 上次被包装函数被调用时间间隔last小于设定时间间隔wait\n if (last < wait && last > 0) {\n timeout = setTimeout(later, wait - last)\n } else {\n timeout = null\n // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用\n if (!immediate) {\n result = func.apply(context, args)\n if (!timeout) context = args = null\n }\n }\n }\n\n return function(...args) {\n context = this\n timestamp = +new Date()\n const callNow = immediate && !timeout\n // 如果延时不存在,重新设定延时\n if (!timeout) timeout = setTimeout(later, wait)\n if (callNow) {\n result = func.apply(context, args)\n context = args = null\n }\n\n return result\n }\n}\n\n/**\n * This is just a simple version of deep copy\n * Has a lot of edge cases bug\n * If you want to use a perfect deep copy, use lodash's _.cloneDeep\n */\nexport function deepClone(source) {\n if (!source && typeof source !== 'object') {\n throw new Error('error arguments', 'shallowClone')\n }\n const targetObj = source.constructor === Array ? [] : {}\n Object.keys(source).forEach(keys => {\n if (source[keys] && typeof source[keys] === 'object') {\n targetObj[keys] = deepClone(source[keys])\n } else {\n targetObj[keys] = source[keys]\n }\n })\n return targetObj\n}\n\nexport function uniqueArr(arr) {\n return Array.from(new Set(arr))\n}\n\nexport function isExternal(path) {\n return /^(https?:|mailto:|tel:)/.test(path)\n}\n","\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"","var render, staticRenderFns\nimport script from \"./Item.vue?vue&type=script&lang=js&\"\nexport * from \"./Item.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Item.vue\"\nexport default component.exports","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Link.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Link.vue?vue&type=script&lang=js&\"","\n\n\n\n","import { render, staticRenderFns } from \"./Link.vue?vue&type=template&id=4dde2217&\"\nimport script from \"./Link.vue?vue&type=script&lang=js&\"\nexport * from \"./Link.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Link.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('component',_vm._b({},'component',_vm.linkProps(_vm.to),false),[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SidebarItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SidebarItem.vue?vue&type=script&lang=js&\"","\n\n\n","export default {\n computed: {\n device() {\n return this.$store.state.app.device\n }\n },\n mounted() {\n // In order to fix the click on menu on the ios device will trigger the mouseleave bug\n // https://github.com/PanJiaChen/vue-element-admin/issues/1135\n this.fixBugIniOS()\n },\n methods: {\n fixBugIniOS() {\n const $subMenu = this.$refs.subMenu\n if ($subMenu) {\n const handleMouseleave = $subMenu.handleMouseleave\n $subMenu.handleMouseleave = (e) => {\n if (this.device === 'mobile') {\n return\n }\n handleMouseleave(e)\n }\n }\n }\n }\n}\n","import { render, staticRenderFns } from \"./SidebarItem.vue?vue&type=template&id=763b3c07&\"\nimport script from \"./SidebarItem.vue?vue&type=script&lang=js&\"\nexport * from \"./SidebarItem.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SidebarItem.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.item.hidden && _vm.item.children && _vm.invitesEnabled)?_c('div',{staticClass:\"menu-wrapper\"},[(_vm.hasOneShowingChild(_vm.item.children,_vm.item) && (!_vm.onlyOneChild.children||_vm.onlyOneChild.noShowingChildren)&&!_vm.item.alwaysShow)?[_c('app-link',{attrs:{\"to\":_vm.resolvePath(_vm.onlyOneChild.path)}},[_c('el-menu-item',{class:{'submenu-title-noDropdown':!_vm.isNest},attrs:{\"index\":_vm.resolvePath(_vm.onlyOneChild.path)}},[(_vm.onlyOneChild.meta)?_c('item',{attrs:{\"icon\":_vm.onlyOneChild.meta.icon||_vm.item.meta.icon,\"title\":_vm.generateTitle(_vm.onlyOneChild.meta.title)}}):_vm._e()],1)],1)]:_c('el-submenu',{ref:\"subMenu\",attrs:{\"index\":_vm.resolvePath(_vm.item.path)}},[_c('template',{slot:\"title\"},[(_vm.item.meta)?_c('item',{attrs:{\"icon\":_vm.item.meta.icon,\"title\":_vm.generateTitle(_vm.item.meta.title)}}):_vm._e()],1),_vm._v(\" \"),_vm._l((_vm.item.children),function(child){return [(!child.hidden)?[(child.children&&child.children.length>0)?_c('sidebar-item',{key:child.path,staticClass:\"nest-menu\",attrs:{\"is-nest\":true,\"item\":child,\"base-path\":_vm.resolvePath(child.path)}}):_c('app-link',{key:child.name,attrs:{\"to\":_vm.resolvePath(child.path)}},[_c('el-menu-item',{attrs:{\"index\":_vm.resolvePath(child.path)}},[(child.meta)?_c('item',{attrs:{\"icon\":child.meta.icon,\"title\":_vm.generateTitle(child.meta.title)}}):_vm._e()],1)],1)]:_vm._e()]})],2)],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=29a0fa94&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-scrollbar',{attrs:{\"wrap-class\":\"scrollbar-wrapper\"}},[_c('el-menu',{attrs:{\"default-active\":_vm.$route.path,\"collapse\":_vm.isCollapse,\"background-color\":_vm.variables.menuBg,\"text-color\":_vm.variables.menuText,\"active-text-color\":_vm.variables.menuActiveText,\"mode\":\"vertical\"}},_vm._l((_vm.permission_routers),function(route){return _c('sidebar-item',{key:route.path,attrs:{\"item\":route,\"base-path\":route.path}})}),1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=591d6778&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=591d6778&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"591d6778\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-scrollbar',{ref:\"scrollContainer\",staticClass:\"scroll-container\",attrs:{\"vertical\":false},nativeOn:{\"wheel\":function($event){$event.preventDefault();return _vm.handleScroll($event)}}},[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=script&lang=js&\"","\n\n\n\n\n\n\n","import { render, staticRenderFns } from \"./TagsView.vue?vue&type=template&id=e1cdb714&scoped=true&\"\nimport script from \"./TagsView.vue?vue&type=script&lang=js&\"\nexport * from \"./TagsView.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TagsView.vue?vue&type=style&index=0&id=e1cdb714&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\nimport style1 from \"./TagsView.vue?vue&type=style&index=1&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e1cdb714\",\n null\n \n)\n\ncomponent.options.__file = \"TagsView.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"tags-view-container\"},[_c('scroll-pane',{ref:\"scrollPane\",staticClass:\"tags-view-wrapper\"},_vm._l((_vm.visitedViews),function(tag){return _c('router-link',{key:tag.path,ref:\"tag\",refInFor:true,staticClass:\"tags-view-item\",class:_vm.isActive(tag)?'active':'',attrs:{\"to\":{ path: tag.path, query: tag.query, fullPath: tag.fullPath },\"tag\":\"span\"},nativeOn:{\"mouseup\":function($event){if('button' in $event && $event.button !== 1){ return null; }return _vm.closeSelectedTag(tag)},\"contextmenu\":function($event){$event.preventDefault();return _vm.openMenu(tag,$event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.generateTitle(tag.title))+\"\\n \"),(!tag.meta.affix)?_c('span',{staticClass:\"el-icon-close\",on:{\"click\":function($event){$event.preventDefault();$event.stopPropagation();return _vm.closeSelectedTag(tag)}}}):_vm._e()])}),1),_vm._v(\" \"),_c('ul',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.visible),expression:\"visible\"}],staticClass:\"contextmenu\",style:({left:_vm.left+'px',top:_vm.top+'px'})},[_c('li',{on:{\"click\":function($event){return _vm.refreshSelectedTag(_vm.selectedTag)}}},[_vm._v(_vm._s(_vm.$t('tagsView.refresh')))]),_vm._v(\" \"),(!(_vm.selectedTag.meta&&_vm.selectedTag.meta.affix))?_c('li',{on:{\"click\":function($event){return _vm.closeSelectedTag(_vm.selectedTag)}}},[_vm._v(_vm._s(_vm.$t('tagsView.close')))]):_vm._e(),_vm._v(\" \"),_c('li',{on:{\"click\":_vm.closeOthersTags}},[_vm._v(_vm._s(_vm.$t('tagsView.closeOthers')))]),_vm._v(\" \"),_c('li',{on:{\"click\":function($event){return _vm.closeAllTags(_vm.selectedTag)}}},[_vm._v(_vm._s(_vm.$t('tagsView.closeAll')))])])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=script&lang=js&\"","\n\n\n\n\n\n","import { render, staticRenderFns } from \"./AppMain.vue?vue&type=template&id=f852c4f2&scoped=true&\"\nimport script from \"./AppMain.vue?vue&type=script&lang=js&\"\nexport * from \"./AppMain.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppMain.vue?vue&type=style&index=0&id=f852c4f2&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f852c4f2\",\n null\n \n)\n\ncomponent.options.__file = \"AppMain.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',{staticClass:\"app-main\"},[_c('transition',{attrs:{\"name\":\"fade-transform\",\"mode\":\"out-in\"}},[_c('keep-alive',{attrs:{\"include\":_vm.cachedViews}},[_c('router-view',{key:_vm.key})],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import store from '@/store'\n\nconst { body } = document\nconst mobileWidth = 480\nconst tabletWidth = 801\nconst ratio = 3\n\nexport default {\n watch: {\n $route(route) {\n if (this.device === 'mobile' && this.sidebar.opened) {\n store.dispatch('closeSideBar', { withoutAnimation: false })\n }\n }\n },\n beforeMount() {\n window.addEventListener('resize', this.resizeHandler)\n },\n mounted() {\n const isMobile = this.isMobile()\n const isTablet = this.isTablet()\n if (isMobile || isTablet) {\n store.dispatch('toggleDevice', isMobile ? 'mobile' : 'tablet')\n store.dispatch('closeSideBar', { withoutAnimation: true })\n }\n },\n methods: {\n isMobile() {\n const rect = body.getBoundingClientRect()\n return rect.width - ratio < mobileWidth\n },\n isTablet() {\n const rect = body.getBoundingClientRect()\n return rect.width - ratio < tabletWidth && rect.width - ratio > mobileWidth\n },\n resizeHandler() {\n if (!document.hidden) {\n const isMobile = this.isMobile()\n const isTablet = this.isTablet()\n\n if (isMobile || isTablet) {\n store.dispatch('toggleDevice', isMobile ? 'mobile' : 'tablet')\n store.dispatch('closeSideBar', { withoutAnimation: true })\n } else {\n store.dispatch('toggleDevice', 'desktop')\n }\n }\n }\n }\n}\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Layout.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Layout.vue?vue&type=template&id=767d264f&scoped=true&\"\nimport script from \"./Layout.vue?vue&type=script&lang=js&\"\nexport * from \"./Layout.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Layout.vue?vue&type=style&index=0&id=767d264f&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"767d264f\",\n null\n \n)\n\ncomponent.options.__file = \"Layout.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"app-wrapper\",class:_vm.classObj},[(_vm.device==='mobile'&&_vm.sidebar.opened)?_c('div',{staticClass:\"drawer-bg\",on:{\"click\":_vm.handleClickOutside}}):_vm._e(),_vm._v(\" \"),_c('sidebar',{staticClass:\"sidebar-container\"}),_vm._v(\" \"),_c('div',{staticClass:\"main-container\"},[_c('navbar'),_vm._v(\" \"),_c('app-main')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import Vue from 'vue'\nimport Router from 'vue-router'\n\nVue.use(Router)\n\n/* Layout */\nimport Layout from '@/views/layout/Layout'\n\nconst disabledFeatures = process.env.DISABLED_FEATURES || []\nconst settingsDisabled = disabledFeatures.includes('settings')\nconst settings = {\n path: '/settings',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/settings/index'),\n name: 'Settings',\n meta: { title: 'Settings', icon: 'settings', noCache: true }\n }\n ]\n}\n\nconst statusesDisabled = disabledFeatures.includes('statuses')\nconst statuses = {\n path: '/statuses',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/statuses/index'),\n name: 'Statuses',\n meta: { title: 'Statuses', icon: 'form', noCache: true }\n }\n ]\n}\n\nconst reportsDisabled = disabledFeatures.includes('reports')\nconst reports = {\n path: '/reports',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/reports/index'),\n name: 'Reports',\n meta: { title: 'Reports', icon: 'documentation', noCache: true }\n }\n ]\n}\n\nconst invitesDisabled = disabledFeatures.includes('invites')\nconst invites = {\n path: '/invites',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/invites/index'),\n name: 'Invites',\n meta: { title: 'Invites', icon: 'guide', noCache: true }\n }\n ]\n}\n\nconst emojiPacksDisabled = disabledFeatures.includes('emoji-packs')\nconst emojiPacks = {\n path: '/emoji_packs',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/emojiPacks/index'),\n name: 'Emoji Packs',\n meta: { title: 'Emoji Packs', icon: 'eye-open', noCache: true }\n }\n ]\n}\n\nconst moderationLogDisabled = disabledFeatures.includes('moderation-log')\nconst moderationLog = {\n path: '/moderation_log',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/moderation_log/index'),\n name: 'Moderation Log',\n meta: { title: 'moderationLog', icon: 'list', noCache: true }\n }\n ]\n}\n\nexport const constantRouterMap = [\n {\n path: '/redirect',\n component: Layout,\n hidden: true,\n children: [\n {\n path: '/redirect/:path*',\n component: () => import('@/views/redirect/index')\n }\n ]\n },\n {\n path: '/login-pleroma',\n component: () => import('@/views/login/pleroma'),\n hidden: true\n },\n {\n path: '/login',\n component: () => import('@/views/login/index'),\n hidden: true\n },\n {\n path: '/auth-redirect',\n component: () => import('@/views/login/authredirect'),\n hidden: true\n },\n {\n path: '/404',\n component: () => import('@/views/errorPage/404'),\n hidden: true\n },\n {\n path: '/401',\n component: () => import('@/views/errorPage/401'),\n hidden: true\n },\n {\n path: '',\n component: Layout,\n redirect: '/users/index'\n }\n]\n\nexport default new Router({\n // mode: 'history', // require service support\n scrollBehavior: () => ({ y: 0 }),\n routes: constantRouterMap\n})\n\nexport const asyncRouterMap = [\n {\n path: '/users',\n component: Layout,\n children: [\n {\n path: 'index',\n component: () => import('@/views/users/index'),\n name: 'Users',\n meta: { title: 'users', icon: 'peoples', noCache: true }\n }\n ]\n },\n ...(statusesDisabled ? [] : [statuses]),\n ...(reportsDisabled ? [] : [reports]),\n ...(invitesDisabled ? [] : [invites]),\n ...(emojiPacksDisabled ? [] : [emojiPacks]),\n ...(moderationLogDisabled ? [] : [moderationLog]),\n ...(settingsDisabled ? [] : [settings]),\n {\n path: '/users/:id',\n component: Layout,\n children: [\n {\n path: '',\n name: 'UsersShow',\n component: () => import('@/views/users/show')\n }\n ],\n hidden: true\n },\n {\n path: '/statuses/:id',\n component: Layout,\n children: [\n {\n path: '',\n name: 'StatusShow',\n component: () => import('@/views/statuses/show')\n }\n ],\n hidden: true\n },\n { path: '*', redirect: '/404', hidden: true }\n]\n","import { asyncRouterMap, constantRouterMap } from '@/router'\n\n/**\n * 通过meta.role判断是否与当前用户权限匹配\n * @param roles\n * @param route\n */\nfunction hasPermission(roles, route) {\n if (route.meta && route.meta.roles) {\n return roles.some(role => route.meta.roles.includes(role))\n } else {\n return true\n }\n}\n\n/**\n * 递归过滤异步路由表,返回符合用户角色权限的路由表\n * @param routes asyncRouterMap\n * @param roles\n */\nfunction filterAsyncRouter(routes, roles) {\n const res = []\n\n routes.forEach(route => {\n const tmp = { ...route }\n if (hasPermission(roles, tmp)) {\n if (tmp.children) {\n tmp.children = filterAsyncRouter(tmp.children, roles)\n }\n res.push(tmp)\n }\n })\n\n return res\n}\n\nconst permission = {\n state: {\n routers: [],\n addRouters: []\n },\n mutations: {\n SET_ROUTERS: (state, routers) => {\n state.addRouters = routers\n state.routers = constantRouterMap.concat(routers)\n }\n },\n actions: {\n GenerateRoutes({ commit }, data) {\n return new Promise(resolve => {\n const { roles } = data\n let accessedRouters\n if (roles.includes('admin')) {\n accessedRouters = asyncRouterMap\n } else {\n accessedRouters = filterAsyncRouter(asyncRouterMap, roles)\n }\n commit('SET_ROUTERS', accessedRouters)\n resolve()\n })\n }\n }\n}\n\nexport default permission\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchRelays(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/relay',\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function addRelay(relay, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/relay',\n method: 'post',\n headers: authHeaders(token),\n data: { relay_url: relay }\n })\n}\n\nexport async function deleteRelay(relay, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/relay',\n method: 'delete',\n headers: authHeaders(token),\n data: { relay_url: `https://${relay}/actor` }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchRelays, addRelay, deleteRelay } from '@/api/relays'\n\nconst relays = {\n state: {\n fetchedRelays: [],\n loading: true\n },\n mutations: {\n SET_LOADING: (state, loading) => {\n state.loading = loading\n },\n SET_RELAYS: (state, relays) => {\n state.fetchedRelays = relays\n },\n ADD_RELAY: (state, relay) => {\n state.fetchedRelays = [...state.fetchedRelays, relay]\n },\n DELETE_RELAY: (state, relay) => {\n state.fetchedRelays = state.fetchedRelays.filter(fetchedRelay => fetchedRelay !== relay)\n }\n },\n actions: {\n async FetchRelays({ commit, getters }) {\n commit('SET_LOADING', true)\n\n const response = await fetchRelays(getters.authHost, getters.token)\n\n commit('SET_RELAYS', response.data.relays)\n commit('SET_LOADING', false)\n },\n async AddRelay({ commit, dispatch, getters }, relay) {\n commit('ADD_RELAY', relay)\n\n try {\n await addRelay(relay, getters.authHost, getters.token)\n } catch (_e) {\n return\n } finally {\n dispatch('FetchRelays')\n }\n },\n async DeleteRelay({ commit, dispatch, getters }, relay) {\n commit('DELETE_RELAY', relay)\n\n try {\n await deleteRelay(relay, getters.authHost, getters.token)\n } catch (_e) {\n return\n } finally {\n dispatch('FetchRelays')\n }\n }\n }\n}\n\nexport default relays\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function changeState(reports, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/reports`,\n method: 'patch',\n headers: authHeaders(token),\n data: { reports }\n })\n}\n\nexport async function fetchReports(filter, page, pageSize, authHost, token) {\n const url = filter.length > 0\n ? `/api/pleroma/admin/reports?state=${filter}&page=${page}&page_size=${pageSize}`\n : `/api/pleroma/admin/reports?page=${page}&page_size=${pageSize}`\n return await request({\n baseURL: baseName(authHost),\n url,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function createNote(content, reportID, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/reports/${reportID}/notes`,\n method: `post`,\n headers: authHeaders(token),\n data: { content }\n })\n}\n\nexport async function deleteNote(noteID, reportID, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/reports/${reportID}/notes/${noteID}`,\n method: `delete`,\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { changeState, fetchReports, createNote, deleteNote } from '@/api/reports'\n\nconst reports = {\n state: {\n fetchedReports: [],\n totalReportsCount: 0,\n currentPage: 1,\n pageSize: 50,\n stateFilter: '',\n loading: true\n },\n mutations: {\n SET_LAST_REPORT_ID: (state, id) => {\n state.idOfLastReport = id\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_PAGE: (state, page) => {\n state.currentPage = page\n },\n SET_REPORTS: (state, reports) => {\n state.fetchedReports = reports\n },\n SET_REPORTS_COUNT: (state, total) => {\n state.totalReportsCount = total\n },\n SET_REPORTS_FILTER: (state, filter) => {\n state.stateFilter = filter\n }\n },\n actions: {\n async ChangeReportState({ commit, getters, state }, reportsData) {\n changeState(reportsData, getters.authHost, getters.token)\n\n const updatedReports = state.fetchedReports.map(report => {\n const updatedReportsIds = reportsData.map(({ id }) => id)\n return updatedReportsIds.includes(report.id) ? { ...report, state: reportsData[0].state } : report\n })\n\n commit('SET_REPORTS', updatedReports)\n },\n ClearFetchedReports({ commit }) {\n commit('SET_REPORTS', [])\n },\n async FetchReports({ commit, getters, state }, page) {\n commit('SET_LOADING', true)\n const { data } = await fetchReports(state.stateFilter, page, state.pageSize, getters.authHost, getters.token)\n\n commit('SET_REPORTS', data.reports)\n commit('SET_REPORTS_COUNT', data.total)\n commit('SET_PAGE', page)\n commit('SET_LOADING', false)\n },\n SetFilter({ commit }, filter) {\n commit('SET_REPORTS_FILTER', filter)\n },\n CreateReportNote({ commit, getters, state, rootState }, { content, reportID }) {\n createNote(content, reportID, getters.authHost, getters.token)\n\n const optimisticNote = {\n user: {\n avatar: rootState.user.avatar,\n nickname: rootState.user.name,\n id: rootState.user.id\n },\n content: content,\n created_at: new Date().getTime()\n }\n\n const updatedReports = state.fetchedReports.map(report => {\n if (report.id === reportID) {\n report.notes = [...report.notes, optimisticNote]\n }\n\n return report\n })\n\n commit('SET_REPORTS', updatedReports)\n },\n DeleteReportNote({ commit, getters, state }, { noteID, reportID }) {\n deleteNote(noteID, reportID, getters.authHost, getters.token)\n\n const updatedReports = state.fetchedReports.map(report => {\n if (report.id === reportID) {\n report.notes = report.notes.filter(note => note.id !== noteID)\n }\n\n return report\n })\n\n commit('SET_REPORTS', updatedReports)\n }\n }\n}\n\nexport default reports\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function fetchDescription(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config/descriptions`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchSettings(authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function updateSettings(configs, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config`,\n method: 'post',\n headers: authHeaders(token),\n data: { configs }\n })\n}\n\nexport async function removeSettings(configs, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/config`,\n method: 'post',\n headers: authHeaders(token),\n data: { configs }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchDescription, fetchSettings, removeSettings, updateSettings } from '@/api/settings'\nimport { checkPartialUpdate, formSearchObject, parseNonTuples, parseTuples, valueHasTuples, wrapUpdatedSettings } from './normalizers'\nimport _ from 'lodash'\n\nconst settings = {\n state: {\n activeTab: 'instance',\n configDisabled: true,\n db: {},\n description: [],\n loading: true,\n searchData: {},\n settings: {},\n updatedSettings: {}\n },\n mutations: {\n CLEAR_UPDATED_SETTINGS: (state) => {\n state.updatedSettings = {}\n },\n REMOVE_SETTING_FROM_UPDATED: (state, { group, key, subkeys }) => {\n if (_.get(state.updatedSettings, [group, key, subkeys[0]])) {\n const { [subkeys[0]]: value, ...updatedSettings } = state.updatedSettings[group][key]\n state.updatedSettings = updatedSettings\n }\n },\n SET_ACTIVE_TAB: (state, tab) => {\n state.activeTab = tab\n },\n SET_DESCRIPTION: (state, data) => {\n state.description = data\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_SEARCH: (state, searchObject) => {\n state.searchData = searchObject\n },\n SET_SETTINGS: (state, data) => {\n const newSettings = data.reduce((acc, { group, key, value }) => {\n const parsedValue = valueHasTuples(key, value)\n ? { value: parseNonTuples(key, value) }\n : parseTuples(value, key)\n acc[group] = acc[group] ? { ...acc[group], [key]: parsedValue } : { [key]: parsedValue }\n return acc\n }, {})\n\n const newDbSettings = data.reduce((acc, { group, key, db }) => {\n if (db) {\n acc[group] = acc[group] ? { ...acc[group], [key]: db } : { [key]: db }\n }\n return acc\n }, {})\n\n state.settings = newSettings\n state.db = newDbSettings\n },\n TOGGLE_TABS: (state, status) => {\n state.configDisabled = status\n },\n UPDATE_SETTINGS: (state, { group, key, input, value, type }) => {\n const updatedSetting = !state.updatedSettings[group] || (key === 'Pleroma.Emails.Mailer' && input === ':adapter')\n ? { [key]: { [input]: [type, value] }}\n : { [key]: { ...state.updatedSettings[group][key], ...{ [input]: [type, value] }}}\n state.updatedSettings[group] = { ...state.updatedSettings[group], ...updatedSetting }\n },\n UPDATE_STATE: (state, { group, key, input, value }) => {\n const updatedState = key === 'Pleroma.Emails.Mailer' && input === ':adapter'\n ? { [key]: { [input]: value }}\n : { [key]: { ...state.settings[group][key], ...{ [input]: value }}}\n state.settings[group] = { ...state.settings[group], ...updatedState }\n }\n },\n actions: {\n async FetchSettings({ commit, getters }) {\n commit('SET_LOADING', true)\n try {\n const response = await fetchSettings(getters.authHost, getters.token)\n const description = await fetchDescription(getters.authHost, getters.token)\n commit('SET_DESCRIPTION', description.data)\n const searchObject = formSearchObject(description.data)\n commit('SET_SEARCH', searchObject)\n commit('SET_SETTINGS', response.data.configs)\n } catch (_e) {\n commit('TOGGLE_TABS', true)\n commit('SET_ACTIVE_TAB', 'relays')\n commit('SET_LOADING', false)\n return\n }\n commit('TOGGLE_TABS', false)\n commit('SET_LOADING', false)\n },\n async RemoveSetting({ commit, getters }, configs) {\n await removeSettings(configs, getters.authHost, getters.token)\n const response = await fetchSettings(getters.authHost, getters.token)\n const { group, key, subkeys } = configs[0]\n commit('SET_SETTINGS', response.data.configs)\n commit('TOGGLE_REBOOT', response.data.need_reboot)\n commit('REMOVE_SETTING_FROM_UPDATED', { group, key, subkeys: subkeys || [] })\n },\n SetActiveTab({ commit }, tab) {\n commit('SET_ACTIVE_TAB', tab)\n },\n async SubmitChanges({ getters, commit, state }) {\n const updatedData = checkPartialUpdate(state.settings, state.updatedSettings, state.description)\n const configs = Object.keys(updatedData).reduce((acc, group) => {\n return [...acc, ...wrapUpdatedSettings(group, updatedData[group], state.settings)]\n }, [])\n\n await updateSettings(configs, getters.authHost, getters.token)\n const response = await fetchSettings(getters.authHost, getters.token)\n commit('SET_SETTINGS', response.data.configs)\n commit('TOGGLE_REBOOT', response.data.need_reboot)\n commit('CLEAR_UPDATED_SETTINGS')\n },\n UpdateSettings({ commit }, { group, key, input, value, type }) {\n key\n ? commit('UPDATE_SETTINGS', { group, key, input, value, type })\n : commit('UPDATE_SETTINGS', { group, key: input, input: '_value', value, type })\n },\n async UpdateState({ commit, getters, state }, { group, key, input, value }) {\n if (key === 'Pleroma.Emails.Mailer' && input === ':adapter') {\n const subkeys = Object.keys(state.settings[group][key]).filter(el => el !== ':adapter')\n await removeSettings([{ group, key, delete: true, subkeys }], getters.authHost, getters.token)\n } else if (key === 'Pleroma.Upload' && input === ':uploader') {\n const deletedKey = value === 'Pleroma.Uploaders.Local' ? 'Pleroma.Uploaders.S3' : 'Pleroma.Uploaders.Local'\n await removeSettings([{ group, key: deletedKey, delete: true }], getters.authHost, getters.token)\n }\n key\n ? commit('UPDATE_STATE', { group, key, input, value })\n : commit('UPDATE_STATE', { group, key: input, input: 'value', value })\n }\n }\n}\n\nexport default settings\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function changeStatusScope(id, sensitive, visibility, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/statuses/${id}`,\n method: 'put',\n headers: authHeaders(token),\n data: { sensitive, visibility }\n })\n}\n\nexport async function deleteStatus(id, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/statuses/${id}`,\n method: 'delete',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchStatus(id, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/statuses/${id}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchStatuses({ godmode, localOnly, authHost, token, pageSize, page }) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/statuses?godmode=${godmode}&local_only=${localOnly}&page=${page}&page_size=${pageSize}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchStatusesCount(instance, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: instance ? `/api/pleroma/admin/stats?instance=${instance}` : `/api/pleroma/admin/stats`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchStatusesByInstance({ instance, authHost, token, pageSize, page }) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/instances/${instance}/statuses?page=${page}&page_size=${pageSize}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { changeStatusScope, deleteStatus, fetchStatus, fetchStatuses, fetchStatusesCount, fetchStatusesByInstance } from '@/api/status'\n\nconst status = {\n state: {\n fetchedStatus: {},\n fetchedStatuses: [],\n loading: false,\n statusAuthor: {},\n statusesByInstance: {\n selectedInstance: '',\n showLocal: false,\n showPrivate: false,\n page: 1,\n pageSize: 20,\n buttonLoading: false,\n allLoaded: false\n },\n statusVisibility: {}\n },\n mutations: {\n CHANGE_GODMODE_CHECKBOX_VALUE: (state, value) => {\n state.statusesByInstance.showPrivate = value\n },\n CHANGE_LOCAL_CHECKBOX_VALUE: (state, value) => {\n state.statusesByInstance.showLocal = value\n },\n CHANGE_PAGE: (state, page) => {\n state.statusesByInstance.page = page\n },\n CHANGE_SELECTED_INSTANCE: (state, instance) => {\n state.statusesByInstance.selectedInstance = instance\n },\n SET_STATUS: (state, status) => {\n state.fetchedStatus = status\n },\n SET_STATUSES_BY_INSTANCE: (state, statuses) => {\n state.fetchedStatuses = statuses\n },\n PUSH_STATUSES: (state, statuses) => {\n state.fetchedStatuses = [...state.fetchedStatuses, ...statuses]\n },\n SET_ALL_LOADED: (state, status) => {\n state.statusesByInstance.allLoaded = status\n },\n SET_BUTTON_LOADING: (state, status) => {\n state.statusesByInstance.buttonLoading = status\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SET_STATUS_VISIBILITY: (state, visibility) => {\n state.statusVisibility = visibility\n },\n SET_STATUS_AUTHOR: (state, user) => {\n state.statusAuthor = user\n }\n },\n actions: {\n async ChangeStatusScope({ dispatch, getters }, { statusId, isSensitive, visibility, reportCurrentPage, userId, godmode, fetchStatusesByInstance }) {\n await changeStatusScope(statusId, isSensitive, visibility, getters.authHost, getters.token)\n if (reportCurrentPage !== 0) { // called from Reports\n dispatch('FetchReports', reportCurrentPage)\n } else if (userId.length > 0) { // called from User profile\n dispatch('FetchUserStatuses', { userId, godmode })\n } else if (fetchStatusesByInstance) { // called from Statuses by Instance\n dispatch('FetchStatusesByInstance')\n } else { // called from Status show page\n dispatch('FetchStatusAfterUserModeration', statusId)\n }\n },\n ClearState({ commit }) {\n commit('CHANGE_SELECTED_INSTANCE', '')\n commit('SET_STATUSES_BY_INSTANCE', [])\n commit('CHANGE_LOCAL_CHECKBOX_VALUE', false)\n commit('CHANGE_GODMODE_CHECKBOX_VALUE', false)\n commit('SET_ALL_LOADED', false)\n commit('CHANGE_PAGE', 1)\n },\n async DeleteStatus({ dispatch, getters }, { statusId, reportCurrentPage, userId, godmode, fetchStatusesByInstance }) {\n await deleteStatus(statusId, getters.authHost, getters.token)\n if (reportCurrentPage !== 0) { // called from Reports\n dispatch('FetchReports', reportCurrentPage)\n } else if (userId.length > 0) { // called from User profile\n dispatch('FetchUserStatuses', { userId, godmode })\n } else if (fetchStatusesByInstance) { // called from Statuses by Instance\n dispatch('FetchStatusesByInstance')\n }\n },\n async FetchStatus({ commit, dispatch, getters, state }, id) {\n commit('SET_LOADING', true)\n const status = await fetchStatus(id, getters.authHost, getters.token)\n\n commit('SET_STATUS', status.data)\n commit('SET_STATUS_AUTHOR', status.data.account)\n commit('SET_LOADING', false)\n dispatch('FetchUserStatuses', { userId: state.fetchedStatus.account.id, godmode: false })\n },\n FetchStatusAfterUserModeration({ commit, dispatch, getters, state }, id) {\n commit('SET_LOADING', true)\n fetchStatus(id, getters.authHost, getters.token)\n .then(status => dispatch('SetStatus', status.data))\n commit('SET_LOADING', false)\n },\n async FetchStatusesCount({ commit, getters }, instance) {\n commit('SET_LOADING', true)\n const { data } = await fetchStatusesCount(instance, getters.authHost, getters.token)\n commit('SET_STATUS_VISIBILITY', data.status_visibility)\n commit('SET_LOADING', false)\n },\n async FetchStatusesByInstance({ commit, dispatch, getters, state, rootState }) {\n commit('SET_LOADING', true)\n dispatch('FetchStatusesCount', state.statusesByInstance.selectedInstance)\n if (state.statusesByInstance.selectedInstance === '') {\n commit('SET_STATUSES_BY_INSTANCE', [])\n } else {\n const statuses = state.statusesByInstance.selectedInstance === rootState.user.authHost\n ? await fetchStatuses(\n {\n godmode: state.statusesByInstance.showPrivate,\n localOnly: state.statusesByInstance.showLocal,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n : await fetchStatusesByInstance(\n {\n instance: state.statusesByInstance.selectedInstance,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n commit('SET_STATUSES_BY_INSTANCE', statuses.data)\n if (statuses.data.length < state.statusesByInstance.pageSize) {\n commit('SET_ALL_LOADED', true)\n }\n }\n commit('SET_LOADING', false)\n },\n async FetchStatusesPageByInstance({ commit, getters, rootState, state }) {\n commit('SET_BUTTON_LOADING', true)\n const statuses = state.statusesByInstance.selectedInstance === rootState.user.authHost\n ? await fetchStatuses(\n {\n godmode: state.statusesByInstance.showPrivate,\n localOnly: state.statusesByInstance.showLocal,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n : await fetchStatusesByInstance(\n {\n instance: state.statusesByInstance.selectedInstance,\n authHost: getters.authHost,\n token: getters.token,\n pageSize: state.statusesByInstance.pageSize,\n page: state.statusesByInstance.page\n })\n commit('PUSH_STATUSES', statuses.data)\n commit('SET_BUTTON_LOADING', false)\n if (statuses.data.length < state.statusesByInstance.pageSize) {\n commit('SET_ALL_LOADED', true)\n }\n },\n HandleGodmodeCheckboxChange({ commit, dispatch }, value) {\n dispatch('HandlePageChange', 1)\n commit('SET_ALL_LOADED', false)\n\n commit('CHANGE_GODMODE_CHECKBOX_VALUE', value)\n dispatch('FetchStatusesByInstance')\n },\n HandleLocalCheckboxChange({ commit, dispatch }, value) {\n dispatch('HandlePageChange', 1)\n commit('SET_ALL_LOADED', false)\n\n commit('CHANGE_LOCAL_CHECKBOX_VALUE', value)\n dispatch('FetchStatusesByInstance')\n },\n HandleFilterChange({ commit }, instance) {\n commit('CHANGE_SELECTED_INSTANCE', instance)\n commit('SET_ALL_LOADED', false)\n },\n HandlePageChange({ commit }, page) {\n commit('CHANGE_PAGE', page)\n },\n SetStatus({ commit }, status) {\n commit('SET_STATUS', status)\n commit('SET_STATUS_AUTHOR', status.account)\n }\n }\n}\n\nexport default status\n","const tagsView = {\n state: {\n visitedViews: [],\n cachedViews: []\n },\n mutations: {\n ADD_VISITED_VIEW: (state, view) => {\n if (state.visitedViews.some(v => v.path === view.path)) return\n state.visitedViews.push(\n Object.assign({}, view, {\n title: view.meta.title || 'no-name'\n })\n )\n },\n ADD_CACHED_VIEW: (state, view) => {\n if (state.cachedViews.includes(view.name)) return\n if (!view.meta.noCache) {\n state.cachedViews.push(view.name)\n }\n },\n\n DEL_VISITED_VIEW: (state, view) => {\n for (const [i, v] of state.visitedViews.entries()) {\n if (v.path === view.path) {\n state.visitedViews.splice(i, 1)\n break\n }\n }\n },\n DEL_CACHED_VIEW: (state, view) => {\n for (const i of state.cachedViews) {\n if (i === view.name) {\n const index = state.cachedViews.indexOf(i)\n state.cachedViews.splice(index, 1)\n break\n }\n }\n },\n\n DEL_OTHERS_VISITED_VIEWS: (state, view) => {\n state.visitedViews = state.visitedViews.filter(v => {\n return v.meta.affix || v.path === view.path\n })\n },\n DEL_OTHERS_CACHED_VIEWS: (state, view) => {\n for (const i of state.cachedViews) {\n if (i === view.name) {\n const index = state.cachedViews.indexOf(i)\n state.cachedViews = state.cachedViews.slice(index, index + 1)\n break\n }\n }\n },\n\n DEL_ALL_VISITED_VIEWS: state => {\n // keep affix tags\n const affixTags = state.visitedViews.filter(tag => tag.meta.affix)\n state.visitedViews = affixTags\n },\n DEL_ALL_CACHED_VIEWS: state => {\n state.cachedViews = []\n },\n\n UPDATE_VISITED_VIEW: (state, view) => {\n for (let v of state.visitedViews) {\n if (v.path === view.path) {\n v = Object.assign(v, view)\n break\n }\n }\n }\n\n },\n actions: {\n addView({ dispatch }, view) {\n dispatch('addVisitedView', view)\n dispatch('addCachedView', view)\n },\n addVisitedView({ commit }, view) {\n commit('ADD_VISITED_VIEW', view)\n },\n addCachedView({ commit }, view) {\n commit('ADD_CACHED_VIEW', view)\n },\n\n delView({ dispatch, state }, view) {\n return new Promise(resolve => {\n dispatch('delVisitedView', view)\n dispatch('delCachedView', view)\n resolve({\n visitedViews: [...state.visitedViews],\n cachedViews: [...state.cachedViews]\n })\n })\n },\n delVisitedView({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_VISITED_VIEW', view)\n resolve([...state.visitedViews])\n })\n },\n delCachedView({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_CACHED_VIEW', view)\n resolve([...state.cachedViews])\n })\n },\n\n delOthersViews({ dispatch, state }, view) {\n return new Promise(resolve => {\n dispatch('delOthersVisitedViews', view)\n dispatch('delOthersCachedViews', view)\n resolve({\n visitedViews: [...state.visitedViews],\n cachedViews: [...state.cachedViews]\n })\n })\n },\n delOthersVisitedViews({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_OTHERS_VISITED_VIEWS', view)\n resolve([...state.visitedViews])\n })\n },\n delOthersCachedViews({ commit, state }, view) {\n return new Promise(resolve => {\n commit('DEL_OTHERS_CACHED_VIEWS', view)\n resolve([...state.cachedViews])\n })\n },\n\n delAllViews({ dispatch, state }, view) {\n return new Promise(resolve => {\n dispatch('delAllVisitedViews', view)\n dispatch('delAllCachedViews', view)\n resolve({\n visitedViews: [...state.visitedViews],\n cachedViews: [...state.cachedViews]\n })\n })\n },\n delAllVisitedViews({ commit, state }) {\n return new Promise(resolve => {\n commit('DEL_ALL_VISITED_VIEWS')\n resolve([...state.visitedViews])\n })\n },\n delAllCachedViews({ commit, state }) {\n return new Promise(resolve => {\n commit('DEL_ALL_CACHED_VIEWS')\n resolve([...state.cachedViews])\n })\n },\n\n updateVisitedView({ commit }, view) {\n commit('UPDATE_VISITED_VIEW', view)\n }\n }\n}\n\nexport default tagsView\n","import request from '@/utils/request'\nimport { baseName } from './utils'\n\nexport async function loginByUsername(username, password, authHost) {\n const appsRequest = await request({\n baseURL: baseName(authHost),\n url: '/api/v1/apps',\n method: 'post',\n data: {\n client_name: `AdminFE_${Math.random()}`,\n redirect_uris: `${window.location.origin}/oauth-callback`,\n scopes: 'read write follow push admin'\n }\n })\n\n const app = appsRequest.data\n\n return request({\n baseURL: baseName(authHost),\n url: '/oauth/token',\n method: 'post',\n data: {\n client_id: app.client_id,\n client_secret: app.client_secret,\n grant_type: 'password',\n username: username,\n password: password\n }\n })\n}\n\nexport function getUserInfo(token, authHost) {\n return request({\n baseURL: baseName(authHost),\n url: '/api/v1/accounts/verify_credentials',\n method: 'get',\n headers: token ? { 'Authorization': `Bearer ${token}` } : {}\n })\n}\n\nconst oauth = { loginByUsername, getUserInfo }\n\nexport default oauth\n","import request from '@/utils/request'\nimport { baseName } from './utils'\n\nexport async function getNodeInfo(authHost) {\n return await request({\n baseURL: baseName(authHost),\n url: `/nodeinfo/2.0.json`,\n method: 'get'\n })\n}\n","import { loginByUsername, getUserInfo } from '@/api/login'\nimport { getNodeInfo } from '@/api/nodeInfo'\nimport { getToken, setToken, removeToken, getAuthHost, setAuthHost, removeAuthHost } from '@/utils/auth'\n\nconst user = {\n state: {\n user: '',\n id: '',\n status: '',\n code: '',\n token: getToken(),\n authHost: getAuthHost(),\n name: '',\n avatar: '',\n introduction: '',\n roles: [],\n setting: {\n articlePlatform: []\n },\n nodeInfo: {}\n },\n\n mutations: {\n SET_CODE: (state, code) => {\n state.code = code\n },\n SET_TOKEN: (state, token) => {\n state.token = token\n },\n SET_INTRODUCTION: (state, introduction) => {\n state.introduction = introduction\n },\n SET_SETTING: (state, setting) => {\n state.setting = setting\n },\n SET_STATUS: (state, status) => {\n state.status = status\n },\n SET_NAME: (state, name) => {\n state.name = name\n },\n SET_AVATAR: (state, avatar) => {\n state.avatar = avatar\n },\n SET_ROLES: (state, roles) => {\n state.roles = roles\n },\n SET_ID: (state, id) => {\n state.id = id\n },\n SET_AUTH_HOST: (state, authHost) => {\n state.authHost = authHost\n },\n SET_NODE_INFO: (state, nodeInfo) => {\n state.nodeInfo = nodeInfo\n }\n },\n\n actions: {\n LoginByUsername({ commit, dispatch }, { username, authHost, password }) {\n return new Promise((resolve, reject) => {\n loginByUsername(username, password, authHost).then(response => {\n const data = response.data\n commit('SET_TOKEN', data.access_token)\n commit('SET_AUTH_HOST', authHost)\n setToken(data.access_token)\n setAuthHost(authHost)\n resolve()\n }).catch(error => {\n dispatch('addErrorLog', { message: error.message })\n reject(error)\n })\n })\n },\n async GetNodeInfo({ commit, dispatch, state }) {\n const nodeInfo = await getNodeInfo(state.authHost)\n\n commit('SET_NODE_INFO', nodeInfo.data)\n dispatch('SetInvitesEnabled', nodeInfo.data.metadata.invitesEnabled)\n },\n GetUserInfo({ commit, state }) {\n return new Promise((resolve, reject) => {\n getUserInfo(state.token, state.authHost).then(response => {\n const data = response.data\n const message = 'This user doesn\\`t have admin rights. Try another credentials or see the ' +\n 'docs' +\n ' to find out how to make this user an admin'\n\n if (!data) {\n reject('Verification failed, please login again.')\n }\n\n if (data.pleroma && data.pleroma.is_admin) {\n commit('SET_ROLES', ['admin'])\n } else {\n reject(message)\n }\n\n commit('SET_NAME', data.username)\n commit('SET_ID', data.id)\n commit('SET_AVATAR', data.avatar)\n commit('SET_INTRODUCTION', '')\n resolve(response)\n }).catch(error => {\n reject(error)\n })\n })\n },\n LogOut({ commit }) {\n commit('SET_TOKEN', '')\n commit('SET_ROLES', [])\n removeToken()\n removeAuthHost()\n },\n FedLogOut({ commit }) {\n return new Promise(resolve => {\n commit('SET_TOKEN', '')\n removeToken()\n removeAuthHost()\n resolve()\n })\n },\n async LoginByPleromaFE({ commit, dispatch }, { token }) {\n commit('SET_TOKEN', token)\n setToken(token)\n commit('SET_AUTH_HOST', window.location.host)\n setAuthHost(window.location.host)\n\n dispatch('GetUserInfo')\n }\n }\n}\n\nexport default user\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function activateUsers(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/activate`,\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function addRight(nicknames, right, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/permission_group/${right}`,\n method: 'post',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function createNewAccount(nickname, email, password, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users',\n method: 'post',\n headers: authHeaders(token),\n data: { users: [{ nickname, email, password }] }\n })\n}\n\nexport async function deactivateUsers(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/deactivate`,\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function deleteRight(nicknames, right, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/permission_group/${right}`,\n method: 'delete',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function deleteUsers(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users`,\n method: 'delete',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function fetchUser(id, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${id}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function fetchUserCredentials(nickname, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${nickname}/credentials`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function updateUserCredentials(nickname, credentials, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${nickname}/credentials`,\n method: 'patch',\n headers: authHeaders(token),\n data: credentials\n })\n}\n\nexport async function fetchUsers(filters, authHost, token, page = 1) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?page=${page}&filters=${filters}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function getPasswordResetToken(nickname, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${nickname}/password_reset`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function forcePasswordReset(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/force_password_reset`,\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function searchUsers(query, filters, authHost, token, page = 1) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users?query=${query}&page=${page}&filters=${filters}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function tagUser(nicknames, tags, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/tag',\n method: 'put',\n headers: authHeaders(token),\n data: { nicknames, tags }\n })\n}\n\nexport async function untagUser(nicknames, tags, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/tag',\n method: 'delete',\n headers: authHeaders(token),\n data: { nicknames, tags }\n })\n}\n\nexport async function fetchUserStatuses(id, authHost, godmode, token) {\n return await request({\n baseURL: baseName(authHost),\n url: `/api/pleroma/admin/users/${id}/statuses?godmode=${godmode}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function confirmUserEmail(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/confirm_email',\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nexport async function resendConfirmationEmail(nicknames, authHost, token) {\n return await request({\n baseURL: baseName(authHost),\n url: '/api/pleroma/admin/users/resend_confirmation_email',\n method: 'patch',\n headers: authHeaders(token),\n data: { nicknames }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import { fetchUser, fetchUserStatuses, fetchUserCredentials, updateUserCredentials } from '@/api/users'\n\nconst userProfile = {\n state: {\n statuses: [],\n statusesLoading: true,\n user: {},\n userCredentials: {},\n userProfileLoading: true\n },\n mutations: {\n SET_STATUSES: (state, statuses) => {\n state.statuses = statuses\n },\n SET_STATUSES_LOADING: (state, status) => {\n state.statusesLoading = status\n },\n SET_USER: (state, user) => {\n state.user = user\n },\n SET_USER_PROFILE_LOADING: (state, status) => {\n state.userProfileLoading = status\n },\n SET_USER_CREDENTIALS: (state, userCredentials) => {\n state.userCredentials = userCredentials\n }\n },\n actions: {\n async FetchUserProfile({ commit, dispatch, getters }, { userId, godmode }) {\n commit('SET_USER_PROFILE_LOADING', true)\n\n const userResponse = await fetchUser(userId, getters.authHost, getters.token)\n commit('SET_USER', userResponse.data)\n commit('SET_USER_PROFILE_LOADING', false)\n\n dispatch('FetchUserStatuses', { userId, godmode })\n },\n FetchUserStatuses({ commit, dispatch, getters }, { userId, godmode }) {\n commit('SET_STATUSES_LOADING', true)\n\n fetchUserStatuses(userId, getters.authHost, godmode, getters.token)\n .then(statuses => dispatch('SetStatuses', statuses.data))\n\n commit('SET_STATUSES_LOADING', false)\n },\n async FetchUserCredentials({ commit, getters }, { nickname }) {\n const userResponse = await fetchUserCredentials(nickname, getters.authHost, getters.token)\n commit('SET_USER_CREDENTIALS', userResponse.data)\n },\n SetStatuses({ commit }, statuses) {\n commit('SET_STATUSES', statuses)\n },\n async UpdateUserCredentials({ dispatch, getters }, { nickname, credentials }) {\n await updateUserCredentials(nickname, credentials, getters.authHost, getters.token)\n dispatch('FetchUserCredentials', { nickname })\n }\n }\n}\n\nexport default userProfile\n","import { Message } from 'element-ui'\nimport i18n from '@/lang'\nimport {\n activateUsers,\n addRight,\n createNewAccount,\n deactivateUsers,\n deleteRight,\n deleteUsers,\n fetchUsers,\n getPasswordResetToken,\n searchUsers,\n tagUser,\n untagUser,\n forcePasswordReset,\n confirmUserEmail,\n resendConfirmationEmail\n} from '@/api/users'\n\nconst users = {\n state: {\n fetchedUsers: [],\n loading: true,\n searchQuery: '',\n totalUsersCount: 0,\n currentPage: 1,\n pageSize: 50,\n filters: {\n local: false,\n external: false,\n active: false,\n deactivated: false\n },\n passwordResetToken: {\n token: '',\n link: ''\n }\n },\n mutations: {\n SET_USERS: (state, users) => {\n state.fetchedUsers = users\n },\n SET_LOADING: (state, status) => {\n state.loading = status\n },\n SWAP_USERS: (state, users) => {\n const usersWithoutSwapped = users.reduce((acc, user) => {\n return acc.filter(u => u.id !== user.id)\n }, state.fetchedUsers)\n\n if (state.fetchedUsers.length === 0) {\n return\n }\n\n const updatedUsers = [...usersWithoutSwapped, ...users]\n state.fetchedUsers = updatedUsers\n .filter(user => user.nickname && user.id)\n .sort((a, b) => a.nickname.localeCompare(b.nickname))\n .concat(updatedUsers.filter(user => !user.nickname || !user.id))\n },\n SET_COUNT: (state, count) => {\n state.totalUsersCount = count\n },\n SET_PAGE: (state, page) => {\n state.currentPage = page\n },\n SET_PAGE_SIZE: (state, pageSize) => {\n state.pageSize = pageSize\n },\n SET_PASSWORD_RESET_TOKEN: (state, { token, link }) => {\n state.passwordResetToken.token = token\n state.passwordResetToken.link = link\n },\n SET_SEARCH_QUERY: (state, query) => {\n state.searchQuery = query\n },\n SET_USERS_FILTERS: (state, filters) => {\n state.filters = filters\n }\n },\n actions: {\n async ActivateUsers({ dispatch, getters }, { users, _userId }) {\n const updatedUsers = users.map(user => {\n return { ...user, deactivated: false }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await activateUsers(nicknames, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async ApplyChanges({ commit, dispatch, state }, { updatedUsers, callApiFn, userId, statusId }) {\n commit('SWAP_USERS', updatedUsers)\n\n try {\n await callApiFn()\n } catch (_e) {\n return\n } finally {\n dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })\n }\n if (statusId) {\n dispatch('FetchStatusAfterUserModeration', statusId)\n } else if (userId) {\n dispatch('FetchUserProfile', { userId, godmode: false })\n }\n dispatch('SuccessMessage')\n },\n async AddRight({ dispatch, getters }, { users, right, _userId, _statusId }) {\n const updatedUsers = users.map(user => {\n return user.local ? { ...user, roles: { ...user.roles, [right]: true }} : user\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await addRight(nicknames, right, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId, statusId: _statusId })\n },\n async AddTag({ dispatch, getters }, { users, tag, _userId, _statusId }) {\n const updatedUsers = users.map(user => {\n return { ...user, tags: [...user.tags, tag] }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await tagUser(nicknames, [tag], getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId, statusId: _statusId })\n },\n ClearUsersState({ commit }) {\n commit('SET_SEARCH_QUERY', '')\n commit('SET_USERS_FILTERS', { local: false, external: false, active: false, deactivated: false })\n },\n async ClearFilters({ commit, dispatch, state }) {\n commit('CLEAR_USERS_FILTERS')\n dispatch('SearchUsers', { query: state.searchQuery, page: 1 })\n },\n async CreateNewAccount({ dispatch, getters, state }, { nickname, email, password }) {\n try {\n await createNewAccount(nickname, email, password, getters.authHost, getters.token)\n } catch (_e) {\n return\n } finally {\n dispatch('SearchUsers', { query: state.searchQuery, page: state.currentPage })\n }\n dispatch('SuccessMessage')\n },\n async DeactivateUsers({ dispatch, getters }, { users, _userId }) {\n const updatedUsers = users.map(user => {\n return { ...user, deactivated: true }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await deactivateUsers(nicknames, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId })\n },\n async ConfirmUsersEmail({ dispatch, getters }, { users, _userId, _statusId }) {\n const updatedUsers = users.map(user => {\n return { ...user, confirmation_pending: false }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await confirmUserEmail(nicknames, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId, statusId: _statusId })\n },\n async ResendConfirmationEmail({ dispatch, getters }, users) {\n const usersNicknames = users.map(user => user.nickname)\n try {\n await resendConfirmationEmail(usersNicknames, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n dispatch('SuccessMessage')\n },\n async DeleteRight({ dispatch, getters }, { users, right, _userId, _statusId }) {\n const updatedUsers = users.map(user => {\n return user.local ? { ...user, roles: { ...user.roles, [right]: false }} : user\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await deleteRight(nicknames, right, getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId, statusId: _statusId })\n },\n async DeleteUsers({ commit, dispatch, getters, state }, { users, _userId }) {\n const usersNicknames = users.map(user => user.nickname)\n try {\n await deleteUsers(usersNicknames, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n const deletedUsersIds = users.map(deletedUser => deletedUser.id)\n const updatedUsers = state.fetchedUsers.filter(user => !deletedUsersIds.includes(user.id))\n commit('SET_USERS', updatedUsers)\n\n dispatch('FetchUserProfile', { userId: _userId, godmode: false })\n dispatch('SuccessMessage')\n },\n async FetchUsers({ commit, dispatch, getters, state }, { page }) {\n commit('SET_LOADING', true)\n const filters = Object.keys(state.filters).filter(filter => state.filters[filter]).join()\n const response = await fetchUsers(filters, getters.authHost, getters.token, page)\n await dispatch('GetNodeInfo')\n loadUsers(commit, page, response.data)\n },\n async GetPasswordResetToken({ commit, getters }, nickname) {\n const { data } = await getPasswordResetToken(nickname, getters.authHost, getters.token)\n commit('SET_PASSWORD_RESET_TOKEN', data)\n },\n RemovePasswordToken({ commit }) {\n commit('SET_PASSWORD_RESET_TOKEN', { link: '', token: '' })\n },\n async RemoveTag({ dispatch, getters }, { users, tag, _userId, _statusId }) {\n const updatedUsers = users.map(user => {\n return { ...user, tags: user.tags.filter(userTag => userTag !== tag) }\n })\n const nicknames = users.map(user => user.nickname)\n const callApiFn = async() => await untagUser(nicknames, [tag], getters.authHost, getters.token)\n\n dispatch('ApplyChanges', { updatedUsers, callApiFn, userId: _userId, statusId: _statusId })\n },\n async RequirePasswordReset({ dispatch, getters }, users) {\n const nicknames = users.map(user => user.nickname)\n try {\n await forcePasswordReset(nicknames, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n dispatch('SuccessMessage')\n },\n async SearchUsers({ commit, dispatch, state, getters }, { query, page }) {\n if (query.length === 0) {\n commit('SET_SEARCH_QUERY', query)\n dispatch('FetchUsers', { page })\n } else {\n commit('SET_LOADING', true)\n commit('SET_SEARCH_QUERY', query)\n\n const filters = Object.keys(state.filters).filter(filter => state.filters[filter]).join()\n const response = await searchUsers(query, filters, getters.authHost, getters.token, page)\n\n loadUsers(commit, page, response.data)\n }\n },\n SuccessMessage() {\n Message.success({\n message: i18n.t('users.completed'),\n duration: 5 * 1000\n })\n },\n async ToggleUsersFilter({ commit, dispatch, state }, filters) {\n const defaultFilters = {\n local: false,\n external: false,\n active: false,\n deactivated: false\n }\n const currentFilters = { ...defaultFilters, ...filters }\n commit('SET_USERS_FILTERS', currentFilters)\n dispatch('SearchUsers', { query: state.searchQuery, page: 1 })\n }\n }\n}\n\nconst loadUsers = (commit, page, { users, count, page_size }) => {\n commit('SET_USERS', users)\n commit('SET_COUNT', count)\n commit('SET_PAGE', page)\n commit('SET_PAGE_SIZE', page_size)\n commit('SET_LOADING', false)\n}\n\nexport default users\n","const getters = {\n sidebar: state => state.app.sidebar,\n language: state => state.app.language,\n size: state => state.app.size,\n device: state => state.app.device,\n visitedViews: state => state.tagsView.visitedViews,\n cachedViews: state => state.tagsView.cachedViews,\n token: state => state.user.token,\n avatar: state => state.user.avatar,\n name: state => state.user.name,\n introduction: state => state.user.introduction,\n status: state => state.user.status,\n roles: state => state.user.roles,\n setting: state => state.user.setting,\n permission_routers: state => state.permission.routers,\n addRouters: state => state.permission.addRouters,\n errorLogs: state => state.errorLog.logs,\n users: state => state.users.fetchedUsers,\n authHost: state => state.user.authHost,\n settings: state => state.settings\n}\nexport default getters\n","import {\n addNewEmojiFile,\n createPack,\n deleteEmojiFile,\n deletePack,\n downloadFrom,\n importFromFS,\n listPacks,\n listRemotePacks,\n reloadEmoji,\n savePackMetadata,\n updateEmojiFile\n} from '@/api/emojiPacks'\nimport i18n from '@/lang'\nimport { Message } from 'element-ui'\n\nimport Vue from 'vue'\n\nconst packs = {\n state: {\n activeCollapseItems: [],\n localPacks: {},\n remoteInstance: '',\n remotePacks: {}\n },\n mutations: {\n SET_ACTIVE_COLLAPSE_ITEMS: (state, items) => {\n state.activeCollapseItems = items\n },\n SET_LOCAL_PACKS: (state, packs) => {\n state.localPacks = packs\n },\n SET_REMOTE_INSTANCE: (state, name) => {\n state.remoteInstance = name\n },\n SET_REMOTE_PACKS: (state, packs) => {\n state.remotePacks = packs\n },\n UPDATE_LOCAL_PACK_VAL: (state, { name, key, value }) => {\n Vue.set(state.localPacks[name]['pack'], key, value)\n },\n UPDATE_LOCAL_PACK_PACK: (state, { name, pack }) => {\n state.localPacks[name]['pack'] = pack\n },\n UPDATE_LOCAL_PACK_FILES: (state, { name, files }) => {\n // Use vue.set in case \"files\" was null\n Vue.set(\n state.localPacks[name],\n 'files',\n files\n )\n }\n },\n actions: {\n async AddNewEmojiFile({ commit, getters }, { packName, file, shortcode, filename }) {\n let result\n try {\n result = await addNewEmojiFile(packName, file, shortcode, filename, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n Message({\n message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,\n type: 'success',\n duration: 5 * 1000\n })\n\n commit('UPDATE_LOCAL_PACK_FILES', { name: packName, files: result.data })\n },\n async DeleteEmojiFile({ commit, getters }, { packName, shortcode }) {\n let result\n try {\n result = await deleteEmojiFile(packName, shortcode, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n Message({\n message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,\n type: 'success',\n duration: 5 * 1000\n })\n\n commit('UPDATE_LOCAL_PACK_FILES', { name: packName, files: result.data })\n },\n async CreatePack({ getters }, { name }) {\n await createPack(getters.authHost, getters.token, name)\n },\n async DeletePack({ getters }, { name }) {\n await deletePack(getters.authHost, getters.token, name)\n },\n async DownloadFrom({ getters }, { instanceAddress, packName, as }) {\n const result = await downloadFrom(getters.authHost, instanceAddress, packName, as, getters.token)\n\n if (result.data === 'ok') {\n Message({\n message: `${i18n.t('settings.successfullyDownloaded')} ${packName}`,\n type: 'success',\n duration: 5 * 1000\n })\n }\n },\n async ImportFromFS({ getters }) {\n const result = await importFromFS(getters.authHost, getters.token)\n\n if (result.status === 200) {\n const message = result.data.length > 0\n ? `${i18n.t('settings.successfullyImported')} ${result.data}`\n : i18n.t('settings.nowNewPacksToImport')\n\n Message({\n message,\n type: 'success',\n duration: 5 * 1000\n })\n }\n },\n async ReloadEmoji({ getters }) {\n await reloadEmoji(getters.authHost, getters.token)\n },\n async SavePackMetadata({ commit, getters, state }, { packName }) {\n const result =\n await savePackMetadata(\n getters.authHost,\n getters.token,\n packName,\n state.localPacks[packName]['pack']\n )\n\n if (result.status === 200) {\n Message({\n message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,\n type: 'success',\n duration: 5 * 1000\n })\n\n commit('UPDATE_LOCAL_PACK_PACK', { name: packName, pack: result.data })\n }\n },\n SetActiveCollapseItems({ commit, state }, activeItems) {\n commit('SET_ACTIVE_COLLAPSE_ITEMS', activeItems)\n },\n async SetLocalEmojiPacks({ commit, getters }) {\n const { data } = await listPacks(getters.authHost)\n commit('SET_LOCAL_PACKS', data)\n },\n async SetRemoteEmojiPacks({ commit, getters }, { remoteInstance }) {\n const { data } = await listRemotePacks(getters.authHost, getters.token, remoteInstance)\n\n commit('SET_REMOTE_INSTANCE', remoteInstance)\n commit('SET_REMOTE_PACKS', data)\n },\n SetRemoteInstance({ commit }, instance) {\n commit('SET_REMOTE_INSTANCE', instance)\n },\n async UpdateEmojiFile({ commit, getters }, { packName, shortcode, newShortcode, newFilename, force }) {\n let result\n try {\n result = await updateEmojiFile(packName, shortcode, newShortcode, newFilename, force, getters.authHost, getters.token)\n } catch (_e) {\n return\n }\n Message({\n message: `${i18n.t('settings.successfullyUpdated')} ${packName} ${i18n.t('settings.metadatLowerCase')}`,\n type: 'success',\n duration: 5 * 1000\n })\n\n commit('UPDATE_LOCAL_PACK_FILES', { name: packName, files: result.data })\n },\n async UpdateLocalPackVal({ commit }, args) {\n commit('UPDATE_LOCAL_PACK_VAL', args)\n }\n }\n}\n\nexport default packs\n","import Vue from 'vue'\nimport Vuex from 'vuex'\nimport app from './modules/app'\nimport errorLog from './modules/errorLog'\nimport moderationLog from './modules/moderationLog'\nimport invites from './modules/invites'\nimport peers from './modules/peers'\nimport permission from './modules/permission'\nimport relays from './modules/relays'\nimport reports from './modules/reports'\nimport settings from './modules/settings'\nimport status from './modules/status'\nimport tagsView from './modules/tagsView'\nimport user from './modules/user'\nimport userProfile from './modules/userProfile'\nimport users from './modules/users'\nimport getters from './getters'\nimport emojiPacks from './modules/emojiPacks.js'\n\nVue.use(Vuex)\n\nconst store = new Vuex.Store({\n modules: {\n app,\n errorLog,\n moderationLog,\n invites,\n peers,\n permission,\n relays,\n reports,\n settings,\n status,\n tagsView,\n user,\n userProfile,\n users,\n emojiPacks\n },\n getters\n})\n\nexport default store\n","import Vue from 'vue'\nimport SvgIcon from '@/components/element-ui/SvgIcon'// svg组件\n\n// register globally\nVue.component('svg-icon', SvgIcon)\n\nconst req = require.context('./svg', false, /\\.svg$/)\nconst requireAll = requireContext => requireContext.keys().map(requireContext)\nrequireAll(req)\n","import Vue from 'vue'\nimport store from './store'\n\n// you can set only in production env show the error-log\nif (process.env.NODE_ENV === 'production') {\n Vue.config.errorHandler = function(err, vm, info, a) {\n // Don't ask me why I use Vue.nextTick, it just a hack.\n // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500\n Vue.nextTick(() => {\n store.dispatch('addErrorLog', {\n err,\n vm,\n info,\n url: window.location.href\n })\n console.error(err, info)\n })\n }\n}\n","import router from './router'\nimport store from './store'\nimport { Message } from 'element-ui'\nimport NProgress from 'nprogress' // progress bar\nimport 'nprogress/nprogress.css'// progress bar style\nimport { getToken } from '@/utils/auth' // getToken from cookie\n\nNProgress.configure({ showSpinner: false })// NProgress Configuration\n\n// permission judge function\nfunction hasPermission(roles, permissionRoles) {\n if (roles.indexOf('admin') >= 0) return true // admin permission passed directly\n if (!permissionRoles) return true\n return roles.some(role => permissionRoles.indexOf(role) >= 0)\n}\n\nconst whiteList = ['/login', '/auth-redirect', '/login-pleroma']// no redirect whitelist\n\nexport const beforeEachRoute = (to, from, next) => {\n NProgress.start() // start progress bar\n if (getToken()) { // determine if there has token\n /* has token*/\n if (to.path === '/login') {\n next({ path: '/' })\n NProgress.done() // if current page is dashboard will not trigger\tafterEach hook, so manually handle it\n } else {\n if (store.getters.roles.length === 0) {\n store.dispatch('GetUserInfo').then(res => {\n const roles = res.data.pleroma.is_admin ? ['admin'] : []\n store.dispatch('GenerateRoutes', { roles }).then(() => {\n router.addRoutes(store.getters.addRouters)\n next({ ...to, replace: true })\n })\n }).catch((err) => {\n store.dispatch('FedLogOut').then(() => {\n Message({\n dangerouslyUseHTMLString: true,\n message: err,\n type: 'error',\n duration: 10 * 1000\n })\n next({ path: '/' })\n })\n })\n } else {\n if (hasPermission(store.getters.roles, to.meta.roles)) {\n next()\n } else {\n next({ path: '/401', replace: true, query: { noGoBack: true }})\n }\n }\n }\n } else {\n /* has no token*/\n if (whiteList.indexOf(to.path) !== -1) {\n next()\n } else {\n next(`/login?redirect=${to.path}`)\n NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it\n }\n }\n}\nrouter.beforeEach(beforeEachRoute)\n\nrouter.afterEach(() => {\n NProgress.done() // finish progress bar\n})\n","// set function parseTime,formatTime to filter\nexport { parseTime, formatTime } from '@/utils'\n\nfunction pluralize(time, label) {\n if (time === 1) {\n return time + label\n }\n return time + label + 's'\n}\n\nexport function timeAgo(time) {\n const between = Date.now() / 1000 - Number(time)\n if (between < 3600) {\n return pluralize(~~(between / 60), ' minute')\n } else if (between < 86400) {\n return pluralize(~~(between / 3600), ' hour')\n } else {\n return pluralize(~~(between / 86400), ' day')\n }\n}\n\n/* 数字 格式化*/\nexport function numberFormatter(num, digits) {\n const si = [\n { value: 1E18, symbol: 'E' },\n { value: 1E15, symbol: 'P' },\n { value: 1E12, symbol: 'T' },\n { value: 1E9, symbol: 'G' },\n { value: 1E6, symbol: 'M' },\n { value: 1E3, symbol: 'k' }\n ]\n for (let i = 0; i < si.length; i++) {\n if (num >= si[i].value) {\n return (num / si[i].value + 0.1).toFixed(digits).replace(/\\.0+$|(\\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol\n }\n }\n return num.toString()\n}\n\nexport function toThousandFilter(num) {\n return (+num || 0).toString().replace(/^-?\\d+/g, m => m.replace(/(?=(?!\\b)(\\d{3})+$)/g, ','))\n}\n","import Vue from 'vue'\n\nimport Cookies from 'js-cookie'\n\nimport 'normalize.css/normalize.css' // A modern alternative to CSS resets\n\nimport Element from 'element-ui'\nimport 'element-ui/lib/theme-chalk/index.css'\n\nimport '@/styles/index.scss' // global css\n\nimport App from './App'\nimport store from './store'\nimport router from './router'\n\nimport i18n from './lang' // Internationalization\nimport './icons' // icon\nimport './errorLog' // error log\nimport './permission' // permission control\n\nimport * as filters from './filters' // global filters\n\nVue.use(Element, {\n size: Cookies.get('size') || 'medium', // set element-ui default size\n i18n: (key, value) => i18n.t(key, value)\n})\n\n// register global utility filters.\nObject.keys(filters).forEach(key => {\n Vue.filter(key, filters[key])\n})\n\nVue.config.productionTip = false\n\nnew Vue({\n el: '#app',\n router,\n store,\n i18n,\n render: h => h(App)\n})\n","import Cookies from 'js-cookie'\n\nconst TokenKey = 'Admin-Token'\nconst AuthHostKey = 'Auth-Host'\n\nexport function getToken() {\n return Cookies.get(TokenKey)\n}\n\nexport function setToken(token) {\n return Cookies.set(TokenKey, token)\n}\n\nexport function removeToken() {\n return Cookies.remove(TokenKey)\n}\n\nexport function getAuthHost() {\n return Cookies.get(AuthHostKey)\n}\n\nexport function setAuthHost(token) {\n return Cookies.set(AuthHostKey, token)\n}\n\nexport function removeAuthHost() {\n return Cookies.remove(AuthHostKey)\n}\n","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=1&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TagsView.vue?vue&type=style&index=1&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=style&index=0&id=f852c4f2&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppMain.vue?vue&type=style&index=0&id=f852c4f2&scoped=true&lang=css&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-excel\",\n \"use\": \"icon-excel-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-guide\",\n \"use\": \"icon-guide-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-star\",\n \"use\": \"icon-star-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=style&index=0&id=28de7ff2&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Navbar.vue?vue&type=style&index=0&id=28de7ff2&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-wechat\",\n \"use\": \"icon-wechat-usage\",\n \"viewBox\": \"0 0 128 110\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import _ from 'lodash'\n\nexport const getBooleanValue = value => {\n if (value === 'true') {\n return true\n } else if (value === 'false') {\n return false\n }\n return value\n}\n\nexport const checkPartialUpdate = (settings, updatedSettings, description) => {\n return Object.keys(updatedSettings).reduce((acc, group) => {\n acc[group] = Object.keys(updatedSettings[group]).reduce((acc, key) => {\n if (!partialUpdate(group, key)) {\n const updated = Object.keys(settings[group][key]).reduce((acc, settingName) => {\n const setting = description\n .find(element => element.group === group && element.key === key).children\n .find(child => child.key === settingName)\n const type = setting ? setting.type : ''\n acc[settingName] = [type, settings[group][key][settingName]]\n return acc\n }, {})\n acc[key] = updated\n return acc\n }\n acc[key] = updatedSettings[group][key]\n return acc\n }, {})\n return acc\n }, {})\n}\n\nconst getCurrentValue = (type, value, path) => {\n if (type === 'state') {\n return _.get(value, path)\n } else {\n const [firstSettingName, ...restKeys] = path\n const firstSegment = value[firstSettingName]\n if (restKeys.length === 0 || !firstSegment) {\n return firstSegment || false\n } else {\n const secondSegment = (value, keys) => {\n const [element, ...rest] = keys\n return keys.length === 0 ? value : secondSegment(value[1][element], rest)\n }\n return secondSegment(firstSegment, restKeys)\n }\n }\n}\n\nconst getValueWithoutKey = (key, [type, value]) => {\n if (type === 'atom' && value.length > 1) {\n return `:${value}`\n } else if (key === ':backends') {\n const index = value.findIndex(el => el === ':ex_syslogger')\n const updatedArray = value.slice()\n if (index !== -1) {\n updatedArray[index] = { 'tuple': ['ExSyslogger', ':ex_syslogger'] }\n }\n return updatedArray\n } else if (key === ':types') {\n return Object.keys(value).reduce((acc, key) => { return { ...acc, [key]: value[key][1] } }, {})\n }\n return value\n}\n\nexport const parseNonTuples = (key, value) => {\n if (key === ':backends') {\n const index = value.findIndex(el => typeof el === 'object' && el.tuple.includes(':ex_syslogger'))\n const updated = value.map((el, i) => i === index ? ':ex_syslogger' : el)\n return updated\n }\n if (key === ':args') {\n if (typeof value === 'string') {\n return [value]\n }\n const index = value.findIndex(el => typeof el === 'object' && el.tuple.includes('implode'))\n const updated = value.map((el, i) => i === index ? 'implode' : el)\n return updated\n }\n return value\n}\n// REFACTOR\nexport const parseTuples = (tuples, key) => {\n return tuples.reduce((accum, item) => {\n if (key === ':rate_limit') {\n accum[item.tuple[0]] = Array.isArray(item.tuple[1])\n ? item.tuple[1].map(el => el.tuple)\n : item.tuple[1].tuple\n } else if (item.tuple[0] === ':mascots') {\n accum[item.tuple[0]] = item.tuple[1].reduce((acc, mascot) => {\n return [...acc, { [mascot.tuple[0]]: { ...mascot.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}]\n }, [])\n } else if (Array.isArray(item.tuple[1]) &&\n (item.tuple[0] === ':groups' || item.tuple[0] === ':replace' || item.tuple[0] === ':retries')) {\n accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => {\n return [...acc, { [group.tuple[0]]: { value: group.tuple[1], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}]\n }, [])\n } else if (item.tuple[0] === ':crontab') {\n accum[item.tuple[0]] = item.tuple[1].reduce((acc, group) => {\n return { ...acc, [group.tuple[1]]: group.tuple[0] }\n }, {})\n } else if (item.tuple[0] === ':match_actor') {\n accum[item.tuple[0]] = Object.keys(item.tuple[1]).reduce((acc, regex) => {\n return [...acc, { [regex]: { value: item.tuple[1][regex], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }}]\n }, [])\n } else if (item.tuple[0] === ':icons') {\n accum[item.tuple[0]] = item.tuple[1].map(icon => {\n return Object.keys(icon).map(name => {\n return { key: name, value: icon[name], id: `f${(~~(Math.random() * 1e8)).toString(16)}` }\n })\n }, [])\n } else if (item.tuple[0] === ':prune') {\n accum[item.tuple[0]] = item.tuple[1] === ':disabled' ? [item.tuple[1]] : item.tuple[1].tuple\n } else if (item.tuple[0] === ':proxy_url') {\n accum[item.tuple[0]] = parseProxyUrl(item.tuple[1])\n } else if (item.tuple[0] === ':args') {\n accum[item.tuple[0]] = parseNonTuples(item.tuple[0], item.tuple[1])\n } else if (Array.isArray(item.tuple[1]) &&\n (typeof item.tuple[1][0] === 'object' && !Array.isArray(item.tuple[1][0])) && item.tuple[1][0]['tuple']) {\n accum[item.tuple[0]] = parseTuples(item.tuple[1], item.tuple[0])\n } else if (Array.isArray(item.tuple[1])) {\n accum[item.tuple[0]] = item.tuple[1]\n } else if (item.tuple[0] === ':ip') {\n accum[item.tuple[0]] = item.tuple[1].tuple.join('.')\n } else if (item.tuple[1] && typeof item.tuple[1] === 'object') {\n accum[item.tuple[0]] = parseObject(item.tuple[1])\n } else {\n accum[item.tuple[0]] = item.tuple[1]\n }\n return accum\n }, {})\n}\n\nconst parseObject = object => {\n return Object.keys(object).reduce((acc, item) => {\n acc[item] = object[item]\n return acc\n }, {})\n}\n\nconst parseProxyUrl = value => {\n if (value && !Array.isArray(value) &&\n typeof value === 'object' &&\n value.tuple.length === 3 &&\n value.tuple[0] === ':socks5') {\n const [, host, port] = value.tuple\n return { socks5: true, host, port }\n } else if (typeof value === 'string') {\n const [host, port] = value.split(':')\n return { socks5: false, host, port }\n }\n return { socks5: false, host: null, port: null }\n}\n\nconst partialUpdate = (group, key) => {\n return !(group === ':auto_linker' && key === ':opts')\n}\n\nexport const processNested = (valueForState, valueForUpdatedSettings, group, parentKey, parents, settings, updatedSettings) => {\n const [{ key, type }, ...otherParents] = parents\n const path = [group, parentKey, ...parents.reverse().map(parent => parent.key).slice(0, -1)]\n\n let updatedValueForState = valueExists('state', settings, path)\n ? { ...getCurrentValue('state', settings[group][parentKey], parents.map(el => el.key).slice(0, -1)),\n ...{ [key]: valueForState }}\n : { [key]: valueForState }\n let updatedValueForUpdatedSettings = valueExists('updatedSettings', updatedSettings, path)\n ? { ...getCurrentValue('updatedSettings', updatedSettings[group][parentKey], parents.map(el => el.key).slice(0, -1))[1],\n ...{ [key]: [type, valueForUpdatedSettings] }}\n : { [key]: [type, valueForUpdatedSettings] }\n\n if (group === ':mime' && parents[0].key === ':types') {\n updatedValueForState = settings[group][parents[0].key]\n ? { ...settings[group][parents[0].key].value, ...updatedValueForState }\n : updatedValueForState\n updatedValueForUpdatedSettings = settings[group][parents[0].key]\n ? { ...Object.keys(settings[group][parents[0].key].value)\n .reduce((acc, el) => {\n return { ...acc, [el]: [type, settings[group][parents[0].key].value[el]] }\n }, {}),\n ...updatedValueForUpdatedSettings }\n : updatedValueForUpdatedSettings\n }\n\n return otherParents.length === 1\n ? { valueForState: updatedValueForState, valueForUpdatedSettings: updatedValueForUpdatedSettings, setting: otherParents[0] }\n : processNested(updatedValueForState, updatedValueForUpdatedSettings, group, parentKey, otherParents, settings, updatedSettings)\n}\n\nconst valueExists = (type, value, path) => {\n if (type === 'state') {\n return _.get(value, path)\n } else {\n const [group, key, firstSettingName, ...restKeys] = path\n const firstSegment = _.get(value, [group, key, firstSettingName])\n if (restKeys.length === 0 || !firstSegment) {\n return firstSegment || false\n } else {\n const secondSegment = (value, keys) => {\n if (keys.length === 0) {\n return true\n }\n const [element, ...rest] = keys\n return value[1][element] ? secondSegment(value[1][element], rest) : false\n }\n return secondSegment(firstSegment, restKeys)\n }\n }\n}\n\nexport const valueHasTuples = (key, value) => {\n const valueIsArrayOfNonObjects = Array.isArray(value) && value.length > 0 && value.every(el => typeof el !== 'object')\n return key === ':meta' ||\n key === ':types' ||\n key === ':backends' ||\n key === ':compiled_template_engines' ||\n key === ':compiled_format_encoders' ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null ||\n valueIsArrayOfNonObjects\n}\n\nexport const wrapUpdatedSettings = (group, settings, currentState) => {\n return Object.keys(settings).map((key) => {\n return settings[key]._value\n ? { group, key, value: getValueWithoutKey(key, settings[key]._value) }\n : { group, key, value: wrapValues(settings[key], currentState[group][key]) }\n })\n}\n\nconst wrapValues = (settings, currentState) => {\n return Object.keys(settings).map(setting => {\n const [type, value] = settings[setting]\n if (\n type === 'keyword' ||\n type.includes('keyword') ||\n type.includes('tuple') && type.includes('list') ||\n setting === ':replace'\n ) {\n return { 'tuple': [setting, wrapValues(value, currentState)] }\n } else if (type === 'atom' && value.length > 0) {\n return { 'tuple': [setting, `:${value}`] }\n } else if (type.includes('tuple') && (type.includes('string') || type.includes('atom'))) {\n return typeof value === 'string'\n ? { 'tuple': [setting, value] }\n : { 'tuple': [setting, { 'tuple': value }] }\n } else if (type === 'reversed_tuple') {\n return { 'tuple': [value, setting] }\n } else if (type === 'map') {\n const mapValue = Object.keys(value).reduce((acc, key) => {\n acc[key] = setting === ':match_actor' ? value[key] : value[key][1]\n return acc\n }, {})\n const mapCurrentState = setting === ':match_actor'\n ? currentState[setting].reduce((acc, element) => {\n return { ...acc, ...{ [Object.keys(element)[0]]: Object.values(element)[0].value }}\n }, {})\n : currentState[setting]\n return { 'tuple': [setting, { ...mapCurrentState, ...mapValue }] }\n } else if (setting === ':ip') {\n const ip = value.split('.').map(s => parseInt(s, 10))\n return { 'tuple': [setting, { 'tuple': ip }] }\n } else if (setting === ':args') {\n const index = value.findIndex(el => el === 'implode')\n const updatedArray = value.slice()\n if (index !== -1) {\n updatedArray[index] = { 'tuple': ['implode', '1'] }\n }\n return { 'tuple': [setting, updatedArray] }\n } else {\n return { 'tuple': [setting, value] }\n }\n })\n}\n\nexport const formSearchObject = description => {\n const parseNestedSettings = (description, label, key) => description.reduce((acc, setting) => {\n const searchArray = _.compact([setting.key, setting.label, setting.description]).map(el => el.toLowerCase())\n const resultObject = { label: setting.label, key: setting.key || setting.group, groupKey: key, groupLabel: label, search: searchArray }\n if (setting.children) {\n const updatedAcc = [...acc, resultObject]\n return [...updatedAcc, ...parseNestedSettings(setting.children, label, key)]\n }\n return [...acc, resultObject]\n }, [])\n\n return description.reduce((acc, setting) => {\n const searchArray = _.compact([setting.key, setting.label, setting.description]).map(el => el.toLowerCase())\n const resultObject = { label: setting.label, key: setting.key || setting.group, groupKey: setting.key || setting.group, groupLabel: setting.label, search: searchArray }\n if (setting.children) {\n const updatedAcc = !setting.key && setting.group === ':pleroma' ? acc : [...acc, resultObject]\n return [...updatedAcc, ...parseNestedSettings(setting.children, setting.label, setting.key || setting.group)]\n }\n return !setting.key && setting.group === ':pleroma' ? acc : [...acc, resultObject]\n }, [])\n}\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-size\",\n \"use\": \"icon-size-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-zip\",\n \"use\": \"icon-zip-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-tab\",\n \"use\": \"icon-tab-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-search\",\n \"use\": \"icon-search-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-tree\",\n \"use\": \"icon-tree-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-documentation\",\n \"use\": \"icon-documentation-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-drag\",\n \"use\": \"icon-drag-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=17178ffc&scoped=true&lang=css&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--7-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--7-2!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=17178ffc&scoped=true&lang=css&\"","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-fullscreen\",\n \"use\": \"icon-fullscreen-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import Vue from 'vue'\nimport VueI18n from 'vue-i18n'\nimport Cookies from 'js-cookie'\nimport elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang\nimport elementZhLocale from 'element-ui/lib/locale/lang/zh-CN' // element-ui lang\nimport elementEsLocale from 'element-ui/lib/locale/lang/es' // element-ui lang\nimport enLocale from './en'\nimport zhLocale from './zh'\nimport esLocale from './es'\nimport ocLocale from './oc'\n\nVue.use(VueI18n)\n\nconst messages = {\n en: {\n ...enLocale,\n ...elementEnLocale\n },\n zh: {\n ...zhLocale,\n ...elementZhLocale\n },\n es: {\n ...esLocale,\n ...elementEsLocale\n },\n oc: {\n ...ocLocale\n }\n}\n\nconst i18n = new VueI18n({\n // set locale\n // options: en | zh | es | oc\n locale: Cookies.get('language') || 'en',\n // set locale messages\n messages\n})\n\nexport default i18n\n","export default {\n route: {\n dashboard: 'Dashboard',\n introduction: 'Introduction',\n documentation: 'Documentation',\n guide: 'Guide',\n permission: 'Permission',\n pagePermission: 'Page Permission',\n directivePermission: 'Directive Permission',\n icons: 'Icons',\n components: 'Components',\n componentIndex: 'Introduction',\n markdown: 'Markdown',\n jsonEditor: 'JSON Editor',\n dndList: 'Dnd List',\n splitPane: 'SplitPane',\n avatarUpload: 'Avatar Upload',\n dropzone: 'Dropzone',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: 'Mixin',\n backToTop: 'BackToTop',\n dragDialog: 'Drag Dialog',\n dragSelect: 'Drag Select',\n dragKanban: 'Drag Kanban',\n charts: 'Charts',\n keyboardChart: 'Keyboard Chart',\n lineChart: 'Line Chart',\n mixChart: 'Mix Chart',\n example: 'Example',\n nested: 'Nested Routes',\n menu1: 'Menu 1',\n 'menu1-1': 'Menu 1-1',\n 'menu1-2': 'Menu 1-2',\n 'menu1-2-1': 'Menu 1-2-1',\n 'menu1-2-2': 'Menu 1-2-2',\n 'menu1-3': 'Menu 1-3',\n menu2: 'Menu 2',\n Table: 'Table',\n dynamicTable: 'Dynamic Table',\n dragTable: 'Drag Table',\n inlineEditTable: 'Inline Edit',\n complexTable: 'Complex Table',\n treeTable: 'Tree Table',\n customTreeTable: 'Custom TreeTable',\n tab: 'Tab',\n form: 'Form',\n createArticle: 'Create Article',\n editArticle: 'Edit Article',\n articleList: 'Article List',\n errorPages: 'Error Pages',\n page401: '401',\n page404: '404',\n errorLog: 'Error Log',\n excel: 'Excel',\n exportExcel: 'Export Excel',\n selectExcel: 'Export Selected',\n uploadExcel: 'Upload Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Export Zip',\n theme: 'Theme',\n clipboardDemo: 'Clipboard',\n i18n: 'I18n',\n externalLink: 'External Link',\n users: 'Users',\n reports: 'Reports',\n settings: 'Settings',\n moderationLog: 'Moderation Log',\n 'emoji-packs': 'Emoji packs'\n },\n navbar: {\n logOut: 'Log Out',\n dashboard: 'Dashboard',\n github: 'Github',\n theme: 'Theme',\n size: 'Global Size'\n },\n login: {\n title: 'Login Form',\n logIn: 'Log in',\n logInViaPleromaFE: 'Log in via PleromaFE',\n username: 'username@host',\n password: 'password',\n omitHostname: 'omit hostname if Pleroma is located on this domain',\n errorMessage: 'Username must contain username and host, e.g. john@pleroma.social',\n any: 'any',\n thirdparty: 'Or connect with',\n pleromaFELoginFailed: 'Failed to login via PleromaFE, please login with username/password',\n pleromaFELoginSucceed: 'Logged in via PleromaFE'\n },\n documentation: {\n documentation: 'Documentation',\n github: 'Github Repository'\n },\n permission: {\n roles: 'Your roles',\n switchRoles: 'Switch roles',\n tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.'\n },\n guide: {\n description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',\n button: 'Show Guide'\n },\n components: {\n documentation: 'Documentation',\n dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.',\n stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',\n backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',\n backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',\n imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'\n },\n table: {\n dynamicTips1: 'Fixed header, sorted by header order',\n dynamicTips2: 'Not fixed header, sorted by click order',\n dragTips1: 'The default order',\n dragTips2: 'The after dragging order',\n title: 'Title',\n importance: 'Imp',\n type: 'Type',\n remark: 'Remark',\n search: 'Search',\n add: 'Add',\n export: 'Export',\n reviewer: 'reviewer',\n id: 'ID',\n date: 'Date',\n author: 'Author',\n readings: 'Readings',\n status: 'Status',\n actions: 'Actions',\n edit: 'Edit',\n publish: 'Publish',\n draft: 'Draft',\n delete: 'Delete',\n cancel: 'Cancel',\n confirm: 'Confirm'\n },\n errorLog: {\n tips: 'Please click the bug icon in the upper right corner',\n description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',\n documentation: 'Document introduction'\n },\n excel: {\n export: 'Export',\n selectedExport: 'Export Selected Items',\n placeholder: 'Please enter the file name(default excel-list)'\n },\n zip: {\n export: 'Export',\n placeholder: 'Please enter the file name(default file)'\n },\n pdf: {\n tips: 'Here we use window.print() to implement the feature of downloading pdf.'\n },\n theme: {\n change: 'Change Theme',\n documentation: 'Theme documentation',\n tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'\n },\n tagsView: {\n refresh: 'Refresh',\n close: 'Close',\n closeOthers: 'Close Others',\n closeAll: 'Close All'\n },\n users: {\n users: 'Users',\n localUsersOnly: 'Local users only',\n search: 'Search',\n id: 'ID',\n name: 'Name',\n status: 'Status',\n local: 'Local',\n external: 'External',\n deactivated: 'Deactivated',\n active: 'Active',\n unconfirmed: 'Unconfirmed',\n actions: 'Actions',\n activate: 'Activate',\n deactivate: 'Deactivate',\n admin: 'Admin',\n moderator: 'Moderator',\n moderation: 'Moderation',\n revokeAdmin: 'Revoke Admin',\n grantAdmin: 'Grant Admin',\n revokeModerator: 'Revoke Moderator',\n grantModerator: 'Grant Moderator',\n activateAccount: 'Activate Account',\n activateAccounts: 'Activate Accounts',\n deactivateAccount: 'Deactivate Account',\n deactivateAccounts: 'Deactivate Accounts',\n deleteAccount: 'Delete Account',\n deleteAccounts: 'Delete Accounts',\n forceNsfw: 'Force posts to be NSFW',\n stripMedia: 'Force posts to not have media',\n forceUnlisted: 'Force posts to be unlisted',\n sandbox: 'Force posts to be followers-only',\n disableRemoteSubscription: 'Disallow following user from remote instances',\n disableRemoteSubscriptionForMultiple: 'Disallow following users from remote instances',\n disableAnySubscription: 'Disallow following user at all',\n disableAnySubscriptionForMultiple: 'Disallow following users at all',\n requirePasswordReset: 'Require password reset on next login',\n selectUsers: 'Select users to apply actions to multiple users',\n moderateUser: 'Moderate user',\n moderateUsers: 'Moderate multiple users',\n createAccount: 'Create new account',\n apply: 'Apply',\n remove: 'Remove',\n grantRightConfirmation: 'Are you sure you want to grant {right} rights to all selected users?',\n revokeRightConfirmation: 'Are you sure you want to revoke {right} rights from all selected users?',\n activateMultipleUsersConfirmation: 'Are you sure you want to activate accounts of all selected users?',\n deactivateMultipleUsersConfirmation: 'Are you sure you want to deactivate accounts of all selected users?',\n deleteMultipleUsersConfirmation: 'Are you sure you want to delete accounts of all selected users?',\n addTagForMultipleUsersConfirmation: 'Are you sure you want to apply tag to all selected users?',\n removeTagFromMultipleUsersConfirmation: 'Are you sure you want to remove tag from all selected users?',\n requirePasswordResetConfirmation: 'Are you sure you want to require password reset for all selected users?',\n confirmAccountsConfirmation: 'Are you sure you want to confirm emails for all selected users?',\n resendEmailConfirmation: 'Are you sure you want to resend confirmation email for all selected users?',\n mailerMustBeEnabled: 'To require user\\'s password reset you must enable mailer.',\n ok: 'Okay',\n completed: 'Completed',\n cancel: 'Cancel',\n canceled: 'Canceled',\n username: 'Username',\n email: 'E-mail',\n password: 'Password',\n create: 'Create',\n submitFormError: 'There are invalid values in the form. Please fix them before continuing.',\n emptyEmailError: 'Please input the e-mail',\n invalidEmailError: 'Please input valid e-mail',\n emptyPasswordError: 'Please input the password',\n emptyNicknameError: 'Please input the username',\n invalidNicknameError: 'Username can include \"a-z\", \"A-Z\" and \"0-9\" characters',\n getPasswordResetToken: 'Get password reset token',\n passwordResetTokenCreated: 'Password reset token was created',\n accountCreated: 'New account was created!',\n unconfirmedEmail: 'User didn\\'t confirm the email',\n confirmAccount: 'Confirm account',\n confirmAccounts: 'Confirm accounts',\n resendConfirmation: 'Resend confirmation email',\n invalidAccount: 'This account has invalid nickname and can\\'t be modified',\n invalidNickname: 'invalid nickname',\n passwordResetTokenGenerated: 'Password reset token was generated:',\n linkToResetPassword: 'You can also use this link to reset password:'\n },\n statuses: {\n statuses: 'Statuses',\n instanceFilter: 'Instance filter',\n loadMore: 'Load more',\n noInstances: 'No other instances found',\n onlyLocalStatuses: 'Show only local statuses',\n showPrivateStatuses: 'Show private statuses',\n direct: 'Direct',\n private: 'Private',\n public: 'Public',\n unlisted: 'Unlisted',\n openStatusInInstance: 'Open status in instance'\n },\n userProfile: {\n tags: 'Tags',\n moderator: 'Moderator',\n admin: 'Admin',\n local: 'Local',\n external: 'External',\n accountType: 'Account type',\n nickname: 'Nickname',\n recentStatuses: 'Recent Statuses',\n roles: 'Roles',\n active: 'Active',\n status: 'Status',\n deactivated: 'Deactivated',\n noStatuses: 'No statuses to show',\n openAccountInInstance: 'Open account in instance',\n securitySettings: {\n email: 'Email',\n password: 'Password',\n securitySettings: 'Security settings',\n passwordChangeWarning1: 'Setting a new password will cause the user to be signed out from any client they have used before.',\n passwordChangeWarning2: 'When the user signs in with this password, they will be asked to set a new one.',\n passwordLengthNotice: 'Make sure it\\'s at least {minLength} characters long.',\n inputNewEmail: 'Input new email',\n inputNewPassword: 'Input new password',\n passwordUpdated: 'The password has been updated',\n emailUpdated: 'The email has been updated',\n success: 'Success',\n submit: 'Submit',\n close: 'Close'\n }\n },\n usersFilter: {\n inputPlaceholder: 'Select filter',\n byAccountType: 'By account type',\n local: 'Local',\n external: 'External',\n byStatus: 'By status',\n active: 'Active',\n deactivated: 'Deactivated'\n },\n reports: {\n reports: 'Reports',\n report: 'Report',\n reply: 'Reply',\n from: 'From',\n showNotes: 'Show notes',\n newNote: 'New note',\n submit: 'Submit',\n confirmMsg: 'Are you sure you want to delete this note?',\n delete: 'Delete',\n cancel: 'Cancel',\n deleteCompleted: 'Delete comleted',\n deleteCanceled: 'Delete canceled',\n noNotes: 'No notes to display',\n changeState: \"Change report's state\",\n changeAllReports: 'Change all reports',\n changeScope: 'Change scope',\n moderateUser: 'Moderate user',\n resolve: 'Resolve',\n reopen: 'Reopen',\n close: 'Close',\n resolveAll: 'Resolve all',\n reopenAll: 'Reopen all',\n closeAll: 'Close all',\n addSensitive: 'Add Sensitive flag',\n removeSensitive: 'Remove Sensitive flag',\n public: 'Make status public',\n private: 'Make status private',\n unlisted: 'Make status unlisted',\n sensitive: 'Sensitive',\n deleteStatus: 'Delete status',\n reportOn: 'Report on',\n reportsOn: 'Reports on',\n id: 'ID',\n account: 'Account',\n actor: 'Actor',\n actors: 'Actors',\n content: 'Content',\n reportedStatus: 'Reported status',\n statusDeleted: 'This status has been deleted',\n leaveNote: 'Leave a note',\n postNote: 'Send',\n deleteNote: 'Delete',\n notFound: 'account not found'\n },\n reportsFilter: {\n inputPlaceholder: 'Select filter',\n open: 'Open',\n closed: 'Closed',\n resolved: 'Resolved'\n },\n moderationLog: {\n moderationLog: 'Moderation Log'\n },\n settings: {\n settings: 'Settings',\n instance: 'Instance',\n upload: 'Upload',\n mailer: 'Mailer',\n logger: 'Logger',\n activityPub: 'ActivityPub',\n auth: 'Authentication',\n autoLinker: 'Auto Linker',\n captcha: 'Captcha',\n frontend: 'Frontend',\n http: 'HTTP',\n mrf: 'MRF',\n mediaProxy: 'Media Proxy',\n metadata: 'Metadata',\n gopher: 'Gopher',\n jobQueue: 'Job queue',\n webPush: 'Web push encryption',\n esshd: 'BBS / SSH access',\n rateLimiters: 'Rate limiters',\n other: 'Other',\n relays: 'Relays',\n follow: 'Follow',\n followRelay: 'Follow new relay',\n instanceUrl: 'Instance URL',\n success: 'Settings changed successfully!',\n description: 'Description',\n removeFromDB: 'Remove setting from the DB',\n successfullyDownloaded: 'Successfully downloaded',\n successfullyImported: 'Successfully imported',\n nowNewPacksToImport: 'No new packs to import',\n successfullyUpdated: 'Successfully updated',\n metadatLowerCase: 'metadata',\n files: 'files',\n successfullyRemoved: 'Setting removed successfully!',\n seeDocs: 'See Documentation',\n assets: 'Assets',\n emoji: 'Emoji',\n markup: 'Markup settings',\n corsPlug: 'CORS plug config',\n instanceReboot: 'Reboot Instance',\n restartApp: 'You must restart the instance to apply settings',\n restartSuccess: 'Instance rebooted successfully!',\n removeSettingConfirmation: 'Are you sure you want to remove this setting\\'s value from the database?'\n },\n invites: {\n inviteTokens: 'Invite tokens',\n createInviteToken: 'Generate invite token',\n pickDate: 'Pick a date',\n maxUse: 'Max use',\n expiresAt: 'Expires at',\n tokenCreated: 'Invite token was created',\n token: 'Token',\n inviteLink: 'Invite link',\n uses: 'Uses',\n used: 'Used',\n cancel: 'Cancel',\n create: 'Create',\n revoke: 'Revoke',\n id: 'ID',\n actions: 'Actions',\n active: 'Active',\n inviteUserViaEmail: 'Invite user via email',\n sendRegistration: 'Send registration invite via email',\n email: 'Email',\n name: 'Name',\n emptyEmailError: 'Please input the e-mail',\n invalidEmailError: 'Please input valid e-mail',\n emailSent: 'Invite was sent',\n submitFormError: 'There are invalid values in the form. Please fix them before continuing.',\n inviteViaEmailAlert: 'To send invite via email make sure to enable `invites_enabled` and disable `registrations_open`'\n },\n emoji: {\n emojiPacks: 'Emoji packs',\n reloaded: 'Emoji reloaded successfully!',\n refreshed: 'Emoji refreshed successfully!',\n importEmojiTooltip: 'Importing from the filesystem will scan the directories and import those without pack.json but with emoji.txt or without neither',\n reloadEmoji: 'Reload emoji',\n importPacks: 'Import packs from the server filesystem',\n localPacks: 'Local packs',\n refreshLocalPacks: 'Refresh local packs',\n createLocalPack: 'Create a new local pack',\n remotePacks: 'Remote packs',\n remoteInstanceAddress: 'Remote instance address',\n refreshRemote: 'Refresh remote packs',\n sharePack: 'Share pack',\n required: 'required',\n homepage: 'Homepage',\n description: 'Description',\n packs: 'Packs',\n license: 'License',\n shortcode: 'Shortcode',\n fallbackSrc: 'Fallback source',\n fallbackSrcSha: 'Fallback source SHA',\n saveMetadata: 'Save metadata',\n deletePack: 'Delete pack',\n downloadPack: 'Download pack',\n downloadPackArchive: 'Download pack archive',\n addNewEmoji: 'Add new emoji to the pack',\n manageEmoji: 'Manage existing emoji',\n thisWillDownload: 'This will download the',\n downloadToCurrentInstance: 'pack to the current instance under the name',\n canBeChanged: 'can be changed below',\n willBeUsable: 'It will then be usable and shareable from the current instance',\n downloadAsOptional: 'Download as (optional)',\n downloadSharedPack: 'Download shared pack to current instance',\n downloadSharedPackMobile: 'Download pack to instance',\n optional: 'optional',\n uploadFile: 'Upload a file',\n url: 'URL',\n clickToUpload: 'Click to upload',\n upload: 'Upload',\n customFilename: 'Custom filename',\n customFilenameDesc: 'Custom file name (optional)',\n file: 'File',\n localPack: 'Local pack',\n leaveEmptyShortcode: 'leave empty to use the same shortcode',\n leaveEmptyFilename: 'leave empty to use the same filename',\n update: 'Update',\n remove: 'Remove',\n selectLocalPack: 'Select the local pack to copy to',\n specifyShortcode: 'Specify a custom shortcode',\n specifyFilename: 'Specify a custom filename',\n copy: 'Copy',\n copyToLocalPack: 'Copy to local pack'\n }\n}\n","export default {\n route: {\n dashboard: '首页',\n introduction: '简述',\n documentation: '文档',\n guide: '引导页',\n permission: '权限测试页',\n pagePermission: '页面权限',\n directivePermission: '指令权限',\n icons: '图标',\n components: '组件',\n componentIndex: '介绍',\n markdown: 'Markdown',\n jsonEditor: 'JSON编辑器',\n dndList: '列表拖拽',\n splitPane: 'Splitpane',\n avatarUpload: '头像上传',\n dropzone: 'Dropzone',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: '小组件',\n backToTop: '返回顶部',\n dragDialog: '拖拽 Dialog',\n dragSelect: '拖拽 Select',\n dragKanban: '可拖拽看板',\n charts: '图表',\n keyboardChart: '键盘图表',\n lineChart: '折线图',\n mixChart: '混合图表',\n example: '综合实例',\n nested: '路由嵌套',\n menu1: '菜单1',\n 'menu1-1': '菜单1-1',\n 'menu1-2': '菜单1-2',\n 'menu1-2-1': '菜单1-2-1',\n 'menu1-2-2': '菜单1-2-2',\n 'menu1-3': '菜单1-3',\n menu2: '菜单2',\n Table: 'Table',\n dynamicTable: '动态Table',\n dragTable: '拖拽Table',\n inlineEditTable: 'Table内编辑',\n complexTable: '综合Table',\n treeTable: '树形表格',\n customTreeTable: '自定义树表',\n tab: 'Tab',\n form: '表单',\n createArticle: '创建文章',\n editArticle: '编辑文章',\n articleList: '文章列表',\n errorPages: '错误页面',\n page401: '401',\n page404: '404',\n errorLog: '错误日志',\n excel: 'Excel',\n exportExcel: 'Export Excel',\n selectExcel: 'Export Selected',\n uploadExcel: 'Upload Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Export Zip',\n theme: '换肤',\n clipboardDemo: 'Clipboard',\n i18n: '国际化',\n externalLink: '外链'\n },\n navbar: {\n logOut: '退出登录',\n dashboard: '首页',\n github: '项目地址',\n theme: '换肤',\n size: '布局大小'\n },\n login: {\n title: '系统登录',\n logIn: '登录',\n username: '账号',\n password: '密码',\n any: '随便填',\n thirdparty: '第三方登录',\n thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!'\n },\n documentation: {\n documentation: '文档',\n github: 'Github 地址'\n },\n permission: {\n roles: '你的权限',\n switchRoles: '切换权限',\n tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 Tab 组件或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。'\n },\n guide: {\n description: '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于',\n button: '打开引导'\n },\n components: {\n documentation: '文档',\n dropzoneTips: '由于我司业务有特殊需求,而且要传七牛 所以没用第三方,选择了自己封装。代码非常的简单,具体代码你可以在这里看到 @/components/element-ui/Dropzone',\n stickyTips: '当页面滚动到预设的位置会吸附在顶部',\n backToTopTips1: '页面滚动到指定位置会在右下角出现返回顶部按钮',\n backToTopTips2: '可自定义按钮的样式、show/hide、出现的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素',\n imageUploadTips: '由于我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。'\n },\n table: {\n dynamicTips1: '固定表头, 按照表头顺序排序',\n dynamicTips2: '不固定表头, 按照点击顺序排序',\n dragTips1: '默认顺序',\n dragTips2: '拖拽后顺序',\n title: '标题',\n importance: '重要性',\n type: '类型',\n remark: '点评',\n search: '搜索',\n add: '添加',\n export: '导出',\n reviewer: '审核人',\n id: '序号',\n date: '时间',\n author: '作者',\n readings: '阅读数',\n status: '状态',\n actions: '操作',\n edit: '编辑',\n publish: '发布',\n draft: '草稿',\n delete: '删除',\n cancel: '取 消',\n confirm: '确 定'\n },\n errorLog: {\n tips: '请点击右上角bug小图标',\n description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。',\n documentation: '文档介绍'\n },\n excel: {\n export: '导出',\n selectedExport: '导出已选择项',\n placeholder: '请输入文件名(默认excel-list)'\n },\n zip: {\n export: '导出',\n placeholder: '请输入文件名(默认file)'\n },\n pdf: {\n tips: '这里使用 window.print() 来实现下载pdf的功能'\n },\n theme: {\n change: '换肤',\n documentation: '换肤文档',\n tips: 'Tips: 它区别于 navbar 上的 theme-pick, 是两种不同的换肤方法,各自有不同的应用场景,具体请参考文档。'\n },\n tagsView: {\n refresh: '刷新',\n close: '关闭',\n closeOthers: '关闭其它',\n closeAll: '关闭所有'\n }\n}\n","export default {\n route: {\n dashboard: 'Panel de control',\n introduction: 'Introducción',\n documentation: 'Documentación',\n guide: 'Guía',\n permission: 'Permisos',\n pagePermission: 'Permisos de la página',\n directivePermission: 'Permisos de la directiva',\n icons: 'Iconos',\n components: 'Componentes',\n componentIndex: 'Introducción',\n markdown: 'Markdown',\n jsonEditor: 'Editor JSON',\n dndList: 'Lista Dnd',\n splitPane: 'Panel dividido',\n avatarUpload: 'Subir avatar',\n dropzone: 'Subir ficheros',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: 'Mixin',\n backToTop: 'Ir arriba',\n dragDialog: 'Drag Dialog',\n dragSelect: 'Drag Select',\n dragKanban: 'Drag Kanban',\n charts: 'Gráficos',\n keyboardChart: 'Keyboard Chart',\n lineChart: 'Gráfico de líneas',\n mixChart: 'Mix Chart',\n example: 'Ejemplo',\n nested: 'Rutas anidadass',\n menu1: 'Menu 1',\n 'menu1-1': 'Menu 1-1',\n 'menu1-2': 'Menu 1-2',\n 'menu1-2-1': 'Menu 1-2-1',\n 'menu1-2-2': 'Menu 1-2-2',\n 'menu1-3': 'Menu 1-3',\n menu2: 'Menu 2',\n Table: 'Tabla',\n dynamicTable: 'Tabla dinámica',\n dragTable: 'Arrastrar tabla',\n inlineEditTable: 'Editor',\n complexTable: 'Complex Table',\n treeTable: 'Tree Table',\n customTreeTable: 'Custom TreeTable',\n tab: 'Pestaña',\n form: 'Formulario',\n createArticle: 'Crear artículo',\n editArticle: 'Editar artículo',\n articleList: 'Listado de artículos',\n errorPages: 'Páginas de error',\n page401: '401',\n page404: '404',\n errorLog: 'Registro de errores',\n excel: 'Excel',\n exportExcel: 'Exportar a Excel',\n selectExcel: 'Export seleccionado',\n uploadExcel: 'Subir Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Exportar a Zip',\n theme: 'Tema',\n clipboardDemo: 'Clipboard',\n i18n: 'I18n',\n externalLink: 'Enlace externo'\n },\n navbar: {\n logOut: 'Salir',\n dashboard: 'Panel de control',\n github: 'Github',\n theme: 'Tema',\n size: 'Tamaño global'\n },\n login: {\n title: 'Formulario de acceso',\n logIn: 'Acceso',\n username: 'Usuario',\n password: 'Contraseña',\n any: 'nada',\n thirdparty: 'Conectar con',\n thirdpartyTips: 'No se puede simular en local, así que combine su propia simulación de negocios. ! !'\n },\n documentation: {\n documentation: 'Documentación',\n github: 'Repositorio Github'\n },\n permission: {\n roles: 'Tus permisos',\n switchRoles: 'Cambiar permisos',\n tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.'\n },\n guide: {\n description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',\n button: 'Ver guía'\n },\n components: {\n documentation: 'Documentación',\n dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.',\n stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',\n backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',\n backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',\n imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'\n },\n table: {\n dynamicTips1: 'Fixed header, sorted by header order',\n dynamicTips2: 'Not fixed header, sorted by click order',\n dragTips1: 'Orden por defecto',\n dragTips2: 'The after dragging order',\n title: 'Título',\n importance: 'Importancia',\n type: 'Tipo',\n remark: 'Remark',\n search: 'Buscar',\n add: 'Añadir',\n export: 'Exportar',\n reviewer: 'reviewer',\n id: 'ID',\n date: 'Fecha',\n author: 'Autor',\n readings: 'Lector',\n status: 'Estado',\n actions: 'Acciones',\n edit: 'Editar',\n publish: 'Publicar',\n draft: 'Draft',\n delete: 'Eliminar',\n cancel: 'Cancelar',\n confirm: 'Confirmar'\n },\n errorLog: {\n tips: 'Please click the bug icon in the upper right corner',\n description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',\n documentation: 'Documento de introducción'\n },\n excel: {\n export: 'Exportar',\n selectedExport: 'Exportar seleccionados',\n placeholder: 'Por favor escribe un nombre de fichero'\n },\n zip: {\n export: 'Exportar',\n placeholder: 'Por favor escribe un nombre de fichero'\n },\n pdf: {\n tips: 'Here we use window.print() to implement the feature of downloading pdf.'\n },\n theme: {\n change: 'Cambiar tema',\n documentation: 'Documentación del tema',\n tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'\n },\n tagsView: {\n refresh: 'Actualizar',\n close: 'Cerrar',\n closeOthers: 'Cerrar otros',\n closeAll: 'Cerrar todos'\n }\n}\n","export default {\n route: {\n dashboard: 'Tablèu de bòrd',\n introduction: 'Introduccion',\n documentation: 'Documentacion',\n guide: 'Guida',\n permission: 'Autorizacions',\n pagePermission: 'Pagina d’autorizacion',\n directivePermission: 'Politica d’autorizacion',\n icons: 'Icònas',\n components: 'Compausants',\n componentIndex: 'Introduccion',\n markdown: 'Markdown',\n jsonEditor: 'JSON Editor',\n dndList: 'Dnd List',\n splitPane: 'SplitPane',\n avatarUpload: 'Mandadís d’avatar',\n dropzone: 'Dropzone',\n sticky: 'Sticky',\n countTo: 'CountTo',\n componentMixin: 'Mixin',\n backToTop: 'BackToTop',\n dragDialog: 'Drag Dialog',\n dragSelect: 'Drag Select',\n dragKanban: 'Drag Kanban',\n charts: 'Charts',\n keyboardChart: 'Keyboard Chart',\n lineChart: 'Line Chart',\n mixChart: 'Mix Chart',\n example: 'Exemple',\n nested: 'Rotas imbricadas',\n menu1: 'Menú 1',\n 'menu1-1': 'Menu 1-1',\n 'menu1-2': 'Menu 1-2',\n 'menu1-2-1': 'Menu 1-2-1',\n 'menu1-2-2': 'Menu 1-2-2',\n 'menu1-3': 'Menu 1-3',\n menu2: 'Menú 2',\n Table: 'Tablèu',\n dynamicTable: 'Tablèu dinamic',\n dragTable: 'Drag Table',\n inlineEditTable: 'Inline Edit',\n complexTable: 'Tablèu complèx',\n treeTable: 'Arborescéncia',\n customTreeTable: 'Arborescéncia personalizada',\n tab: 'Onglet',\n form: 'Formulari',\n createArticle: 'Crear un article',\n editArticle: 'Modificar l’article',\n articleList: 'Lista d’articles',\n errorPages: 'Paginas d’error',\n page401: '401',\n page404: '404',\n errorLog: 'Jornal d’error',\n excel: 'Excel',\n exportExcel: 'Exportacion Excel',\n selectExcel: 'Exportar los seleccionats',\n uploadExcel: 'Importacion Excel',\n zip: 'Zip',\n pdf: 'PDF',\n exportZip: 'Exportacion Zip',\n theme: 'Tèma',\n clipboardDemo: 'Clipboard',\n i18n: 'I18n',\n externalLink: 'Ligams extèrnes',\n users: 'Utilizaires'\n },\n navbar: {\n logOut: 'Desconnexion',\n dashboard: 'Tablèu de bòrd',\n github: 'Github',\n theme: 'Tèma',\n size: 'Talha totala'\n },\n login: {\n title: 'Formulari de connexion',\n logIn: 'Se connectar',\n username: 'Nom d’’utilizaire',\n password: 'Senhal',\n any: 'qual que siá',\n thirdparty: 'O se connectar amb',\n thirdpartyTips: 'Pòt pas èsser simulat en local, doncas montatz vòstra pròpria simulacion ! ! !'\n },\n documentation: {\n documentation: 'Documentacion',\n github: 'Repertòri Github'\n },\n permission: {\n roles: 'Vòstres ròtles',\n switchRoles: 'Cambiar de ròtle',\n tips: 'Dins qualques cases es pas de bon far d’utilizar v-permission, coma element d’onglet compausant, el-table-column o d’autres renduts dom asincròns que pòdon pas que foncionar amb un parametratge manual de v-if.'\n },\n guide: {\n description: 'La pagina de guida es utila pel monde que dintran dins lo projècte pel primièr còp. Podètz presentar en un mot las foncionalitats del projèctes. La demo es fondada sus ',\n button: 'Mostrar la guida'\n },\n components: {\n documentation: 'Documentacion',\n dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/element-ui/Dropzone.',\n stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',\n backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',\n backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',\n imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'\n },\n table: {\n dynamicTips1: 'Bandièra fixa, triada per òrdre de bandièra',\n dynamicTips2: 'Bandièra pas fixa, triada per òrdre de clic',\n dragTips1: 'L’’òrdre per defaut',\n dragTips2: 'L’’òrdre aprèp lisar-depausar',\n title: 'Títol',\n importance: 'Imp',\n type: 'Tipe',\n remark: 'Remarca',\n search: 'Recercar',\n add: 'Ajustar',\n export: 'Exportar',\n reviewer: 'examinator',\n id: 'ID',\n date: 'Data',\n author: 'Autor',\n readings: 'Lecturas',\n status: 'Estatuts',\n actions: 'Accions',\n edit: 'Modificar',\n publish: 'Publicar',\n draft: 'Ensag',\n delete: 'Suprimir',\n cancel: 'Anullar',\n confirm: 'Confirmar'\n },\n errorLog: {\n tips: 'Mercés de clicar l’’icòna del babau amont a man drecha',\n description: 'Ara que lo sistèma de gestion es coma un spa, melhora l’experiéncia dels utilizaire mas aumenta tanben lo risc de problèmas sus la pagina, una pichona negligéncia pòt menar a un blocatge complèt de la pagina. Urosament Vue fornís de manièras per gerir las excepcions, trobar las errors o senhalar las excepcions.',\n documentation: 'Presentacion del document'\n },\n excel: {\n export: 'Exportar',\n selectedExport: 'Exportar los elements seleccionats',\n placeholder: 'Mercés de picar lo nom de fichièr (per defaut excel-list)'\n },\n zip: {\n export: 'Exportar',\n placeholder: 'Mercés de picar lo nom de fichièr (per defaut file)'\n },\n pdf: {\n tips: 'Aquí utilizam window.print() per prepausar lo telecargament de pdf.'\n },\n theme: {\n change: 'Cambiar lo tèma',\n documentation: 'Documentacion dels tèmas',\n tips: 'Astúcia : es diferent del theme-pick de la barra de navigacion, i a dos metòdes de personalizacion, caduna amb un biais de far diferent. Referiscam a la documentacion per mai de detalhs.'\n },\n tagsView: {\n refresh: 'Actualizar',\n close: 'Tampar',\n closeOthers: 'Tampar los autres',\n closeAll: 'Los tampar totes'\n }\n}\n","import request from '@/utils/request'\nimport { getToken } from '@/utils/auth'\nimport { baseName } from './utils'\n\nexport async function addNewEmojiFile(packName, file, shortcode, filename, host, token) {\n const data = new FormData()\n if (filename.trim() !== '') {\n data.set('filename', filename)\n }\n if (shortcode.trim() !== '') {\n data.set('shortcode', shortcode)\n }\n data.set('file', file)\n\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}/files`,\n method: 'post',\n headers: authHeaders(token),\n data\n })\n}\n\nexport function addressOfEmojiInPack(host, packName, name) {\n return `${baseName(host)}/emoji/${packName}/${name}`\n}\n\nexport async function createPack(host, token, packName) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}`,\n method: 'post',\n headers: authHeaders(token)\n })\n}\n\nexport async function deleteEmojiFile(packName, shortcode, host, token) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}/files`,\n method: 'delete',\n headers: authHeaders(token),\n data: { shortcode }\n })\n}\n\nexport async function deletePack(host, token, packName) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}`,\n method: 'delete',\n headers: authHeaders(token)\n })\n}\n\nexport async function downloadFrom(host, instance, packName, as, token) {\n if (as.trim() === '') {\n as = null\n }\n\n return await request({\n baseURL: baseName(host),\n url: '/api/pleroma/emoji/packs/download',\n method: 'post',\n headers: authHeaders(token),\n data: { url: baseName(instance), name: packName, as },\n timeout: 0\n })\n}\n\nexport async function fetchPack(packName, host, token) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function importFromFS(host, token) {\n return await request({\n baseURL: baseName(host),\n url: '/api/pleroma/emoji/packs/import',\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function listPacks(host) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/`,\n method: 'get'\n })\n}\n\nexport async function listRemotePacks(host, token, instance) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/remote?url=${baseName(instance)}`,\n method: 'get',\n headers: authHeaders(token)\n })\n}\n\nexport async function reloadEmoji(host, token) {\n return await request({\n baseURL: baseName(host),\n url: '/api/pleroma/admin/reload_emoji',\n method: 'post',\n headers: authHeaders(token)\n })\n}\n\nexport async function savePackMetadata(host, token, packName, metadata) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}`,\n method: 'patch',\n headers: authHeaders(token),\n data: { metadata },\n timeout: 0 // This might take a long time\n })\n}\n\nexport async function updateEmojiFile(packName, shortcode, newShortcode, newFilename, force, host, token) {\n return await request({\n baseURL: baseName(host),\n url: `/api/pleroma/emoji/packs/${packName}/files`,\n method: 'patch',\n headers: authHeaders(token),\n data: { shortcode, new_shortcode: newShortcode, new_filename: newFilename, force }\n })\n}\n\nconst authHeaders = (token) => token ? { 'Authorization': `Bearer ${getToken()}` } : {}\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-icon\",\n \"use\": \"icon-icon-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-404\",\n \"use\": \"icon-404-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-edit\",\n \"use\": \"icon-edit-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-lock\",\n \"use\": \"icon-lock-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-user\",\n \"use\": \"icon-user-usage\",\n \"viewBox\": \"0 0 130 130\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","// extracted by mini-css-extract-plugin\nmodule.exports = {\"menuText\":\"#bfcbd9\",\"menuActiveText\":\"#409EFF\",\"subMenuActiveText\":\"#f4f4f5\",\"menuBg\":\"#304156\",\"menuHover\":\"#263445\",\"subMenuBg\":\"#1f2d3d\",\"subMenuHover\":\"#001528\",\"sideBarWidth\":\"180px\"};","import axios from 'axios'\nimport { Message } from 'element-ui'\n\n// create an axios instance\nconst service = axios.create({\n timeout: 60000 // request timeout\n})\n\n// response interceptor\nservice.interceptors.response.use(\n response => response,\n error => {\n let errorMessage\n console.log(`Error ${error}`)\n\n if (error.response) {\n const edata = error.response.data.error ? error.response.data.error : error.response.data\n errorMessage = !error.response.headers['content-type'].includes('application/json')\n ? `${error.message}`\n : `${error.message} - ${edata}`\n } else {\n errorMessage = error\n }\n\n Message({\n message: errorMessage,\n type: 'error',\n duration: 5 * 1000\n })\n return Promise.reject(error)\n }\n)\n\nexport default service\n","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-clipboard\",\n \"use\": \"icon-clipboard-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-email\",\n \"use\": \"icon-email-usage\",\n \"viewBox\": \"0 0 128 96\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","import SpriteSymbol from \"svg-baker-runtime/browser-symbol\";\nimport sprite from \"svg-sprite-loader/runtime/browser-sprite.build\";\nvar symbol = new SpriteSymbol({\n \"id\": \"icon-chart\",\n \"use\": \"icon-chart-usage\",\n \"viewBox\": \"0 0 128 128\",\n \"content\": \"\"\n});\nvar result = sprite.add(symbol);\nexport default symbol","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('svg',_vm._g({class:_vm.svgClass,attrs:{\"aria-hidden\":\"true\"}},_vm.$listeners),[_c('use',{attrs:{\"xlink:href\":_vm.iconName}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=17178ffc&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=17178ffc&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"17178ffc\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","// extracted by mini-css-extract-plugin\nmodule.exports = {\"menuText\":\"#bfcbd9\",\"menuActiveText\":\"#409EFF\",\"subMenuActiveText\":\"#f4f4f5\",\"menuBg\":\"#304156\",\"menuHover\":\"#263445\",\"subMenuBg\":\"#1f2d3d\",\"subMenuHover\":\"#001528\",\"sideBarWidth\":\"180px\"};"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0558.75954137.js b/priv/static/adminfe/static/js/chunk-070d.7e10a520.js similarity index 98% rename from priv/static/adminfe/static/js/chunk-0558.75954137.js rename to priv/static/adminfe/static/js/chunk-070d.7e10a520.js index 7b29707fa..8726dbcd3 100644 --- a/priv/static/adminfe/static/js/chunk-0558.75954137.js +++ b/priv/static/adminfe/static/js/chunk-070d.7e10a520.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-0558"],{"/eX4":function(s,t,i){"use strict";i.r(t);var n=[function(){var s=this.$createElement,t=this._self._c||s;return t("div",{staticClass:"pic-404"},[t("img",{staticClass:"pic-404__parent",attrs:{src:i("o2sD"),alt:"404"}}),this._v(" "),t("img",{staticClass:"pic-404__child left",attrs:{src:i("Jvyq"),alt:"404"}}),this._v(" "),t("img",{staticClass:"pic-404__child mid",attrs:{src:i("Jvyq"),alt:"404"}}),this._v(" "),t("img",{staticClass:"pic-404__child right",attrs:{src:i("Jvyq"),alt:"404"}})])}],e={name:"Page404",computed:{message:function(){return"There is nothing here"}}},r=(i("J67/"),i("KHd+")),l=Object(r.a)(e,function(){var s=this,t=s.$createElement,i=s._self._c||t;return i("div",{staticClass:"wscn-http404-container"},[i("div",{staticClass:"wscn-http404"},[s._m(0),s._v(" "),i("div",{staticClass:"bullshit"},[i("div",{staticClass:"bullshit__oops"},[s._v("OOPS!")]),s._v(" "),i("div",{staticClass:"bullshit__headline"},[s._v(s._s(s.message))]),s._v(" "),i("div",{staticClass:"bullshit__info"},[s._v("Please make sure you URL is correct")]),s._v(" "),i("router-link",{staticClass:"bullshit__return-home",attrs:{to:"/"}},[s._v("Go to the home page")])],1)])])},n,!1,null,"1d6b2d2a",null);l.options.__file="404.vue";t.default=l.exports},"J67/":function(s,t,i){"use strict";var n=i("QCkX");i.n(n).a},Jvyq:function(s,t){s.exports="data:image/png;base64,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"},QCkX:function(s,t,i){},o2sD:function(s,t,i){s.exports=i.p+"static/img/404.a57b6f3.png"}}]); -//# sourceMappingURL=chunk-0558.75954137.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-070d"],{"/eX4":function(s,t,i){"use strict";i.r(t);var n=[function(){var s=this.$createElement,t=this._self._c||s;return t("div",{staticClass:"pic-404"},[t("img",{staticClass:"pic-404__parent",attrs:{src:i("o2sD"),alt:"404"}}),this._v(" "),t("img",{staticClass:"pic-404__child left",attrs:{src:i("Jvyq"),alt:"404"}}),this._v(" "),t("img",{staticClass:"pic-404__child mid",attrs:{src:i("Jvyq"),alt:"404"}}),this._v(" "),t("img",{staticClass:"pic-404__child right",attrs:{src:i("Jvyq"),alt:"404"}})])}],e={name:"Page404",computed:{message:function(){return"There is nothing here"}}},r=(i("J67/"),i("KHd+")),l=Object(r.a)(e,function(){var s=this,t=s.$createElement,i=s._self._c||t;return i("div",{staticClass:"wscn-http404-container"},[i("div",{staticClass:"wscn-http404"},[s._m(0),s._v(" "),i("div",{staticClass:"bullshit"},[i("div",{staticClass:"bullshit__oops"},[s._v("OOPS!")]),s._v(" "),i("div",{staticClass:"bullshit__headline"},[s._v(s._s(s.message))]),s._v(" "),i("div",{staticClass:"bullshit__info"},[s._v("Please make sure you URL is correct")]),s._v(" "),i("router-link",{staticClass:"bullshit__return-home",attrs:{to:"/"}},[s._v("Go to the home page")])],1)])])},n,!1,null,"1d6b2d2a",null);l.options.__file="404.vue";t.default=l.exports},"J67/":function(s,t,i){"use strict";var n=i("QCkX");i.n(n).a},Jvyq:function(s,t){s.exports="data:image/png;base64,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"},QCkX:function(s,t,i){},o2sD:function(s,t,i){s.exports=i.p+"static/img/404.a57b6f3.png"}}]); +//# sourceMappingURL=chunk-070d.7e10a520.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0558.75954137.js.map b/priv/static/adminfe/static/js/chunk-070d.7e10a520.js.map similarity index 99% rename from priv/static/adminfe/static/js/chunk-0558.75954137.js.map rename to priv/static/adminfe/static/js/chunk-070d.7e10a520.js.map index e9e2affb6..6b75a215e 100644 --- a/priv/static/adminfe/static/js/chunk-0558.75954137.js.map +++ b/priv/static/adminfe/static/js/chunk-070d.7e10a520.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/views/errorPage/404.vue?e9e9","webpack:///./src/views/errorPage/404.vue?e36b","webpack:///src/views/errorPage/404.vue","webpack:///./src/views/errorPage/404.vue","webpack:///./src/views/errorPage/404.vue?ce30","webpack:///./src/assets/404_images/404_cloud.png","webpack:///./src/assets/404_images/404.png"],"names":["staticRenderFns","_h","this","$createElement","_c","_self","staticClass","attrs","src","__webpack_require__","alt","_v","errorPage_404vue_type_script_lang_js_","name","computed","message","component","Object","componentNormalizer","_vm","_m","_s","to","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_style_index_0_id_1d6b2d2a_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","n","module","exports","p"],"mappings":"+GAAA,IACAA,GAAA,WAAoC,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,YAAsBF,EAAA,OAAYE,YAAA,kBAAAC,OAAqCC,IAAMC,EAAQ,QAA6BC,IAAA,SAAlMR,KAAiNS,GAAA,KAAAP,EAAA,OAAwBE,YAAA,sBAAAC,OAAyCC,IAAMC,EAAQ,QAAmCC,IAAA,SAAnUR,KAAkVS,GAAA,KAAAP,EAAA,OAAwBE,YAAA,qBAAAC,OAAwCC,IAAMC,EAAQ,QAAmCC,IAAA,SAAncR,KAAkdS,GAAA,KAAAP,EAAA,OAAwBE,YAAA,uBAAAC,OAA0CC,IAAMC,EAAQ,QAAmCC,IAAA,aCDjaE,GCsBxMC,KAAA,UACAC,UACAC,QADA,WAEA,yDCjBAC,EAAgBC,OAAAC,EAAA,EAAAD,CACdL,EHTF,WAA0B,IAAAO,EAAAjB,KAAaD,EAAAkB,EAAAhB,eAA0BC,EAAAe,EAAAd,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,2BAAqCF,EAAA,OAAYE,YAAA,iBAA2Ba,EAAAC,GAAA,GAAAD,EAAAR,GAAA,KAAAP,EAAA,OAAkCE,YAAA,aAAuBF,EAAA,OAAYE,YAAA,mBAA6Ba,EAAAR,GAAA,WAAAQ,EAAAR,GAAA,KAAAP,EAAA,OAA0CE,YAAA,uBAAiCa,EAAAR,GAAAQ,EAAAE,GAAAF,EAAAJ,YAAAI,EAAAR,GAAA,KAAAP,EAAA,OAAsDE,YAAA,mBAA6Ba,EAAAR,GAAA,yCAAAQ,EAAAR,GAAA,KAAAP,EAAA,eAAgFE,YAAA,wBAAAC,OAA2Ce,GAAA,OAAUH,EAAAR,GAAA,kCGWzjBX,GACF,EACA,KACA,WACA,MAIAgB,EAAAO,QAAAC,OAAA,UACeC,EAAA,QAAAT,+CCpBf,IAAAU,EAAAjB,EAAA,QAAAA,EAAAkB,EAAAD,GAA6e,sBCA7eE,EAAAC,QAAA,0xMCAAD,EAAAC,QAAiBpB,EAAAqB,EAAuB","file":"static/js/chunk-0558.75954137.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"wscn-http404-container\"},[_c('div',{staticClass:\"wscn-http404\"},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"bullshit\"},[_c('div',{staticClass:\"bullshit__oops\"},[_vm._v(\"OOPS!\")]),_vm._v(\" \"),_c('div',{staticClass:\"bullshit__headline\"},[_vm._v(_vm._s(_vm.message))]),_vm._v(\" \"),_c('div',{staticClass:\"bullshit__info\"},[_vm._v(\"Please make sure you URL is correct\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"bullshit__return-home\",attrs:{\"to\":\"/\"}},[_vm._v(\"Go to the home page\")])],1)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"pic-404\"},[_c('img',{staticClass:\"pic-404__parent\",attrs:{\"src\":require(\"@/assets/404_images/404.png\"),\"alt\":\"404\"}}),_vm._v(\" \"),_c('img',{staticClass:\"pic-404__child left\",attrs:{\"src\":require(\"@/assets/404_images/404_cloud.png\"),\"alt\":\"404\"}}),_vm._v(\" \"),_c('img',{staticClass:\"pic-404__child mid\",attrs:{\"src\":require(\"@/assets/404_images/404_cloud.png\"),\"alt\":\"404\"}}),_vm._v(\" \"),_c('img',{staticClass:\"pic-404__child right\",attrs:{\"src\":require(\"@/assets/404_images/404_cloud.png\"),\"alt\":\"404\"}})])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./404.vue?vue&type=template&id=1d6b2d2a&scoped=true&\"\nimport script from \"./404.vue?vue&type=script&lang=js&\"\nexport * from \"./404.vue?vue&type=script&lang=js&\"\nimport style0 from \"./404.vue?vue&type=style&index=0&id=1d6b2d2a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1d6b2d2a\",\n null\n \n)\n\ncomponent.options.__file = \"404.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=style&index=0&id=1d6b2d2a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=style&index=0&id=1d6b2d2a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/img/404.a57b6f3.png\";"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/views/errorPage/404.vue?e9e9","webpack:///./src/views/errorPage/404.vue?e36b","webpack:///src/views/errorPage/404.vue","webpack:///./src/views/errorPage/404.vue","webpack:///./src/views/errorPage/404.vue?ce30","webpack:///./src/assets/404_images/404_cloud.png","webpack:///./src/assets/404_images/404.png"],"names":["staticRenderFns","_h","this","$createElement","_c","_self","staticClass","attrs","src","__webpack_require__","alt","_v","errorPage_404vue_type_script_lang_js_","name","computed","message","component","Object","componentNormalizer","_vm","_m","_s","to","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_style_index_0_id_1d6b2d2a_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","n","module","exports","p"],"mappings":"+GAAA,IACAA,GAAA,WAAoC,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,YAAsBF,EAAA,OAAYE,YAAA,kBAAAC,OAAqCC,IAAMC,EAAQ,QAA6BC,IAAA,SAAlMR,KAAiNS,GAAA,KAAAP,EAAA,OAAwBE,YAAA,sBAAAC,OAAyCC,IAAMC,EAAQ,QAAmCC,IAAA,SAAnUR,KAAkVS,GAAA,KAAAP,EAAA,OAAwBE,YAAA,qBAAAC,OAAwCC,IAAMC,EAAQ,QAAmCC,IAAA,SAAncR,KAAkdS,GAAA,KAAAP,EAAA,OAAwBE,YAAA,uBAAAC,OAA0CC,IAAMC,EAAQ,QAAmCC,IAAA,aCDjaE,GCsBxMC,KAAA,UACAC,UACAC,QADA,WAEA,yDCjBAC,EAAgBC,OAAAC,EAAA,EAAAD,CACdL,EHTF,WAA0B,IAAAO,EAAAjB,KAAaD,EAAAkB,EAAAhB,eAA0BC,EAAAe,EAAAd,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,2BAAqCF,EAAA,OAAYE,YAAA,iBAA2Ba,EAAAC,GAAA,GAAAD,EAAAR,GAAA,KAAAP,EAAA,OAAkCE,YAAA,aAAuBF,EAAA,OAAYE,YAAA,mBAA6Ba,EAAAR,GAAA,WAAAQ,EAAAR,GAAA,KAAAP,EAAA,OAA0CE,YAAA,uBAAiCa,EAAAR,GAAAQ,EAAAE,GAAAF,EAAAJ,YAAAI,EAAAR,GAAA,KAAAP,EAAA,OAAsDE,YAAA,mBAA6Ba,EAAAR,GAAA,yCAAAQ,EAAAR,GAAA,KAAAP,EAAA,eAAgFE,YAAA,wBAAAC,OAA2Ce,GAAA,OAAUH,EAAAR,GAAA,kCGWzjBX,GACF,EACA,KACA,WACA,MAIAgB,EAAAO,QAAAC,OAAA,UACeC,EAAA,QAAAT,+CCpBf,IAAAU,EAAAjB,EAAA,QAAAA,EAAAkB,EAAAD,GAA6e,sBCA7eE,EAAAC,QAAA,0xMCAAD,EAAAC,QAAiBpB,EAAAqB,EAAuB","file":"static/js/chunk-070d.7e10a520.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"wscn-http404-container\"},[_c('div',{staticClass:\"wscn-http404\"},[_vm._m(0),_vm._v(\" \"),_c('div',{staticClass:\"bullshit\"},[_c('div',{staticClass:\"bullshit__oops\"},[_vm._v(\"OOPS!\")]),_vm._v(\" \"),_c('div',{staticClass:\"bullshit__headline\"},[_vm._v(_vm._s(_vm.message))]),_vm._v(\" \"),_c('div',{staticClass:\"bullshit__info\"},[_vm._v(\"Please make sure you URL is correct\")]),_vm._v(\" \"),_c('router-link',{staticClass:\"bullshit__return-home\",attrs:{\"to\":\"/\"}},[_vm._v(\"Go to the home page\")])],1)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"pic-404\"},[_c('img',{staticClass:\"pic-404__parent\",attrs:{\"src\":require(\"@/assets/404_images/404.png\"),\"alt\":\"404\"}}),_vm._v(\" \"),_c('img',{staticClass:\"pic-404__child left\",attrs:{\"src\":require(\"@/assets/404_images/404_cloud.png\"),\"alt\":\"404\"}}),_vm._v(\" \"),_c('img',{staticClass:\"pic-404__child mid\",attrs:{\"src\":require(\"@/assets/404_images/404_cloud.png\"),\"alt\":\"404\"}}),_vm._v(\" \"),_c('img',{staticClass:\"pic-404__child right\",attrs:{\"src\":require(\"@/assets/404_images/404_cloud.png\"),\"alt\":\"404\"}})])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./404.vue?vue&type=template&id=1d6b2d2a&scoped=true&\"\nimport script from \"./404.vue?vue&type=script&lang=js&\"\nexport * from \"./404.vue?vue&type=script&lang=js&\"\nimport style0 from \"./404.vue?vue&type=style&index=0&id=1d6b2d2a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1d6b2d2a\",\n null\n \n)\n\ncomponent.options.__file = \"404.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=style&index=0&id=1d6b2d2a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./404.vue?vue&type=style&index=0&id=1d6b2d2a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/img/404.a57b6f3.png\";"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0778.b17650df.js.map b/priv/static/adminfe/static/js/chunk-0778.b17650df.js.map deleted file mode 100644 index 1f96c3236..000000000 --- a/priv/static/adminfe/static/js/chunk-0778.b17650df.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/invites/index.vue?8ebd","webpack:///./src/views/invites/index.vue?b523","webpack:///src/views/invites/index.vue","webpack:///./src/views/invites/index.vue","webpack:///./src/views/invites/index.vue?0fc1","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue"],"names":["views_invitesvue_type_script_lang_js_","components","RebootButton","data","rules","email","validator","this","validateEmail","trigger","newTokenForm","maxUse","expiresAt","inviteUserForm","name","createTokenDialogVisible","inviteUserDialogVisible","computed","objectSpread_default","Object","vuex_esm","getLabelWidth","isDesktop","inviteLink","concat","utils","authHost","newToken","token","$store","state","app","device","loading","invites","tokens","inviteTokens","mounted","dispatch","methods","closeDialogWindow","$data","createToken","inviteUserViaEmail","_inviteUserViaEmail","asyncToGenerator_default","regenerator_default","a","mark","_callee2","_this","wrap","_context2","prev","next","$refs","validate","_ref","_callee","valid","_context","$message","type","message","$t","abrupt","stop","_x","apply","arguments","revokeInviteToken","rule","value","callback","Error","validEmail","test","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","_v","_s","on","click","$event","attrs","visible","show-close","title","custom-class","update:visible","ref","model","label-width","status-icon","label","min","size","$$v","$set","expression","placeholder","value-format","slot","href","underline","target","_e","prop","autofocus","directives","rawName","default-sort","order","min-width","sortable","align","header-align","scopedSlots","_u","key","fn","scope","row","used","disable-transitions","nativeOn","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","components_RebootButtonvue_type_script_lang_js_","needReboot","restartApp","_restartApp","t0","lang","t","content","placement"],"mappings":"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","file":"static/js/chunk-0778.b17650df.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"invites-container\"},[_c('div',{staticClass:\"invites-header-container\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('invites.inviteTokens')))]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"actions-container\"},[_c('el-button',{staticClass:\"create-invite-token\",on:{\"click\":function($event){_vm.createTokenDialogVisible = true}}},[_c('span',[_c('i',{staticClass:\"icon el-icon-plus\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('invites.createInviteToken'))+\"\\n \")])]),_vm._v(\" \"),_c('el-button',{staticClass:\"invite-via-email\",on:{\"click\":function($event){_vm.inviteUserDialogVisible = true}}},[_c('span',[_c('i',{staticClass:\"icon el-icon-message\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('invites.inviteUserViaEmail'))+\"\\n \")])])],1),_vm._v(\" \"),_c('el-dialog',{attrs:{\"visible\":_vm.createTokenDialogVisible,\"show-close\":false,\"title\":_vm.$t('invites.createInviteToken'),\"custom-class\":\"create-new-token-dialog\"},on:{\"update:visible\":function($event){_vm.createTokenDialogVisible=$event}}},[_c('el-form',{ref:\"newTokenForm\",attrs:{\"model\":_vm.newTokenForm,\"label-width\":_vm.getLabelWidth,\"status-icon\":\"\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.maxUse')}},[_c('el-input-number',{attrs:{\"min\":0,\"size\":_vm.isDesktop ? 'medium' : 'small',\"name\":\"maxUse\"},model:{value:(_vm.newTokenForm.maxUse),callback:function ($$v) {_vm.$set(_vm.newTokenForm, \"maxUse\", $$v)},expression:\"newTokenForm.maxUse\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.expiresAt')}},[_c('el-date-picker',{staticClass:\"pick-date\",attrs:{\"placeholder\":_vm.$t('invites.pickDate'),\"type\":\"date\",\"name\":\"date\",\"value-format\":\"yyyy-MM-dd\"},model:{value:(_vm.newTokenForm.expiresAt),callback:function ($$v) {_vm.$set(_vm.newTokenForm, \"expiresAt\", $$v)},expression:\"newTokenForm.expiresAt\"}})],1)],1),_vm._v(\" \"),_c('span',{attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{staticClass:\"invites-close-dialog\",on:{\"click\":_vm.closeDialogWindow}},[_vm._v(_vm._s(_vm.$t('invites.cancel')))]),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.createToken}},[_vm._v(_vm._s(_vm.$t('invites.create')))])],1),_vm._v(\" \"),('token' in _vm.newToken)?_c('el-card',[_c('div',{staticClass:\"clearfix\",attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('span',[_vm._v(_vm._s(_vm.$t('invites.tokenCreated')))])]),_vm._v(\" \"),_c('el-form',{staticClass:\"new-token-card\",attrs:{\"label-width\":\"80px\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.inviteLink')}},[_c('el-link',{attrs:{\"href\":_vm.inviteLink,\"underline\":false,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.inviteLink)+\"\\n \")])],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.token')}},[_vm._v(\"\\n \"+_vm._s(_vm.newToken.token)+\"\\n \")]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.maxUse')}},[_vm._v(\"\\n \"+_vm._s(_vm.newToken.maxUse)+\"\\n \")]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.expiresAt')}},[_vm._v(\"\\n \"+_vm._s(_vm.newToken.expiresAt || '(not set)')+\"\\n \")])],1)],1):_vm._e()],1),_vm._v(\" \"),_c('el-dialog',{attrs:{\"visible\":_vm.inviteUserDialogVisible,\"show-close\":false,\"title\":_vm.$t('invites.sendRegistration'),\"custom-class\":\"invite-via-email-dialog\"},on:{\"update:visible\":function($event){_vm.inviteUserDialogVisible=$event}}},[_c('div',[_c('p',{staticClass:\"info\"},[_vm._v(_vm._s(_vm.$t('invites.inviteViaEmailAlert')))]),_vm._v(\" \"),_c('el-form',{ref:\"inviteUserForm\",attrs:{\"model\":_vm.inviteUserForm,\"rules\":_vm.rules,\"label-width\":_vm.getLabelWidth,\"status-icon\":\"\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.email'),\"prop\":\"email\"}},[_c('el-input',{attrs:{\"name\":\"email\",\"type\":\"email\",\"autofocus\":\"\"},model:{value:(_vm.inviteUserForm.email),callback:function ($$v) {_vm.$set(_vm.inviteUserForm, \"email\", $$v)},expression:\"inviteUserForm.email\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.name'),\"prop\":\"name\"}},[_c('el-input',{attrs:{\"name\":\"name\"},model:{value:(_vm.inviteUserForm.name),callback:function ($$v) {_vm.$set(_vm.inviteUserForm, \"name\", $$v)},expression:\"inviteUserForm.name\"}})],1)],1)],1),_vm._v(\" \"),_c('span',{attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":_vm.closeDialogWindow}},[_vm._v(_vm._s(_vm.$t('invites.cancel')))]),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.inviteUserViaEmail}},[_vm._v(_vm._s(_vm.$t('invites.create')))])],1)]),_vm._v(\" \"),_c('el-table',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"invite-token-table\",attrs:{\"data\":_vm.tokens,\"default-sort\":{prop: 'used', order: 'ascending'}}},[(_vm.isDesktop)?_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.id'),\"min-width\":\"60\",\"prop\":\"id\",\"sortable\":\"\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.token'),\"min-width\":_vm.isDesktop ? 320 : 120,\"prop\":\"token\"}}),_vm._v(\" \"),(_vm.isDesktop)?_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.expiresAt'),\"align\":\"center\",\"header-align\":\"center\",\"min-width\":\"110\",\"prop\":\"expires_at\",\"sortable\":\"\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.maxUse'),\"align\":\"center\",\"header-align\":\"center\",\"min-width\":\"60\",\"prop\":\"max_use\",\"sortable\":\"\"}}),_vm._v(\" \"),(_vm.isDesktop)?_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.uses'),\"align\":\"center\",\"header-align\":\"center\",\"min-width\":\"60\",\"prop\":\"uses\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.used'),\"min-width\":_vm.isDesktop ? 60 : 50,\"align\":\"center\",\"header-align\":\"center\",\"prop\":\"used\",\"sortable\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.used ? 'danger' : 'success',\"disable-transitions\":\"\"}},[_vm._v(\"\\n \"+_vm._s(scope.row.used ? _vm.$t('invites.used') : _vm.$t('invites.active'))+\"\\n \")])]}}])}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.actions'),\"min-width\":_vm.isDesktop ? 100 : 50,\"align\":\"center\",\"header-align\":\"center\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},nativeOn:{\"click\":function($event){return _vm.revokeInviteToken(scope.row.token)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('invites.revoke'))+\"\\n \")])]}}])})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=1ca5df66&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js b/priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js new file mode 100644 index 000000000..232f0d447 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-0cbc"],{"/Cm6":function(e,t,s){},"53Av":function(e,t,s){"use strict";var r=s("lOBV");s.n(r).a},"6eCR":function(e,t,s){"use strict";var r=s("Jdpf");s.n(r).a},"9/5/":function(e,t,s){(function(t){var s="Expected a function",r=NaN,n="[object Symbol]",i=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof t&&t&&t.Object===Object&&t,d="object"==typeof self&&self&&self.Object===Object&&self,p=l||d||Function("return this")(),f=Object.prototype.toString,v=Math.max,m=Math.min,h=function(){return p.Date.now()};function g(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function _(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&f.call(e)==n}(e))return r;if(g(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=g(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(i,"");var s=a.test(e);return s||c.test(e)?u(e.slice(2),s?2:8):o.test(e)?r:+e}e.exports=function(e,t,r){var n,i,o,a,c,u,l=0,d=!1,p=!1,f=!0;if("function"!=typeof e)throw new TypeError(s);function w(t){var s=n,r=i;return n=i=void 0,l=t,a=e.apply(r,s)}function $(e){var s=e-u;return void 0===u||s>=t||s<0||p&&e-l>=o}function b(){var e=h();if($(e))return k(e);c=setTimeout(b,function(e){var s=t-(e-u);return p?m(s,o-(e-l)):s}(e))}function k(e){return c=void 0,f&&n?w(e):(n=i=void 0,a)}function y(){var e=h(),s=$(e);if(n=arguments,i=this,u=e,s){if(void 0===c)return function(e){return l=e,c=setTimeout(b,t),d?w(e):a}(u);if(p)return c=setTimeout(b,t),w(u)}return void 0===c&&(c=setTimeout(b,t)),a}return t=_(t)||0,g(r)&&(d=!!r.leading,o=(p="maxWait"in r)?v(_(r.maxWait)||0,t):o,f="trailing"in r?!!r.trailing:f),y.cancel=function(){void 0!==c&&clearTimeout(c),l=0,n=u=i=c=void 0},y.flush=function(){return void 0===c?a:k(h())},y}}).call(this,s("yLpj"))},DPTh:function(e,t,s){"use strict";var r=s("vg5t");s.n(r).a},Jdpf:function(e,t,s){},RGjw:function(e,t,s){"use strict";s.r(t);var r=s("o0o1"),n=s.n(r),i=s("yXPU"),o=s.n(i),a=s("9/5/"),c=s.n(a),u=s("ZhIB"),l=s.n(u),d=s("lSNA"),p=s.n(d),f=s("MVZn"),v=s.n(f),m={data:function(){return{value:[]}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{removeOppositeFilters:function(){var e=Object.keys(this.$store.state.users.filters).length,t=this.$data.value.slice(),s=t.indexOf("local"),r=t.indexOf("external"),n=t.indexOf("active"),i=t.indexOf("deactivated");if(t.length===e)return[];if(s>-1&&r>-1){var o=s>r?r:s;t.splice(o,1)}else if(n>-1&&i>-1){var a=n>i?i:n;t.splice(a,1)}return t},toggleFilters:function(){this.$data.value=this.removeOppositeFilters();var e=this.$data.value.reduce(function(e,t){return v()({},e,p()({},t,!0))},{});this.$store.dispatch("ToggleUsersFilter",e)}}},h=(s("Sq9Q"),s("KHd+")),g=Object(h.a)(m,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("el-select",{staticClass:"select-field",attrs:{clearable:e.isDesktop,placeholder:e.$t("usersFilter.inputPlaceholder"),multiple:""},on:{change:e.toggleFilters},model:{value:e.value,callback:function(t){e.value=t},expression:"value"}},[s("el-option-group",{attrs:{label:e.$t("usersFilter.byAccountType")}},[s("el-option",{attrs:{value:"local"}},[e._v(e._s(e.$t("usersFilter.local")))]),e._v(" "),s("el-option",{attrs:{value:"external"}},[e._v(e._s(e.$t("usersFilter.external")))])],1),e._v(" "),s("el-option-group",{attrs:{label:e.$t("usersFilter.byStatus")}},[s("el-option",{attrs:{value:"active"}},[e._v(e._s(e.$t("usersFilter.active")))]),e._v(" "),s("el-option",{attrs:{value:"deactivated"}},[e._v(e._s(e.$t("usersFilter.deactivated")))])],1)],1)},[],!1,null,"78fa3c24",null);g.options.__file="UsersFilter.vue";var _=g.exports,w=s("i7Kn"),$={name:"NewAccountDialog",props:{dialogFormVisible:{type:Boolean,default:function(){return!1}}},data:function(){return{newUserForm:{nickname:"",email:"",password:""},rules:{nickname:[{validator:this.validateUsername,trigger:"blur"}],email:[{validator:this.validateEmail,trigger:"blur"}],password:[{validator:this.validatePassword,trigger:"blur"}]}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isVisible:{get:function(){return this.$props.dialogFormVisible},set:function(){this.closeDialogWindow()}},getLabelWidth:function(){return this.isDesktop?"120px":"85px"}},methods:{closeDialogWindow:function(){this.$emit("closeWindow")},resetForm:function(){var e=this;this.$nextTick(function(){e.$refs.newUserForm.resetFields()})},submitForm:function(e){var t=this;this.$refs[e].validate(function(e){if(!e)return t.$message({type:"error",message:t.$t("users.submitFormError")}),!1;t.$emit("createNewAccount",t.$data.newUserForm)})},validateEmail:function(e,t,s){return""===t?s(new Error(this.$t("users.emptyEmailError"))):this.validEmail(t)?s():s(new Error(this.$t("users.invalidEmailError")))},validatePassword:function(e,t,s){return""===t?s(new Error(this.$t("users.emptyPasswordError"))):s()},validateUsername:function(e,t,s){return""===t?s(new Error(this.$t("users.emptyNicknameError"))):this.validNickname(t)?s():s(new Error(this.$t("users.invalidNicknameError")))},validEmail:function(e){return/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(e)},validNickname:function(e){return/^[a-zA-Z\d]+$/.test(e)}}},b=(s("DPTh"),Object(h.a)($,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("el-dialog",{attrs:{visible:e.isVisible,"show-close":!1,title:e.$t("users.createAccount"),"custom-class":"create-user-dialog"},on:{"update:visible":function(t){e.isVisible=t},open:e.resetForm}},[s("el-form",{ref:"newUserForm",attrs:{model:e.newUserForm,rules:e.rules,"label-width":e.getLabelWidth,"status-icon":""}},[s("el-form-item",{staticClass:"create-account-form-item",attrs:{label:e.$t("users.username"),prop:"nickname"}},[s("el-input",{attrs:{name:"nickname",autofocus:""},model:{value:e.newUserForm.nickname,callback:function(t){e.$set(e.newUserForm,"nickname",t)},expression:"newUserForm.nickname"}})],1),e._v(" "),s("el-form-item",{staticClass:"create-account-form-item",attrs:{label:e.$t("users.email"),prop:"email"}},[s("el-input",{attrs:{name:"email",type:"email"},model:{value:e.newUserForm.email,callback:function(t){e.$set(e.newUserForm,"email",t)},expression:"newUserForm.email"}})],1),e._v(" "),s("el-form-item",{staticClass:"create-account-form-item-without-margin",attrs:{label:e.$t("users.password"),prop:"password"}},[s("el-input",{attrs:{type:"password",name:"password",autocomplete:"off"},model:{value:e.newUserForm.password,callback:function(t){e.$set(e.newUserForm,"password",t)},expression:"newUserForm.password"}})],1)],1),e._v(" "),s("span",{attrs:{slot:"footer"},slot:"footer"},[s("el-button",{on:{click:e.closeDialogWindow}},[e._v(e._s(e.$t("users.cancel")))]),e._v(" "),s("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.submitForm("newUserForm")}}},[e._v(e._s(e.$t("users.create")))])],1)],1)},[],!1,null,null,null));b.options.__file="NewAccountDialog.vue";var k=b.exports,y=s("tPM3"),D=s("rIUS"),C=s("WjBP"),A={name:"Users",components:{NewAccountDialog:k,ModerationDropdown:y.a,MultipleUsersMenu:w.a,RebootButton:D.a,ResetPasswordDialog:C.a,UsersFilter:_},data:function(){return{search:"",selectedUsers:[],createAccountDialogOpen:!1,resetPasswordDialogOpen:!1}},computed:{loading:function(){return this.$store.state.users.loading},normalizedUsersCount:function(){return l()(this.$store.state.users.totalUsersCount).format("0a")},pageSize:function(){return this.$store.state.users.pageSize},currentPage:function(){return this.$store.state.users.currentPage},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},users:function(){return this.$store.state.users.fetchedUsers},usersCount:function(){return this.$store.state.users.totalUsersCount},width:function(){return!!this.isMobile&&55}},created:function(){var e=this;this.handleDebounceSearchInput=c()(function(t){e.$store.dispatch("SearchUsers",{query:t,page:1})},500)},mounted:function(){this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchUsers",{page:1})},destroyed:function(){this.$store.dispatch("ClearUsersState")},methods:{activationIcon:function(e){return e?"el-icon-error":"el-icon-success"},clearSelection:function(){this.$refs.usersTable.clearSelection()},closeResetPasswordDialog:function(){this.resetPasswordDialogOpen=!1,this.$store.dispatch("RemovePasswordToken")},createNewAccount:function(){var e=o()(n.a.mark(function e(t){return n.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.$store.dispatch("CreateNewAccount",t);case 2:this.createAccountDialogOpen=!1;case 3:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}(),getFirstLetter:function(e){return e.charAt(0).toUpperCase()},handlePageChange:function(e){var t=this.$store.state.users.searchQuery;""===t?this.$store.dispatch("FetchUsers",{page:e}):this.$store.dispatch("SearchUsers",{query:t,page:e})},handleRowClick:function(e){e.id&&this.$router.push({name:"UsersShow",params:{id:e.id}})},handleSelectionChange:function(e){this.$data.selectedUsers=e},openResetPasswordDialog:function(){this.resetPasswordDialogOpen=!0},propertyExists:function(e,t){return e[t]},showDeactivatedButton:function(e){return this.$store.state.user.id!==e}}},O=(s("6eCR"),Object(h.a)(A,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"users-container"},[s("div",{staticClass:"users-header-container"},[s("h1",[e._v("\n "+e._s(e.$t("users.users"))+"\n "),s("span",{staticClass:"user-count"},[e._v("("+e._s(e.normalizedUsersCount)+")")])]),e._v(" "),s("reboot-button")],1),e._v(" "),s("div",{staticClass:"filter-container"},[s("users-filter"),e._v(" "),s("el-input",{staticClass:"search",attrs:{placeholder:e.$t("users.search"),"prefix-icon":"el-icon-search"},on:{input:e.handleDebounceSearchInput},model:{value:e.search,callback:function(t){e.search=t},expression:"search"}})],1),e._v(" "),s("div",{staticClass:"actions-container"},[s("el-button",{staticClass:"actions-button",on:{click:function(t){e.createAccountDialogOpen=!0}}},[s("span",{staticClass:"create-account"},[s("i",{staticClass:"el-icon-plus"}),e._v("\n "+e._s(e.$t("users.createAccount"))+"\n ")])]),e._v(" "),s("multiple-users-menu",{attrs:{"selected-users":e.selectedUsers},on:{"apply-action":e.clearSelection}})],1),e._v(" "),s("new-account-dialog",{attrs:{"dialog-form-visible":e.createAccountDialogOpen},on:{createNewAccount:e.createNewAccount,closeWindow:function(t){e.createAccountDialogOpen=!1}}}),e._v(" "),s("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],ref:"usersTable",staticStyle:{width:"100%"},attrs:{data:e.users,"row-key":"id"},on:{"row-click":function(t){return e.handleRowClick(t)},"selection-change":e.handleSelectionChange}},[e.isDesktop?s("el-table-column",{attrs:{type:"selection","reserve-selection":"",width:"44",align:"center"}}):e._e(),e._v(" "),s("el-table-column",{attrs:{"min-width":e.width,label:e.$t("users.id"),prop:"id"}}),e._v(" "),s("el-table-column",{attrs:{label:e.$t("users.name"),prop:"nickname"},scopedSlots:e._u([{key:"default",fn:function(t){return[e._v("\n "+e._s(t.row.nickname)+"\n "),e.isDesktop?s("el-tag",{attrs:{type:"info",size:"mini"}},[s("span",[e._v(e._s(t.row.local?e.$t("users.local"):e.$t("users.external")))])]):e._e()]}}])}),e._v(" "),s("el-table-column",{attrs:{"min-width":e.width,label:e.$t("users.status")},scopedSlots:e._u([{key:"default",fn:function(t){return[s("el-tag",{attrs:{type:t.row.deactivated?"danger":"success"}},[e.isDesktop?s("span",[e._v(e._s(t.row.deactivated?e.$t("users.deactivated"):e.$t("users.active")))]):s("i",{class:e.activationIcon(t.row.deactivated)})]),e._v(" "),t.row.roles.admin?s("el-tag",[s("span",[e._v(e._s(e.isDesktop?e.$t("users.admin"):e.getFirstLetter(e.$t("users.admin"))))])]):e._e(),e._v(" "),t.row.roles.moderator?s("el-tag",[s("span",[e._v(e._s(e.isDesktop?e.$t("users.moderator"):e.getFirstLetter(e.$t("users.moderator"))))])]):e._e(),e._v(" "),s("el-tooltip",{attrs:{content:e.$t("users.unconfirmedEmail"),effect:"dark"}},[t.row.confirmation_pending?s("el-tag",{attrs:{type:"info"}},[e._v("\n "+e._s(e.isDesktop?e.$t("users.unconfirmed"):e.getFirstLetter(e.$t("users.unconfirmed")))+"\n ")]):e._e()],1)]}}])}),e._v(" "),s("el-table-column",{attrs:{label:e.$t("users.actions"),fixed:"right"},scopedSlots:e._u([{key:"default",fn:function(t){return[e.propertyExists(t.row,"nickname")?s("moderation-dropdown",{attrs:{user:t.row,page:"users"},on:{"open-reset-token-dialog":e.openResetPasswordDialog}}):s("el-button",{attrs:{type:"text",disabled:""}},[e._v("\n "+e._s(e.$t("users.moderation"))+"\n "),e.isDesktop?s("i",{staticClass:"el-icon-arrow-down el-icon--right"}):e._e()])]}}])})],1),e._v(" "),s("reset-password-dialog",{attrs:{"reset-password-dialog-open":e.resetPasswordDialogOpen},on:{"close-reset-token-dialog":e.closeResetPasswordDialog}}),e._v(" "),e.loading?e._e():s("div",{staticClass:"pagination"},[s("el-pagination",{attrs:{total:e.usersCount,"current-page":e.currentPage,"page-size":e.pageSize,background:"",layout:"prev, pager, next"},on:{"current-change":e.handlePageChange}})],1)],1)},[],!1,null,null,null));O.options.__file="index.vue";t.default=O.exports},Sq9Q:function(e,t,s){"use strict";var r=s("/Cm6");s.n(r).a},WjBP:function(e,t,s){"use strict";var r={name:"ResetPasswordDialog",props:{resetPasswordDialogOpen:{type:Boolean,default:!1}},computed:{dialogOpen:function(){return this.resetPasswordDialogOpen},loading:function(){return this.$store.state.users.loading},passwordResetLink:function(){return this.$store.state.users.passwordResetToken.link},passwordResetToken:function(){return this.$store.state.users.passwordResetToken.token}},methods:{closeResetPasswordDialog:function(){this.$emit("close-reset-token-dialog")}}},n=s("KHd+"),i=Object(n.a)(r,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("el-dialog",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],attrs:{visible:e.dialogOpen,title:e.$t("users.passwordResetTokenCreated"),"custom-class":"password-reset-token-dialog"},on:{close:e.closeResetPasswordDialog}},[s("div",[s("p",{staticClass:"password-reset-token"},[e._v(e._s(e.$t("users.passwordResetTokenGenerated"))+" "+e._s(e.passwordResetToken))]),e._v(" "),s("p",[e._v(e._s(e.$t("users.linkToResetPassword"))+"\n "),s("a",{staticClass:"reset-password-link",attrs:{href:e.passwordResetLink,target:"_blank"}},[e._v(e._s(e.passwordResetLink))])])])])},[],!1,null,null,null);i.options.__file="ResetPasswordDialog.vue";t.a=i.exports},lOBV:function(e,t,s){},tPM3:function(e,t,s){"use strict";var r={name:"ModerationDropdown",props:{user:{type:Object,default:function(){return{}}},page:{type:String,default:"users"},statusId:{type:String,default:""}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{getPasswordResetToken:function(e){this.$emit("open-reset-token-dialog"),this.$store.dispatch("GetPasswordResetToken",e)},handleConfirmationResend:function(e){this.$store.dispatch("ResendConfirmationEmail",[e])},handleDeletion:function(e){this.$store.dispatch("DeleteUsers",{users:[e],_userId:e.id})},handleEmailConfirmation:function(e){this.$store.dispatch("ConfirmUsersEmail",{users:[e],_userId:e.id,_statusId:this.statusId})},requirePasswordReset:function(e){this.$store.state.user.nodeInfo.metadata.mailerEnabled?this.$store.dispatch("RequirePasswordReset",[e]):this.$alert(this.$t("users.mailerMustBeEnabled"),"Error",{type:"error"})},showAdminAction:function(e){var t=e.local,s=e.id;return t&&this.showDeactivatedButton(s)},showDeactivatedButton:function(e){return this.$store.state.user.id!==e},toggleActivation:function(e){e.deactivated?this.$store.dispatch("ActivateUsers",{users:[e],_userId:e.id}):this.$store.dispatch("DeactivateUsers",{users:[e],_userId:e.id})},toggleTag:function(e,t){e.tags.includes(t)?this.$store.dispatch("RemoveTag",{users:[e],tag:t,_userId:e.id,_statusId:this.statusId}):this.$store.dispatch("AddTag",{users:[e],tag:t,_userId:e.id,_statusId:this.statusId})},toggleUserRight:function(e,t){e.roles[t]?this.$store.dispatch("DeleteRight",{users:[e],right:t,_userId:e.id,_statusId:this.statusId}):this.$store.dispatch("AddRight",{users:[e],right:t,_userId:e.id,_statusId:this.statusId})}}},n=(s("53Av"),s("KHd+")),i=Object(n.a)(r,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("el-dropdown",{attrs:{"hide-on-click":!1,size:"small",trigger:"click",placement:"top-start"},nativeOn:{click:function(e){e.stopPropagation()}}},[s("div",["users"===e.page?s("el-button",{staticClass:"el-dropdown-link",attrs:{type:"text"}},[e._v("\n "+e._s(e.$t("users.moderation"))+"\n "),e.isDesktop?s("i",{staticClass:"el-icon-arrow-down el-icon--right"}):e._e()]):e._e(),e._v(" "),"userPage"===e.page||"statusPage"===e.page?s("el-button",{staticClass:"moderate-user-button"},[s("span",{staticClass:"moderate-user-button-container"},[s("span",[s("i",{staticClass:"el-icon-edit"}),e._v("\n "+e._s(e.$t("users.moderateUser"))+"\n ")]),e._v(" "),s("i",{staticClass:"el-icon-arrow-down el-icon--right"})])]):e._e()],1),e._v(" "),s("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[e.showAdminAction(e.user)?s("el-dropdown-item",{nativeOn:{click:function(t){return e.toggleUserRight(e.user,"admin")}}},[e._v("\n "+e._s(e.user.roles.admin?e.$t("users.revokeAdmin"):e.$t("users.grantAdmin"))+"\n ")]):e._e(),e._v(" "),e.showAdminAction(e.user)?s("el-dropdown-item",{nativeOn:{click:function(t){return e.toggleUserRight(e.user,"moderator")}}},[e._v("\n "+e._s(e.user.roles.moderator?e.$t("users.revokeModerator"):e.$t("users.grantModerator"))+"\n ")]):e._e(),e._v(" "),e.showDeactivatedButton(e.user.id)&&"statusPage"!==e.page?s("el-dropdown-item",{attrs:{divided:e.showAdminAction(e.user)},nativeOn:{click:function(t){return e.toggleActivation(e.user)}}},[e._v("\n "+e._s(e.user.deactivated?e.$t("users.activateAccount"):e.$t("users.deactivateAccount"))+"\n ")]):e._e(),e._v(" "),e.showDeactivatedButton(e.user.id)&&"statusPage"!==e.page?s("el-dropdown-item",{nativeOn:{click:function(t){return e.handleDeletion(e.user)}}},[e._v("\n "+e._s(e.$t("users.deleteAccount"))+"\n ")]):e._e(),e._v(" "),e.user.local&&e.user.confirmation_pending?s("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(t){return e.handleEmailConfirmation(e.user)}}},[e._v("\n "+e._s(e.$t("users.confirmAccount"))+"\n ")]):e._e(),e._v(" "),e.user.local&&e.user.confirmation_pending?s("el-dropdown-item",{nativeOn:{click:function(t){return e.handleConfirmationResend(e.user)}}},[e._v("\n "+e._s(e.$t("users.resendConfirmation"))+"\n ")]):e._e(),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("force_nsfw")},attrs:{divided:e.showAdminAction(e.user)},nativeOn:{click:function(t){return e.toggleTag(e.user,"force_nsfw")}}},[e._v("\n "+e._s(e.$t("users.forceNsfw"))+"\n "),e.user.tags.includes("force_nsfw")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("strip_media")},nativeOn:{click:function(t){return e.toggleTag(e.user,"strip_media")}}},[e._v("\n "+e._s(e.$t("users.stripMedia"))+"\n "),e.user.tags.includes("strip_media")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("force_unlisted")},nativeOn:{click:function(t){return e.toggleTag(e.user,"force_unlisted")}}},[e._v("\n "+e._s(e.$t("users.forceUnlisted"))+"\n "),e.user.tags.includes("force_unlisted")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("sandbox")},nativeOn:{click:function(t){return e.toggleTag(e.user,"sandbox")}}},[e._v("\n "+e._s(e.$t("users.sandbox"))+"\n "),e.user.tags.includes("sandbox")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),e.user.local?s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("disable_remote_subscription")},nativeOn:{click:function(t){return e.toggleTag(e.user,"disable_remote_subscription")}}},[e._v("\n "+e._s(e.$t("users.disableRemoteSubscription"))+"\n "),e.user.tags.includes("disable_remote_subscription")?s("i",{staticClass:"el-icon-check"}):e._e()]):e._e(),e._v(" "),e.user.local?s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("disable_any_subscription")},nativeOn:{click:function(t){return e.toggleTag(e.user,"disable_any_subscription")}}},[e._v("\n "+e._s(e.$t("users.disableAnySubscription"))+"\n "),e.user.tags.includes("disable_any_subscription")?s("i",{staticClass:"el-icon-check"}):e._e()]):e._e(),e._v(" "),e.user.local?s("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(t){return e.getPasswordResetToken(e.user.nickname)}}},[e._v("\n "+e._s(e.$t("users.getPasswordResetToken"))+"\n ")]):e._e(),e._v(" "),e.user.local?s("el-dropdown-item",{nativeOn:{click:function(t){return e.requirePasswordReset(e.user)}}},[e._v("\n "+e._s(e.$t("users.requirePasswordReset"))+"\n ")]):e._e()],1)],1)},[],!1,null,null,null);i.options.__file="ModerationDropdown.vue";t.a=i.exports},vg5t:function(e,t,s){}}]); +//# sourceMappingURL=chunk-0cbc.43ff796f.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js.map b/priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js.map new file mode 100644 index 000000000..dbca0ba8e --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/users/components/ModerationDropdown.vue?e3f0","webpack:///./src/views/users/index.vue?1afe","webpack:///./node_modules/lodash.debounce/index.js","webpack:///./src/views/users/components/NewAccountDialog.vue?d353","webpack:///./src/views/users/index.vue?70f1","webpack:///./src/views/users/components/UsersFilter.vue?6a82","webpack:///src/views/users/components/UsersFilter.vue","webpack:///./src/views/users/components/UsersFilter.vue","webpack:///./src/views/users/components/UsersFilter.vue?5e82","webpack:///./src/views/users/components/NewAccountDialog.vue?9018","webpack:///src/views/users/components/NewAccountDialog.vue","webpack:///./src/views/users/components/NewAccountDialog.vue","webpack:///./src/views/users/components/NewAccountDialog.vue?43a7","webpack:///./src/views/users/index.vue?0a29","webpack:///src/views/users/index.vue","webpack:///./src/views/users/index.vue","webpack:///./src/views/users/components/UsersFilter.vue?f412","webpack:///./src/views/users/components/ResetPasswordDialog.vue?0b2b","webpack:///./src/views/users/components/ResetPasswordDialog.vue?31da","webpack:///src/views/users/components/ResetPasswordDialog.vue","webpack:///./src/views/users/components/ResetPasswordDialog.vue","webpack:///./src/views/users/components/ModerationDropdown.vue?ff75","webpack:///./src/views/users/components/ModerationDropdown.vue?676e","webpack:///src/views/users/components/ModerationDropdown.vue","webpack:///./src/views/users/components/ModerationDropdown.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ModerationDropdown_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","global","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","Object","freeSelf","self","root","Function","objectToString","prototype","toString","nativeMax","Math","max","nativeMin","min","now","Date","isObject","value","type","toNumber","isObjectLike","call","isSymbol","other","valueOf","replace","isBinary","test","slice","module","exports","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","undefined","apply","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","remainingWait","debounced","isInvoking","arguments","this","leadingEdge","cancel","clearTimeout","flush","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_NewAccountDialog_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","components_UsersFiltervue_type_script_lang_js_","data","computed","isDesktop","$store","state","app","device","methods","removeOppositeFilters","filtersQuantity","keys","users","filters","length","currentFilters","$data","indexOfLocal","indexOf","indexOfExternal","indexOfActive","indexOfDeactivated","filterToRemove","splice","_filterToRemove","toggleFilters","reduce","acc","filter","objectSpread_default","defineProperty_default","dispatch","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","clearable","placeholder","$t","multiple","on","change","model","callback","$$v","expression","label","_v","_s","__file","UsersFilter","components_NewAccountDialogvue_type_script_lang_js_","name","props","dialogFormVisible","Boolean","default","newUserForm","nickname","email","password","rules","validator","validateUsername","trigger","validateEmail","validatePassword","isVisible","get","$props","set","closeDialogWindow","getLabelWidth","$emit","resetForm","_this","$nextTick","$refs","resetFields","submitForm","formName","_this2","validate","valid","$message","message","rule","Error","validEmail","validNickname","NewAccountDialog_component","visible","show-close","title","custom-class","update:visible","$event","open","ref","label-width","status-icon","prop","autofocus","$set","autocomplete","slot","click","NewAccountDialog","views_usersvue_type_script_lang_js_","components","ModerationDropdown","MultipleUsersMenu","RebootButton","ResetPasswordDialog","search","selectedUsers","createAccountDialogOpen","resetPasswordDialogOpen","loading","normalizedUsersCount","numeral_default","totalUsersCount","format","pageSize","currentPage","isMobile","fetchedUsers","usersCount","width","created","handleDebounceSearchInput","lodash_debounce_default","query","page","mounted","destroyed","activationIcon","status","clearSelection","usersTable","closeResetPasswordDialog","createNewAccount","_createNewAccount","asyncToGenerator_default","regenerator_default","a","mark","_callee","accountData","wrap","_context","prev","next","stop","_x","getFirstLetter","str","charAt","toUpperCase","handlePageChange","searchQuery","handleRowClick","row","id","$router","push","params","handleSelectionChange","openResetPasswordDialog","propertyExists","account","property","showDeactivatedButton","user","users_component","prefix-icon","input","selected-users","apply-action","dialog-form-visible","closeWindow","directives","rawName","staticStyle","row-key","row-click","selection-change","reserve-selection","align","_e","min-width","scopedSlots","_u","key","fn","scope","size","local","deactivated","class","roles","content","effect","fixed","open-reset-token-dialog","disabled","reset-password-dialog-open","close-reset-token-dialog","total","current-page","page-size","background","layout","current-change","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_UsersFilter_vue_vue_type_style_index_0_id_78fa3c24_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","components_ResetPasswordDialogvue_type_script_lang_js_","dialogOpen","passwordResetLink","passwordResetToken","link","token","close","href","target","components_ModerationDropdownvue_type_script_lang_js_","String","statusId","getPasswordResetToken","handleConfirmationResend","handleDeletion","_userId","handleEmailConfirmation","_statusId","requirePasswordReset","nodeInfo","metadata","mailerEnabled","$alert","showAdminAction","_ref","toggleActivation","toggleTag","tag","tags","includes","toggleUserRight","right","hide-on-click","placement","nativeOn","stopPropagation","admin","moderator","divided","confirmation_pending","active-tag"],"mappings":"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","file":"static/js/chunk-0cbc.43ff796f.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"users-container\"},[_c('div',{staticClass:\"users-header-container\"},[_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.users'))+\"\\n \"),_c('span',{staticClass:\"user-count\"},[_vm._v(\"(\"+_vm._s(_vm.normalizedUsersCount)+\")\")])]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"filter-container\"},[_c('users-filter'),_vm._v(\" \"),_c('el-input',{staticClass:\"search\",attrs:{\"placeholder\":_vm.$t('users.search'),\"prefix-icon\":\"el-icon-search\"},on:{\"input\":_vm.handleDebounceSearchInput},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"actions-container\"},[_c('el-button',{staticClass:\"actions-button\",on:{\"click\":function($event){_vm.createAccountDialogOpen = true}}},[_c('span',{staticClass:\"create-account\"},[_c('i',{staticClass:\"el-icon-plus\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.createAccount'))+\"\\n \")])]),_vm._v(\" \"),_c('multiple-users-menu',{attrs:{\"selected-users\":_vm.selectedUsers},on:{\"apply-action\":_vm.clearSelection}})],1),_vm._v(\" \"),_c('new-account-dialog',{attrs:{\"dialog-form-visible\":_vm.createAccountDialogOpen},on:{\"createNewAccount\":_vm.createNewAccount,\"closeWindow\":function($event){_vm.createAccountDialogOpen = false}}}),_vm._v(\" \"),_c('el-table',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],ref:\"usersTable\",staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.users,\"row-key\":\"id\"},on:{\"row-click\":function($event){return _vm.handleRowClick($event)},\"selection-change\":_vm.handleSelectionChange}},[(_vm.isDesktop)?_c('el-table-column',{attrs:{\"type\":\"selection\",\"reserve-selection\":\"\",\"width\":\"44\",\"align\":\"center\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"min-width\":_vm.width,\"label\":_vm.$t('users.id'),\"prop\":\"id\"}}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('users.name'),\"prop\":\"nickname\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_vm._v(\"\\n \"+_vm._s(scope.row.nickname)+\"\\n \"),(_vm.isDesktop)?_c('el-tag',{attrs:{\"type\":\"info\",\"size\":\"mini\"}},[_c('span',[_vm._v(_vm._s(scope.row.local ? _vm.$t('users.local') : _vm.$t('users.external')))])]):_vm._e()]}}])}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"min-width\":_vm.width,\"label\":_vm.$t('users.status')},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.deactivated ? 'danger' : 'success'}},[(_vm.isDesktop)?_c('span',[_vm._v(_vm._s(scope.row.deactivated ? _vm.$t('users.deactivated') : _vm.$t('users.active')))]):_c('i',{class:_vm.activationIcon(scope.row.deactivated)})]),_vm._v(\" \"),(scope.row.roles.admin)?_c('el-tag',[_c('span',[_vm._v(_vm._s(_vm.isDesktop ? _vm.$t('users.admin') : _vm.getFirstLetter(_vm.$t('users.admin'))))])]):_vm._e(),_vm._v(\" \"),(scope.row.roles.moderator)?_c('el-tag',[_c('span',[_vm._v(_vm._s(_vm.isDesktop ? _vm.$t('users.moderator') : _vm.getFirstLetter(_vm.$t('users.moderator'))))])]):_vm._e(),_vm._v(\" \"),_c('el-tooltip',{attrs:{\"content\":_vm.$t('users.unconfirmedEmail'),\"effect\":\"dark\"}},[(scope.row.confirmation_pending)?_c('el-tag',{attrs:{\"type\":\"info\"}},[_vm._v(\"\\n \"+_vm._s(_vm.isDesktop ? _vm.$t('users.unconfirmed') : _vm.getFirstLetter(_vm.$t('users.unconfirmed')))+\"\\n \")]):_vm._e()],1)]}}])}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('users.actions'),\"fixed\":\"right\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [(_vm.propertyExists(scope.row, 'nickname'))?_c('moderation-dropdown',{attrs:{\"user\":scope.row,\"page\":'users'},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}}):_c('el-button',{attrs:{\"type\":\"text\",\"disabled\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderation'))+\"\\n \"),(_vm.isDesktop)?_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"}):_vm._e()])]}}])})],1),_vm._v(\" \"),_c('reset-password-dialog',{attrs:{\"reset-password-dialog-open\":_vm.resetPasswordDialogOpen},on:{\"close-reset-token-dialog\":_vm.closeResetPasswordDialog}}),_vm._v(\" \"),(!_vm.loading)?_c('div',{staticClass:\"pagination\"},[_c('el-pagination',{attrs:{\"total\":_vm.usersCount,\"current-page\":_vm.currentPage,\"page-size\":_vm.pageSize,\"background\":\"\",\"layout\":\"prev, pager, next\"},on:{\"current-change\":_vm.handlePageChange}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./UsersFilter.vue?vue&type=template&id=78fa3c24&scoped=true&\"\nimport script from \"./UsersFilter.vue?vue&type=script&lang=js&\"\nexport * from \"./UsersFilter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UsersFilter.vue?vue&type=style&index=0&id=78fa3c24&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"78fa3c24\",\n null\n \n)\n\ncomponent.options.__file = \"UsersFilter.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-select',{staticClass:\"select-field\",attrs:{\"clearable\":_vm.isDesktop,\"placeholder\":_vm.$t('usersFilter.inputPlaceholder'),\"multiple\":\"\"},on:{\"change\":_vm.toggleFilters},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}},[_c('el-option-group',{attrs:{\"label\":_vm.$t('usersFilter.byAccountType')}},[_c('el-option',{attrs:{\"value\":\"local\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.local')))]),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"external\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.external')))])],1),_vm._v(\" \"),_c('el-option-group',{attrs:{\"label\":_vm.$t('usersFilter.byStatus')}},[_c('el-option',{attrs:{\"value\":\"active\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.active')))]),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"deactivated\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.deactivated')))])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./NewAccountDialog.vue?vue&type=template&id=c89e4c22&\"\nimport script from \"./NewAccountDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./NewAccountDialog.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewAccountDialog.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"NewAccountDialog.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{attrs:{\"visible\":_vm.isVisible,\"show-close\":false,\"title\":_vm.$t('users.createAccount'),\"custom-class\":\"create-user-dialog\"},on:{\"update:visible\":function($event){_vm.isVisible=$event},\"open\":_vm.resetForm}},[_c('el-form',{ref:\"newUserForm\",attrs:{\"model\":_vm.newUserForm,\"rules\":_vm.rules,\"label-width\":_vm.getLabelWidth,\"status-icon\":\"\"}},[_c('el-form-item',{staticClass:\"create-account-form-item\",attrs:{\"label\":_vm.$t('users.username'),\"prop\":\"nickname\"}},[_c('el-input',{attrs:{\"name\":\"nickname\",\"autofocus\":\"\"},model:{value:(_vm.newUserForm.nickname),callback:function ($$v) {_vm.$set(_vm.newUserForm, \"nickname\", $$v)},expression:\"newUserForm.nickname\"}})],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"create-account-form-item\",attrs:{\"label\":_vm.$t('users.email'),\"prop\":\"email\"}},[_c('el-input',{attrs:{\"name\":\"email\",\"type\":\"email\"},model:{value:(_vm.newUserForm.email),callback:function ($$v) {_vm.$set(_vm.newUserForm, \"email\", $$v)},expression:\"newUserForm.email\"}})],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"create-account-form-item-without-margin\",attrs:{\"label\":_vm.$t('users.password'),\"prop\":\"password\"}},[_c('el-input',{attrs:{\"type\":\"password\",\"name\":\"password\",\"autocomplete\":\"off\"},model:{value:(_vm.newUserForm.password),callback:function ($$v) {_vm.$set(_vm.newUserForm, \"password\", $$v)},expression:\"newUserForm.password\"}})],1)],1),_vm._v(\" \"),_c('span',{attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":_vm.closeDialogWindow}},[_vm._v(_vm._s(_vm.$t('users.cancel')))]),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.submitForm('newUserForm')}}},[_vm._v(_vm._s(_vm.$t('users.create')))])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=189f2583&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=style&index=0&id=78fa3c24&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=style&index=0&id=78fa3c24&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],attrs:{\"visible\":_vm.dialogOpen,\"title\":_vm.$t('users.passwordResetTokenCreated'),\"custom-class\":\"password-reset-token-dialog\"},on:{\"close\":_vm.closeResetPasswordDialog}},[_c('div',[_c('p',{staticClass:\"password-reset-token\"},[_vm._v(_vm._s(_vm.$t('users.passwordResetTokenGenerated'))+\" \"+_vm._s(_vm.passwordResetToken))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('users.linkToResetPassword'))+\"\\n \"),_c('a',{staticClass:\"reset-password-link\",attrs:{\"href\":_vm.passwordResetLink,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.passwordResetLink))])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResetPasswordDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResetPasswordDialog.vue?vue&type=script&lang=js&\"","\n\n\n\n","import { render, staticRenderFns } from \"./ResetPasswordDialog.vue?vue&type=template&id=e7d3eed4&\"\nimport script from \"./ResetPasswordDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./ResetPasswordDialog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ResetPasswordDialog.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"hide-on-click\":false,\"size\":\"small\",\"trigger\":\"click\",\"placement\":\"top-start\"},nativeOn:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',[(_vm.page === 'users')?_c('el-button',{staticClass:\"el-dropdown-link\",attrs:{\"type\":\"text\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderation'))+\"\\n \"),(_vm.isDesktop)?_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.page === 'userPage' || _vm.page === 'statusPage')?_c('el-button',{staticClass:\"moderate-user-button\"},[_c('span',{staticClass:\"moderate-user-button-container\"},[_c('span',[_c('i',{staticClass:\"el-icon-edit\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderateUser'))+\"\\n \")]),_vm._v(\" \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})])]):_vm._e()],1),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.admin ? _vm.$t('users.revokeAdmin') : _vm.$t('users.grantAdmin'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.moderator ? _vm.$t('users.revokeModerator') : _vm.$t('users.grantModerator'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id) && _vm.page !== 'statusPage')?_c('el-dropdown-item',{attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleActivation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.deactivated ? _vm.$t('users.activateAccount') : _vm.$t('users.deactivateAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id) && _vm.page !== 'statusPage')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeletion(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.handleEmailConfirmation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.confirmAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleConfirmationResend(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.resendConfirmation'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_nsfw') },attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceNsfw'))+\"\\n \"),(_vm.user.tags.includes('force_nsfw'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('strip_media') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.stripMedia'))+\"\\n \"),(_vm.user.tags.includes('strip_media'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_unlisted') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceUnlisted'))+\"\\n \"),(_vm.user.tags.includes('force_unlisted'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('sandbox') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.sandbox'))+\"\\n \"),(_vm.user.tags.includes('sandbox'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_remote_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableRemoteSubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_remote_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_any_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableAnySubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_any_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.getPasswordResetToken(_vm.user.nickname)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.getPasswordResetToken'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.requirePasswordReset(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.requirePasswordReset'))+\"\\n \")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ModerationDropdown.vue?vue&type=template&id=25dd4f14&\"\nimport script from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ModerationDropdown.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-143c.fc1825bf.js b/priv/static/adminfe/static/js/chunk-143c.fc1825bf.js new file mode 100644 index 000000000..6fbc5b1ed --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-143c.fc1825bf.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-143c"],{DrVa:function(t,e,r){"use strict";var n=r("t7J9");r.n(n).a},i7Kn:function(t,e,r){"use strict";var n=r("o0o1"),s=r.n(n),i=r("yXPU"),a=r.n(i),o={props:{selectedUsers:{type:Array,default:function(){return[]}}},computed:{showDropdownForMultipleUsers:function(){return this.$props.selectedUsers.length>0},isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{mappers:function(){var t=this,e=function(){var e=a()(s.a.mark(function e(r,n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n(r);case 2:t.$emit("apply-action");case 3:case"end":return e.stop()}},e)}));return function(t,r){return e.apply(this,arguments)}}();return{grantRight:function(r){return function(){var n=function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("AddRight",{users:n,right:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),i=t.selectedUsers.filter(function(e){return t.isLocalUser(e)&&!e.roles[r]&&t.$store.state.user.id!==e.id});e(i,n)}},revokeRight:function(r){return function(){var n=function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("DeleteRight",{users:n,right:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),i=t.selectedUsers.filter(function(e){return t.isLocalUser(e)&&e.roles[r]&&t.$store.state.user.id!==e.id});e(i,n)}},activate:function(){var r=t.selectedUsers.filter(function(e){return e.nickname&&e.deactivated&&t.$store.state.user.id!==e.id});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("ActivateUsers",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},deactivate:function(){var r=t.selectedUsers.filter(function(e){return e.nickname&&!e.deactivated&&t.$store.state.user.id!==e.id});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("DeactivateUsers",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},remove:function(){var r=t.selectedUsers.filter(function(e){return e.nickname&&t.$store.state.user.id!==e.id});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("DeleteUsers",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},addTag:function(r){return function(){var n=t.selectedUsers.filter(function(e){return"disable_remote_subscription"===r||"disable_any_subscription"===r?t.isLocalUser(e)&&!e.tags.includes(r):e.nickname&&!e.tags.includes(r)});e(n,function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("AddTag",{users:n,tag:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())}},removeTag:function(r){return a()(s.a.mark(function n(){var i;return s.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:i=t.selectedUsers.filter(function(e){return"disable_remote_subscription"===r||"disable_any_subscription"===r?t.isLocalUser(e)&&e.tags.includes(r):e.nickname&&e.tags.includes(r)}),e(i,function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("RemoveTag",{users:n,tag:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}());case 3:case"end":return n.stop()}},n)}))},requirePasswordReset:function(){var r=t.selectedUsers.filter(function(e){return t.isLocalUser(e)});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("RequirePasswordReset",r);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},confirmAccounts:function(){var r=t.selectedUsers.filter(function(e){return t.isLocalUser(e)&&e.confirmation_pending});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("ConfirmUsersEmail",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},resendConfirmation:function(){var r=t.selectedUsers.filter(function(e){return t.isLocalUser(e)&&e.confirmation_pending});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("ResendConfirmationEmail",r);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())}}},isLocalUser:function(t){return t.nickname&&t.local},grantRightToMultipleUsers:function(t){var e=this.mappers().grantRight;this.confirmMessage(this.$t("users.grantRightConfirmation",{right:t}),e(t))},revokeRightFromMultipleUsers:function(t){var e=this.mappers().revokeRight;this.confirmMessage(this.$t("users.revokeRightConfirmation",{right:t}),e(t))},activateMultipleUsers:function(){var t=this.mappers().activate;this.confirmMessage(this.$t("users.activateMultipleUsersConfirmation"),t)},deactivateMultipleUsers:function(){var t=this.mappers().deactivate;this.confirmMessage(this.$t("users.deactivateMultipleUsersConfirmation"),t)},deleteMultipleUsers:function(){var t=this.mappers().remove;this.confirmMessage(this.$t("users.deleteMultipleUsersConfirmation"),t)},requirePasswordReset:function(){if(this.$store.state.user.nodeInfo.metadata.mailerEnabled){var t=this.mappers().requirePasswordReset;this.confirmMessage(this.$t("users.requirePasswordResetConfirmation"),t)}else this.$alert(this.$t("users.mailerMustBeEnabled"),"Error",{type:"error"})},addTagForMultipleUsers:function(t){var e=this.mappers().addTag;this.confirmMessage(this.$t("users.addTagForMultipleUsersConfirmation"),e(t))},removeTagFromMultipleUsers:function(t){var e=this.mappers().removeTag;this.confirmMessage(this.$t("users.removeTagFromMultipleUsersConfirmation"),e(t))},confirmAccountsForMultipleUsers:function(){var t=this.mappers().confirmAccounts;this.confirmMessage(this.$t("users.confirmAccountsConfirmation"),t)},resendConfirmationForMultipleUsers:function(){var t=this.mappers().resendConfirmation;this.confirmMessage(this.$t("users.resendEmailConfirmation"),t)},confirmMessage:function(t,e){var r=this;this.$confirm(t,{confirmButtonText:this.$t("users.ok"),cancelButtonText:this.$t("users.cancel"),type:"warning"}).then(function(){e()}).catch(function(){r.$message({type:"info",message:r.$t("users.canceled")})})}}},u=(r("DrVa"),r("KHd+")),c=Object(u.a)(o,function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("el-dropdown",{attrs:{size:"small",trigger:"click",placement:"bottom-start"}},[t.isDesktop?r("el-button",{staticClass:"actions-button"},[r("span",{staticClass:"actions-button-container"},[r("span",[r("i",{staticClass:"el-icon-edit"}),t._v("\n "+t._s(t.$t("users.moderateUsers"))+"\n ")]),t._v(" "),r("i",{staticClass:"el-icon-arrow-down el-icon--right"})])]):t._e(),t._v(" "),t.showDropdownForMultipleUsers?r("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[r("el-dropdown-item",{nativeOn:{click:function(e){return t.grantRightToMultipleUsers("admin")}}},[t._v("\n "+t._s(t.$t("users.grantAdmin"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.revokeRightFromMultipleUsers("admin")}}},[t._v("\n "+t._s(t.$t("users.revokeAdmin"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.grantRightToMultipleUsers("moderator")}}},[t._v("\n "+t._s(t.$t("users.grantModerator"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.revokeRightFromMultipleUsers("moderator")}}},[t._v("\n "+t._s(t.$t("users.revokeModerator"))+"\n ")]),t._v(" "),r("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return t.confirmAccountsForMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.confirmAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.resendConfirmationForMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.resendConfirmation"))+"\n ")]),t._v(" "),r("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return t.activateMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.activateAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.deactivateMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.deactivateAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.deleteMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.deleteAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.requirePasswordReset(e)}}},[t._v("\n "+t._s(t.$t("users.requirePasswordReset"))+"\n ")]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover",attrs:{divided:""}},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.forceNsfw")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("force_nsfw")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("force_nsfw")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.stripMedia")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("strip_media")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("strip_media")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.forceUnlisted")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("force_unlisted")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("force_unlisted")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.sandbox")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("sandbox")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("sandbox")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.disableRemoteSubscriptionForMultiple")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("disable_remote_subscription")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("disable_remote_subscription")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.disableAnySubscriptionForMultiple")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("disable_any_subscription")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("disable_any_subscription")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)])],1):r("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[r("el-dropdown-item",[t._v("\n "+t._s(t.$t("users.selectUsers"))+"\n ")])],1)],1)},[],!1,null,"2d9f3c5e",null);c.options.__file="MultipleUsersMenu.vue";e.a=c.exports},t7J9:function(t,e,r){}}]); +//# sourceMappingURL=chunk-143c.fc1825bf.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-143c.fc1825bf.js.map b/priv/static/adminfe/static/js/chunk-143c.fc1825bf.js.map new file mode 100644 index 000000000..425a7427a --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-143c.fc1825bf.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/users/components/MultipleUsersMenu.vue?cba1","webpack:///./src/views/users/components/MultipleUsersMenu.vue?d017","webpack:///./src/views/users/components/MultipleUsersMenu.vue?56ef","webpack:///src/views/users/components/MultipleUsersMenu.vue","webpack:///./src/views/users/components/MultipleUsersMenu.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MultipleUsersMenu_vue_vue_type_style_index_0_id_2d9f3c5e_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","components_MultipleUsersMenuvue_type_script_lang_js_","props","selectedUsers","type","Array","default","computed","showDropdownForMultipleUsers","this","$props","length","isDesktop","$store","state","app","device","methods","mappers","_this","applyAction","_ref","asyncToGenerator_default","regenerator_default","a","mark","_callee","users","dispatchAction","wrap","_context","prev","next","$emit","stop","_x","_x2","apply","arguments","grantRight","right","addRightFn","_ref2","_callee2","_context2","dispatch","abrupt","sent","_x3","filtered","filter","user","isLocalUser","roles","id","revokeRight","deleteRightFn","_ref3","_callee3","_context3","_x4","activate","nickname","deactivated","_ref4","_callee4","_context4","_x5","deactivate","_ref5","_callee5","_context5","_x6","remove","_ref6","_callee6","_context6","_x7","addTag","tag","tags","includes","_ref7","_callee7","_context7","_x8","removeTag","_callee9","_context9","_ref9","_callee8","_context8","_x9","requirePasswordReset","_ref10","_callee10","_context10","_x10","confirmAccounts","confirmation_pending","_ref11","_callee11","_context11","_x11","resendConfirmation","_ref12","_callee12","_context12","_x12","local","grantRightToMultipleUsers","confirmMessage","$t","revokeRightFromMultipleUsers","activateMultipleUsers","deactivateMultipleUsers","deleteMultipleUsers","nodeInfo","metadata","mailerEnabled","$alert","addTagForMultipleUsers","removeTagFromMultipleUsers","confirmAccountsForMultipleUsers","resendConfirmationForMultipleUsers","message","_this2","$confirm","confirmButtonText","cancelButtonText","then","catch","$message","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","attrs","size","trigger","placement","staticClass","_v","_s","_e","slot","nativeOn","click","$event","divided","options","__file","__webpack_exports__"],"mappings":"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","file":"static/js/chunk-143c.fc1825bf.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=style&index=0&id=2d9f3c5e&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=style&index=0&id=2d9f3c5e&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"size\":\"small\",\"trigger\":\"click\",\"placement\":\"bottom-start\"}},[(_vm.isDesktop)?_c('el-button',{staticClass:\"actions-button\"},[_c('span',{staticClass:\"actions-button-container\"},[_c('span',[_c('i',{staticClass:\"el-icon-edit\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderateUsers'))+\"\\n \")]),_vm._v(\" \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})])]):_vm._e(),_vm._v(\" \"),(_vm.showDropdownForMultipleUsers)?_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.grantRightToMultipleUsers('admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.grantAdmin'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.revokeRightFromMultipleUsers('admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.revokeAdmin'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.grantRightToMultipleUsers('moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.grantModerator'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.revokeRightFromMultipleUsers('moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.revokeModerator'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.confirmAccountsForMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.confirmAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.resendConfirmationForMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.resendConfirmation'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.activateMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.activateAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deactivateMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deactivateAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deleteMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.requirePasswordReset($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.requirePasswordReset'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\",attrs:{\"divided\":\"\"}},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.forceNsfw')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.stripMedia')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.forceUnlisted')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.sandbox')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.disableRemoteSubscriptionForMultiple')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.disableAnySubscriptionForMultiple')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)])],1):_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[_c('el-dropdown-item',[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.selectUsers'))+\"\\n \")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MultipleUsersMenu.vue?vue&type=template&id=2d9f3c5e&scoped=true&\"\nimport script from \"./MultipleUsersMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./MultipleUsersMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MultipleUsersMenu.vue?vue&type=style&index=0&id=2d9f3c5e&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2d9f3c5e\",\n null\n \n)\n\ncomponent.options.__file = \"MultipleUsersMenu.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-1609.98da6b01.js b/priv/static/adminfe/static/js/chunk-1609.98da6b01.js new file mode 100644 index 000000000..29dbad261 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-1609.98da6b01.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-1609"],{"0M56":function(t,e,s){"use strict";var n=s("JV9I");s.n(n).a},"0tb0":function(t,e,s){"use strict";var n=s("n2GA");s.n(n).a},"9/5/":function(t,e,s){(function(e){var s="Expected a function",n=NaN,r="[object Symbol]",a=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,l=/^0o[0-7]+$/i,c=parseInt,u="object"==typeof e&&e&&e.Object===Object&&e,j="object"==typeof self&&self&&self.Object===Object&&self,d=u||j||Function("return this")(),m=Object.prototype.toString,p=Math.max,f=Math.min,g=function(){return d.Date.now()};function h(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function v(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&m.call(t)==r}(t))return n;if(h(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=h(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(a,"");var s=i.test(t);return s||l.test(t)?c(t.slice(2),s?2:8):o.test(t)?n:+t}t.exports=function(t,e,n){var r,a,o,i,l,c,u=0,j=!1,d=!1,m=!0;if("function"!=typeof t)throw new TypeError(s);function b(e){var s=r,n=a;return r=a=void 0,u=e,i=t.apply(n,s)}function y(t){var s=t-c;return void 0===c||s>=e||s<0||d&&t-u>=o}function k(){var t=g();if(y(t))return x(t);l=setTimeout(k,function(t){var s=e-(t-c);return d?f(s,o-(t-u)):s}(t))}function x(t){return l=void 0,m&&r?b(t):(r=a=void 0,i)}function z(){var t=g(),s=y(t);if(r=arguments,a=this,c=t,s){if(void 0===l)return function(t){return u=t,l=setTimeout(k,e),j?b(t):i}(c);if(d)return l=setTimeout(k,e),b(c)}return void 0===l&&(l=setTimeout(k,e)),i}return e=v(e)||0,h(n)&&(j=!!n.leading,o=(d="maxWait"in n)?p(v(n.maxWait)||0,e):o,m="trailing"in n?!!n.trailing:m),z.cancel=function(){void 0!==l&&clearTimeout(l),u=0,r=c=a=l=void 0},z.flush=function(){return void 0===l?i:x(g())},z}}).call(this,s("yLpj"))},CmY0:function(t,e,s){"use strict";s.r(e);var n=s("wd/R"),r=s.n(n),a=s("LvDl"),o=s.n(a),i=s("9/5/"),l=s.n(i),c=s("rIUS"),u={name:"LogEntryMessage",props:{actor:{type:Object,required:!0},message:{type:String,required:!0}},computed:{logEntryMessage:function(){return this.message.split(this.actor.nickname)[1]}},methods:{propertyExists:function(t,e){return t[e]}}},j=(s("0tb0"),s("KHd+")),d=Object(j.a)(u,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("span",[t.propertyExists(t.actor,"id")?s("router-link",{staticClass:"router-link",attrs:{to:{name:"UsersShow",params:{id:t.actor.id}}}},[t.propertyExists(t.actor,"nickname")?s("span",{staticStyle:{"font-weight":"600"}},[t._v("\n @"+t._s(t.actor.nickname)+"\n ")]):t._e()]):t._e(),t._v(" "),s("span",[t._v(t._s(t.logEntryMessage))])],1)},[],!1,null,null,null);d.options.__file="LogEntryMessage.vue";var m=d.exports,p={components:{RebootButton:c.a,LogEntryMessage:m},data:function(){return{dateRange:"",search:"",user:"",currentPage:1}},computed:{isMobile:function(){return"mobile"===this.$store.state.app.device},loading:function(){return this.$store.state.moderationLog.logLoading&&this.$store.state.moderationLog.adminsLoading},log:function(){return this.$store.state.moderationLog.fetchedLog},total:function(){return this.$store.state.moderationLog.logItemsCount},users:function(){return[{label:"Admins",options:this.$store.state.moderationLog.admins.users},{label:"Moderators",options:this.$store.state.moderationLog.moderators.users}]}},created:function(){var t=this;this.handleDebounceSearchInput=l()(function(e){t.fetchLogWithFilters()},500)},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchModerationLog"),this.$store.dispatch("FetchAdmins")},methods:{fetchLogWithFilters:function(){var t=o.a.omitBy({start_date:this.dateRange?this.dateRange[0].toISOString():null,end_date:this.dateRange?this.dateRange[1].toISOString():null,user_id:this.user,search:this.search,page:this.currentPage},function(t){return""===t||null===t});this.$store.dispatch("FetchModerationLog",t)},normalizeTimestamp:function(t){return r()(1e3*t).format("YYYY-MM-DD HH:mm")},propertyExists:function(t,e){return t[e]}}},f=(s("0M56"),Object(j.a)(p,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.loading?t._e():s("div",{staticClass:"moderation-log-container"},[s("div",{staticClass:"moderation-log-header-container"},[s("h1",[t._v(t._s(t.$t("moderationLog.moderationLog")))]),t._v(" "),s("reboot-button")],1),t._v(" "),s("div",{staticClass:"moderation-log-nav-container"},[s("el-select",{staticClass:"moderation-log-user-select",attrs:{clearable:"",placeholder:"Filter by admin/moderator"},on:{change:t.fetchLogWithFilters},model:{value:t.user,callback:function(e){t.user=e},expression:"user"}},t._l(t.users,function(e){return s("el-option-group",{key:e.label,attrs:{label:e.label}},t._l(e.options,function(t){return s("el-option",{key:t.id,attrs:{label:t.nickname,value:t.id}})}),1)}),1),t._v(" "),s("el-input",{staticClass:"moderation-log-search",attrs:{placeholder:"Search logs",clearable:""},on:{input:t.handleDebounceSearchInput},model:{value:t.search,callback:function(e){t.search=e},expression:"search"}})],1),t._v(" "),s("el-date-picker",{staticClass:"moderation-log-date-panel",attrs:{"default-time":["00:00:00","23:59:59"],type:"daterange","start-placeholder":"Start date","end-placeholder":"End date","unlink-panels":""},on:{change:t.fetchLogWithFilters},model:{value:t.dateRange,callback:function(e){t.dateRange=e},expression:"dateRange"}}),t._v(" "),s("el-timeline",t._l(t.log,function(e,n){return s("el-timeline-item",{key:n,attrs:{timestamp:t.normalizeTimestamp(e.time)}},[t.propertyExists(e.data.actor,"nickname")?s("log-entry-message",{attrs:{actor:e.data.actor,message:e.message}}):s("span",[t._v(t._s(e.message))])],1)}),1),t._v(" "),s("div",{staticClass:"pagination"},[s("el-pagination",{attrs:{"current-page":t.currentPage,"hide-on-single-page":!0,"page-size":50,total:t.total,small:t.isMobile,layout:"prev, pager, next"},on:{"update:currentPage":function(e){t.currentPage=e},"update:current-page":function(e){t.currentPage=e},"current-change":t.fetchLogWithFilters}})],1)],1)},[],!1,null,"60b585cf",null));f.options.__file="index.vue";e.default=f.exports},JV9I:function(t,e,s){},RnhZ:function(t,e,s){var n={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function r(t){var e=a(t);return s(e)}function a(t){if(!s.o(n,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return n[t]}r.keys=function(){return Object.keys(n)},r.resolve=a,t.exports=r,r.id="RnhZ"},n2GA:function(t,e,s){}}]); +//# sourceMappingURL=chunk-1609.98da6b01.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-1609.98da6b01.js.map b/priv/static/adminfe/static/js/chunk-1609.98da6b01.js.map new file mode 100644 index 000000000..f287a503a --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-1609.98da6b01.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/moderation_log/index.vue?678d","webpack:///./src/views/moderation_log/LogEntryMessage.vue?45d8","webpack:///./node_modules/lodash.debounce/index.js","webpack:///./src/views/moderation_log/index.vue?f0fa","webpack:///./src/views/moderation_log/LogEntryMessage.vue?15ac","webpack:///src/views/moderation_log/LogEntryMessage.vue","webpack:///./src/views/moderation_log/LogEntryMessage.vue","webpack:///./src/views/moderation_log/LogEntryMessage.vue?cbf8","webpack:///./src/views/moderation_log/index.vue?bce9","webpack:///src/views/moderation_log/index.vue","webpack:///./src/views/moderation_log/index.vue","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_60b585cf_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_LogEntryMessage_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","global","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","Object","freeSelf","self","root","Function","objectToString","prototype","toString","nativeMax","Math","max","nativeMin","min","now","Date","isObject","value","type","toNumber","isObjectLike","call","isSymbol","other","valueOf","replace","isBinary","test","slice","module","exports","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","undefined","apply","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","remainingWait","debounced","isInvoking","arguments","this","leadingEdge","cancel","clearTimeout","flush","moderation_log_LogEntryMessagevue_type_script_lang_js_","name","props","actor","required","message","String","computed","logEntryMessage","split","nickname","methods","propertyExists","account","property","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","to","params","id","staticStyle","font-weight","_v","_s","_e","__file","LogEntryMessage","views_moderation_logvue_type_script_lang_js_","components","RebootButton","data","dateRange","search","user","currentPage","isMobile","$store","state","app","device","loading","moderationLog","logLoading","adminsLoading","log","fetchedLog","total","logItemsCount","users","label","admins","moderators","created","_this","handleDebounceSearchInput","lodash_debounce_default","query","fetchLogWithFilters","mounted","dispatch","filters","lodash_default","a","omitBy","start_date","toISOString","end_date","user_id","page","val","normalizeTimestamp","timestamp","moment_default","format","moderation_log_component","$t","clearable","placeholder","on","change","model","callback","$$v","expression","_l","group","key","item","input","default-time","start-placeholder","end-placeholder","unlink-panels","logEntry","index","current-page","hide-on-single-page","page-size","small","layout","update:currentPage","$event","update:current-page","current-change","__webpack_exports__","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","resolve"],"mappings":"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,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,QAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,WAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,QAIA,SAAAC,EAAAC,GACA,IAAAtV,EAAAuV,EAAAD,GACA,OAAA9b,EAAAwG,GAEA,SAAAuV,EAAAD,GACA,IAAA9b,EAAAgc,EAAAlQ,EAAAgQ,GAAA,CACA,IAAAG,EAAA,IAAAC,MAAA,uBAAAJ,EAAA,KAEA,MADAG,EAAAE,KAAA,mBACAF,EAEA,OAAAnQ,EAAAgQ,GAEAD,EAAAO,KAAA,WACA,OAAAtb,OAAAsb,KAAAtQ,IAEA+P,EAAAQ,QAAAN,EACArZ,EAAAC,QAAAkZ,EACAA,EAAArV,GAAA","file":"static/js/chunk-1609.98da6b01.js","sourcesContent":["import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=60b585cf&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=60b585cf&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LogEntryMessage.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LogEntryMessage.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"moderation-log-container\"},[_c('div',{staticClass:\"moderation-log-header-container\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('moderationLog.moderationLog')))]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"moderation-log-nav-container\"},[_c('el-select',{staticClass:\"moderation-log-user-select\",attrs:{\"clearable\":\"\",\"placeholder\":\"Filter by admin/moderator\"},on:{\"change\":_vm.fetchLogWithFilters},model:{value:(_vm.user),callback:function ($$v) {_vm.user=$$v},expression:\"user\"}},_vm._l((_vm.users),function(group){return _c('el-option-group',{key:group.label,attrs:{\"label\":group.label}},_vm._l((group.options),function(item){return _c('el-option',{key:item.id,attrs:{\"label\":item.nickname,\"value\":item.id}})}),1)}),1),_vm._v(\" \"),_c('el-input',{staticClass:\"moderation-log-search\",attrs:{\"placeholder\":\"Search logs\",\"clearable\":\"\"},on:{\"input\":_vm.handleDebounceSearchInput},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1),_vm._v(\" \"),_c('el-date-picker',{staticClass:\"moderation-log-date-panel\",attrs:{\"default-time\":['00:00:00', '23:59:59'],\"type\":\"daterange\",\"start-placeholder\":\"Start date\",\"end-placeholder\":\"End date\",\"unlink-panels\":\"\"},on:{\"change\":_vm.fetchLogWithFilters},model:{value:(_vm.dateRange),callback:function ($$v) {_vm.dateRange=$$v},expression:\"dateRange\"}}),_vm._v(\" \"),_c('el-timeline',_vm._l((_vm.log),function(logEntry,index){return _c('el-timeline-item',{key:index,attrs:{\"timestamp\":_vm.normalizeTimestamp(logEntry.time)}},[(_vm.propertyExists(logEntry.data.actor, 'nickname'))?_c('log-entry-message',{attrs:{\"actor\":logEntry.data.actor,\"message\":logEntry.message}}):_c('span',[_vm._v(_vm._s(logEntry.message))])],1)}),1),_vm._v(\" \"),_c('div',{staticClass:\"pagination\"},[_c('el-pagination',{attrs:{\"current-page\":_vm.currentPage,\"hide-on-single-page\":true,\"page-size\":50,\"total\":_vm.total,\"small\":_vm.isMobile,\"layout\":\"prev, pager, next\"},on:{\"update:currentPage\":function($event){_vm.currentPage=$event},\"update:current-page\":function($event){_vm.currentPage=$event},\"current-change\":_vm.fetchLogWithFilters}})],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LogEntryMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LogEntryMessage.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./LogEntryMessage.vue?vue&type=template&id=da9d889c&\"\nimport script from \"./LogEntryMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./LogEntryMessage.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LogEntryMessage.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"LogEntryMessage.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',[(_vm.propertyExists(_vm.actor, 'id'))?_c('router-link',{staticClass:\"router-link\",attrs:{\"to\":{ name: 'UsersShow', params: { id: _vm.actor.id }}}},[(_vm.propertyExists(_vm.actor, 'nickname'))?_c('span',{staticStyle:{\"font-weight\":\"600\"}},[_vm._v(\"\\n @\"+_vm._s(_vm.actor.nickname)+\"\\n \")]):_vm._e()]):_vm._e(),_vm._v(\" \"),_c('span',[_vm._v(_vm._s(_vm.logEntryMessage))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=60b585cf&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=60b585cf&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"60b585cf\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-176e.c4995511.js b/priv/static/adminfe/static/js/chunk-176e.c4995511.js new file mode 100644 index 000000000..80474b904 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-176e.c4995511.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-176e"],{FtQ1:function(s,t,e){"use strict";e.r(t);var a=e("RIqP"),n=e.n(a),i=e("i7Kn"),o=e("ot3S"),r=e("rIUS"),c=e("ZhIB"),u=e.n(c),l={name:"Statuses",components:{MultipleUsersMenu:i.a,RebootButton:r.a,Status:o.a},data:function(){return{selectedUsers:[]}},computed:{allLoaded:function(){return this.$store.state.status.statusesByInstance.allLoaded},buttonLoading:function(){return this.$store.state.status.statusesByInstance.buttonLoading},currentInstance:function(){return this.selectedInstance===this.$store.state.user.authHost},instances:function(){return[this.$store.state.user.authHost].concat(n()(this.$store.state.peers.fetchedPeers))},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},loadingPeers:function(){return this.$store.state.peers.loading},page:function(){return this.$store.state.status.statusesByInstance.page},pageSize:function(){return this.$store.state.status.statusesByInstance.pageSize},selectedInstance:{get:function(){return this.$store.state.status.statusesByInstance.selectedInstance},set:function(s){this.$store.dispatch("HandleFilterChange",s)}},showLocal:{get:function(){return this.$store.state.status.statusesByInstance.showLocal},set:function(s){this.$store.dispatch("HandleLocalCheckboxChange",s)}},showPrivate:{get:function(){return this.$store.state.status.statusesByInstance.showPrivate},set:function(s){this.$store.dispatch("HandleGodmodeCheckboxChange",s)}},statuses:function(){return this.$store.state.status.fetchedStatuses},statusVisibility:function(){return this.$store.state.status.statusVisibility}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchPeers"),this.$store.dispatch("FetchStatusesCount")},destroyed:function(){this.clearSelection(),this.$store.dispatch("ClearState")},methods:{clearSelection:function(){this.selectedUsers=[]},handleFilterChange:function(){this.$store.dispatch("HandlePageChange",1),this.$store.dispatch("FetchStatusesByInstance")},handleLoadMore:function(){this.$store.dispatch("HandlePageChange",this.page+1),this.$store.dispatch("FetchStatusesPageByInstance")},handleStatusSelection:function(s){void 0===this.selectedUsers.find(function(t){return s.id===t.id})&&(this.selectedUsers=[].concat(n()(this.selectedUsers),[s]))},normalizedCount:function(s){return u()(s).format("0a")}}},j=(e("QOJ7"),e("KHd+")),h=Object(j.a)(l,function(){var s=this,t=s.$createElement,e=s._self._c||t;return s.loadingPeers?s._e():e("div",{staticClass:"statuses-container"},[e("div",{staticClass:"statuses-header"},[e("h1",[s._v("\n "+s._s(s.$t("statuses.statuses"))+"\n ")]),s._v(" "),e("reboot-button")],1),s._v(" "),e("div",{staticClass:"statuses-header-container"},[e("el-button-group",[e("el-button",{staticClass:"direct-button",attrs:{plain:""}},[s._v("\n "+s._s(s.$t("statuses.direct"))+": "+s._s(s.normalizedCount(s.statusVisibility.direct))+"\n ")]),s._v(" "),e("el-button",{staticClass:"private-button",attrs:{plain:""}},[s._v("\n "+s._s(s.$t("statuses.private"))+": "+s._s(s.normalizedCount(s.statusVisibility.private))+"\n ")]),s._v(" "),e("el-button",{staticClass:"public-button",attrs:{plain:""}},[s._v("\n "+s._s(s.$t("statuses.public"))+": "+s._s(s.normalizedCount(s.statusVisibility.public))+"\n ")]),s._v(" "),e("el-button",{staticClass:"unlisted-button",attrs:{plain:""}},[s._v("\n "+s._s(s.$t("statuses.unlisted"))+": "+s._s(s.normalizedCount(s.statusVisibility.unlisted))+"\n ")])],1)],1),s._v(" "),e("div",{staticClass:"filter-container"},[e("el-select",{staticClass:"select-instance",attrs:{placeholder:s.$t("statuses.instanceFilter"),"no-data-text":s.$t("statuses.noInstances"),filterable:"",clearable:""},on:{change:s.handleFilterChange},model:{value:s.selectedInstance,callback:function(t){s.selectedInstance=t},expression:"selectedInstance"}},s._l(s.instances,function(s,t){return e("el-option",{key:t,attrs:{label:s,value:s}})}),1),s._v(" "),e("multiple-users-menu",{attrs:{"selected-users":s.selectedUsers},on:{"apply-action":s.clearSelection}})],1),s._v(" "),s.currentInstance?e("div",{staticClass:"checkbox-container"},[e("el-checkbox",{staticClass:"show-private-statuses",model:{value:s.showLocal,callback:function(t){s.showLocal=t},expression:"showLocal"}},[s._v("\n "+s._s(s.$t("statuses.onlyLocalStatuses"))+"\n ")]),s._v(" "),e("el-checkbox",{staticClass:"show-private-statuses",model:{value:s.showPrivate,callback:function(t){s.showPrivate=t},expression:"showPrivate"}},[s._v("\n "+s._s(s.$t("statuses.showPrivateStatuses"))+"\n ")])],1):s._e(),s._v(" "),0===s.statuses.length?e("p",{staticClass:"no-statuses"},[s._v(s._s(s.$t("userProfile.noStatuses")))]):s._e(),s._v(" "),s._l(s.statuses,function(t){return e("div",{key:t.id,staticClass:"status-container"},[e("status",{attrs:{status:t,account:t.account,"show-checkbox":s.isDesktop,"fetch-statuses-by-instance":!0},on:{"status-selection":s.handleStatusSelection}})],1)}),s._v(" "),s.statuses.length>0?e("div",{staticClass:"statuses-pagination"},[s.allLoaded?e("el-button",{attrs:{icon:"el-icon-check",circle:""}}):e("el-button",{attrs:{loading:s.buttonLoading},on:{click:s.handleLoadMore}},[s._v(s._s(s.$t("statuses.loadMore")))])],1):s._e()],2)},[],!1,null,null,null);h.options.__file="index.vue";t.default=h.exports},KmHg:function(s,t,e){},QOJ7:function(s,t,e){"use strict";var a=e("KmHg");e.n(a).a},RnhZ:function(s,t,e){var a={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function n(s){var t=i(s);return e(t)}function i(s){if(!e.o(a,s)){var t=new Error("Cannot find module '"+s+"'");throw t.code="MODULE_NOT_FOUND",t}return a[s]}n.keys=function(){return Object.keys(a)},n.resolve=i,s.exports=n,n.id="RnhZ"}}]); +//# sourceMappingURL=chunk-176e.c4995511.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-176e.c4995511.js.map b/priv/static/adminfe/static/js/chunk-176e.c4995511.js.map new file mode 100644 index 000000000..f0caa5f62 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-176e.c4995511.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/statuses/index.vue?ffa7","webpack:///./src/views/statuses/index.vue?1423","webpack:///src/views/statuses/index.vue","webpack:///./src/views/statuses/index.vue","webpack:///./src/views/statuses/index.vue?f25c","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$"],"names":["views_statusesvue_type_script_lang_js_","name","components","MultipleUsersMenu","RebootButton","Status","data","selectedUsers","computed","allLoaded","this","$store","state","status","statusesByInstance","buttonLoading","currentInstance","selectedInstance","user","authHost","instances","concat","toConsumableArray_default","peers","fetchedPeers","isDesktop","app","device","isMobile","isTablet","loadingPeers","loading","page","pageSize","get","set","instance","dispatch","showLocal","value","showPrivate","statuses","fetchedStatuses","statusVisibility","mounted","destroyed","clearSelection","methods","handleFilterChange","handleLoadMore","handleStatusSelection","undefined","find","selectedUser","id","normalizedCount","count","numeral_default","format","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","_e","staticClass","_v","_s","$t","attrs","plain","direct","private","public","unlisted","placeholder","no-data-text","filterable","clearable","on","change","model","callback","$$v","expression","_l","index","key","label","selected-users","apply-action","length","account","show-checkbox","fetch-statuses-by-instance","status-selection","icon","circle","click","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","resolve","module","exports"],"mappings":"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CAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,QAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,WAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,QAIA,SAAAC,EAAAC,GACA,IAAAtT,EAAAuT,EAAAD,GACA,OAAAlQ,EAAApD,GAEA,SAAAuT,EAAAD,GACA,IAAAlQ,EAAAoQ,EAAAlQ,EAAAgQ,GAAA,CACA,IAAAG,EAAA,IAAAC,MAAA,uBAAAJ,EAAA,KAEA,MADAG,EAAAE,KAAA,mBACAF,EAEA,OAAAnQ,EAAAgQ,GAEAD,EAAAO,KAAA,WACA,OAAAtT,OAAAsT,KAAAtQ,IAEA+P,EAAAQ,QAAAN,EACAO,EAAAC,QAAAV,EACAA,EAAArT,GAAA","file":"static/js/chunk-176e.c4995511.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loadingPeers)?_c('div',{staticClass:\"statuses-container\"},[_c('div',{staticClass:\"statuses-header\"},[_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.statuses'))+\"\\n \")]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"statuses-header-container\"},[_c('el-button-group',[_c('el-button',{staticClass:\"direct-button\",attrs:{\"plain\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.direct'))+\": \"+_vm._s(_vm.normalizedCount(_vm.statusVisibility.direct))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{staticClass:\"private-button\",attrs:{\"plain\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.private'))+\": \"+_vm._s(_vm.normalizedCount(_vm.statusVisibility.private))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{staticClass:\"public-button\",attrs:{\"plain\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.public'))+\": \"+_vm._s(_vm.normalizedCount(_vm.statusVisibility.public))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{staticClass:\"unlisted-button\",attrs:{\"plain\":\"\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.unlisted'))+\": \"+_vm._s(_vm.normalizedCount(_vm.statusVisibility.unlisted))+\"\\n \")])],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"filter-container\"},[_c('el-select',{staticClass:\"select-instance\",attrs:{\"placeholder\":_vm.$t('statuses.instanceFilter'),\"no-data-text\":_vm.$t('statuses.noInstances'),\"filterable\":\"\",\"clearable\":\"\"},on:{\"change\":_vm.handleFilterChange},model:{value:(_vm.selectedInstance),callback:function ($$v) {_vm.selectedInstance=$$v},expression:\"selectedInstance\"}},_vm._l((_vm.instances),function(instance,index){return _c('el-option',{key:index,attrs:{\"label\":instance,\"value\":instance}})}),1),_vm._v(\" \"),_c('multiple-users-menu',{attrs:{\"selected-users\":_vm.selectedUsers},on:{\"apply-action\":_vm.clearSelection}})],1),_vm._v(\" \"),(_vm.currentInstance)?_c('div',{staticClass:\"checkbox-container\"},[_c('el-checkbox',{staticClass:\"show-private-statuses\",model:{value:(_vm.showLocal),callback:function ($$v) {_vm.showLocal=$$v},expression:\"showLocal\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.onlyLocalStatuses'))+\"\\n \")]),_vm._v(\" \"),_c('el-checkbox',{staticClass:\"show-private-statuses\",model:{value:(_vm.showPrivate),callback:function ($$v) {_vm.showPrivate=$$v},expression:\"showPrivate\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.showPrivateStatuses'))+\"\\n \")])],1):_vm._e(),_vm._v(\" \"),(_vm.statuses.length === 0)?_c('p',{staticClass:\"no-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.noStatuses')))]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.statuses),function(status){return _c('div',{key:status.id,staticClass:\"status-container\"},[_c('status',{attrs:{\"status\":status,\"account\":status.account,\"show-checkbox\":_vm.isDesktop,\"fetch-statuses-by-instance\":true},on:{\"status-selection\":_vm.handleStatusSelection}})],1)}),_vm._v(\" \"),(_vm.statuses.length > 0)?_c('div',{staticClass:\"statuses-pagination\"},[(!_vm.allLoaded)?_c('el-button',{attrs:{\"loading\":_vm.buttonLoading},on:{\"click\":_vm.handleLoadMore}},[_vm._v(_vm._s(_vm.$t('statuses.loadMore')))]):_c('el-button',{attrs:{\"icon\":\"el-icon-check\",\"circle\":\"\"}})],1):_vm._e()],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=4ee51084&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js b/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js deleted file mode 100644 index 903f553b0..000000000 --- a/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-22d2"],{"13xp":function(t,s,e){"use strict";var a=e("2r4G");e.n(a).a},"2r4G":function(t,s,e){},"4bFr":function(t,s,e){"use strict";e.r(s);var a=e("ot3S"),i=e("tPM3"),n=e("o0o1"),r=e.n(n),o=e("yXPU"),u=e.n(o),c=e("XJYT"),l={name:"SecuritySettingsModal",props:{visible:{type:Boolean,default:!1},user:{type:Object,default:function(){return{}}}},data:function(){return{securitySettingsForm:{newEmail:"",newPassword:"",isEmailLoading:!1,isPasswordLoading:!1}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},getLabelWidth:function(){return this.isDesktop?"120px":"85px"},userCredentials:function(){return this.$store.state.userProfile.userCredentials}},mounted:function(){var t=u()(r.a.mark(function t(){return r.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.$store.dispatch("FetchUserCredentials",{nickname:this.user.nickname});case 2:this.securitySettingsForm.newEmail=this.userCredentials.email;case 3:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}(),methods:{updateEmail:function(){var t=u()(r.a.mark(function t(){var s;return r.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return s={email:this.securitySettingsForm.newEmail},this.securitySettingsForm.isEmailLoading=!0,t.next=4,this.$store.dispatch("UpdateUserCredentials",{nickname:this.user.nickname,credentials:s});case 4:this.securitySettingsForm.isEmailLoading=!1,Object(c.Message)({message:this.$t("userProfile.securitySettings.emailUpdated"),type:"success",duration:5e3});case 6:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}(),updatePassword:function(){var t=u()(r.a.mark(function t(){var s;return r.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return s={password:this.securitySettingsForm.newPassword},this.securitySettingsForm.isPasswordLoading=!0,t.next=4,this.$store.dispatch("UpdateUserCredentials",{nickname:this.user.nickname,credentials:s});case 4:this.securitySettingsForm.isPasswordLoading=!1,this.securitySettingsForm.newPassword="",Object(c.Message)({message:this.$t("userProfile.securitySettings.passwordUpdated"),type:"success",duration:5e3});case 7:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}(),close:function(){this.$emit("close",!0)}}},d=(e("13xp"),e("KHd+")),v=Object(d.a)(l,function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("el-dialog",{staticClass:"security-settings-modal",attrs:{"before-close":t.close,title:t.$t("userProfile.securitySettings.securitySettings"),visible:t.visible}},[e("el-form",{attrs:{model:t.securitySettingsForm,"label-width":t.getLabelWidth}},[e("el-form-item",{attrs:{label:t.$t("userProfile.securitySettings.email")}},[e("el-input",{attrs:{placeholder:t.$t("userProfile.securitySettings.inputNewEmail")},model:{value:t.securitySettingsForm.newEmail,callback:function(s){t.$set(t.securitySettingsForm,"newEmail",s)},expression:"securitySettingsForm.newEmail"}})],1),t._v(" "),e("el-form-item",[e("el-button",{staticClass:"security-settings-submit-button",attrs:{loading:t.securitySettingsForm.isEmailLoading,disabled:!t.securitySettingsForm.newEmail||t.securitySettingsForm.newEmail===t.userCredentials.email,type:"primary"},on:{click:function(s){return t.updateEmail()}}},[t._v("\n "+t._s(t.$t("userProfile.securitySettings.submit"))+"\n ")])],1),t._v(" "),e("el-form-item",{staticClass:"password-input",attrs:{label:t.$t("userProfile.securitySettings.password")}},[e("el-input",{attrs:{placeholder:t.$t("userProfile.securitySettings.inputNewPassword")},model:{value:t.securitySettingsForm.newPassword,callback:function(s){t.$set(t.securitySettingsForm,"newPassword",s)},expression:"securitySettingsForm.newPassword"}}),t._v(" "),e("small",{staticClass:"form-text"},[t._v("\n "+t._s(t.$t("userProfile.securitySettings.passwordLengthNotice",{minLength:8}))+"\n ")])],1),t._v(" "),e("el-alert",{staticClass:"password-alert",attrs:{closable:!1,type:"warning","show-icon":""}},[e("p",[t._v(t._s(t.$t("userProfile.securitySettings.passwordChangeWarning1")))]),t._v(" "),e("p",[t._v(t._s(t.$t("userProfile.securitySettings.passwordChangeWarning2")))])]),t._v(" "),e("el-form-item",[e("el-button",{staticClass:"security-settings-submit-button",attrs:{loading:t.securitySettingsForm.isPasswordLoading,disabled:t.securitySettingsForm.newPassword.length<8,type:"primary"},on:{click:function(s){return t.updatePassword()}}},[t._v("\n "+t._s(t.$t("userProfile.securitySettings.submit"))+"\n ")])],1)],1)],1)},[],!1,null,null,null);v.options.__file="SecuritySettingsModal.vue";var p=v.exports,_=e("rIUS"),g={name:"UsersShow",components:{ModerationDropdown:i.a,RebootButton:_.a,Status:a.a,SecuritySettingsModal:p},data:function(){return{showPrivate:!1,resetPasswordDialogOpen:!1,securitySettingsModalVisible:!1}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},loading:function(){return this.$store.state.users.loading},passwordResetLink:function(){return this.$store.state.users.passwordResetToken.link},passwordResetToken:function(){return this.$store.state.users.passwordResetToken.token},statuses:function(){return this.$store.state.userProfile.statuses},statusesLoading:function(){return this.$store.state.userProfile.statusesLoading},user:function(){return this.$store.state.userProfile.user},userProfileLoading:function(){return this.$store.state.userProfile.userProfileLoading},userCredentials:function(){return this.$store.state.userProfile.userCredentials}},mounted:function(){this.$store.dispatch("NeedReboot"),this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("FetchUserProfile",{userId:this.$route.params.id,godmode:!1})},methods:{closeResetPasswordDialog:function(){this.resetPasswordDialogOpen=!1,this.$store.dispatch("RemovePasswordToken")},onTogglePrivate:function(){this.$store.dispatch("FetchUserProfile",{userId:this.$route.params.id,godmode:this.showPrivate})},openResetPasswordDialog:function(){this.resetPasswordDialogOpen=!0}}},h=(e("tIqt"),Object(d.a)(g,function(){var t=this,s=t.$createElement,e=t._self._c||s;return t.userProfileLoading?t._e():e("main",[t.isDesktop||t.isTablet?e("header",{staticClass:"user-page-header"},[e("div",{staticClass:"avatar-name-container"},[e("el-avatar",{attrs:{src:t.user.avatar,size:"large"}}),t._v(" "),e("h1",[t._v(t._s(t.user.display_name))])],1),t._v(" "),e("div",{staticClass:"left-header-container"},[e("moderation-dropdown",{attrs:{user:t.user,page:"userPage"},on:{"open-reset-token-dialog":t.openResetPasswordDialog}}),t._v(" "),e("reboot-button")],1)]):t._e(),t._v(" "),t.isMobile?e("div",{staticClass:"user-page-header-container"},[e("header",{staticClass:"user-page-header"},[e("div",{staticClass:"avatar-name-container"},[e("el-avatar",{attrs:{src:t.user.avatar,size:"large"}}),t._v(" "),e("h1",[t._v(t._s(t.user.display_name))])],1),t._v(" "),e("reboot-button")],1),t._v(" "),e("moderation-dropdown",{attrs:{user:t.user,page:"userPage"},on:{"open-reset-token-dialog":t.openResetPasswordDialog}})],1):t._e(),t._v(" "),e("el-dialog",{directives:[{name:"loading",rawName:"v-loading",value:t.loading,expression:"loading"}],attrs:{visible:t.resetPasswordDialogOpen,title:t.$t("users.passwordResetTokenCreated"),"custom-class":"password-reset-token-dialog"},on:{"update:visible":function(s){t.resetPasswordDialogOpen=s},close:t.closeResetPasswordDialog}},[e("div",[e("p",{staticClass:"password-reset-token"},[t._v("Password reset token was generated: "+t._s(t.passwordResetToken))]),t._v(" "),e("p",[t._v("You can also use this link to reset password:\n "),e("a",{staticClass:"reset-password-link",attrs:{href:t.passwordResetLink,target:"_blank"}},[t._v(t._s(t.passwordResetLink))])])])]),t._v(" "),e("div",{staticClass:"user-profile-container"},[e("el-card",{staticClass:"user-profile-card"},[e("div",{staticClass:"el-table el-table--fit el-table--enable-row-hover el-table--enable-row-transition el-table--medium"},[e("table",{staticClass:"user-profile-table"},[e("tbody",[e("tr",{staticClass:"el-table__row"},[e("td",[t._v(t._s(t.$t("userProfile.nickname")))]),t._v(" "),e("td",[t._v("\n "+t._s(t.user.nickname)+"\n ")])]),t._v(" "),e("tr",{staticClass:"el-table__row"},[e("td",{staticClass:"name-col"},[t._v("ID")]),t._v(" "),e("td",{staticClass:"value-col"},[t._v("\n "+t._s(t.user.id)+"\n ")])]),t._v(" "),e("tr",{staticClass:"el-table__row"},[e("td",[t._v(t._s(t.$t("userProfile.tags")))]),t._v(" "),e("td",[t._l(t.user.tags,function(s){return e("el-tag",{key:s,staticClass:"user-profile-tag"},[t._v(t._s(s))])}),t._v(" "),0===t.user.tags.length?e("span",[t._v("—")]):t._e()],2)]),t._v(" "),e("tr",{staticClass:"el-table__row"},[e("td",[t._v(t._s(t.$t("userProfile.roles")))]),t._v(" "),e("td",[t.user.roles.admin?e("el-tag",{staticClass:"user-profile-tag"},[t._v("\n "+t._s(t.$t("users.admin"))+"\n ")]):t._e(),t._v(" "),t.user.roles.moderator?e("el-tag",{staticClass:"user-profile-tag"},[t._v("\n "+t._s(t.$t("users.moderator"))+"\n ")]):t._e(),t._v(" "),t.user.roles.moderator||t.user.roles.admin?t._e():e("span",[t._v("—")])],1)]),t._v(" "),e("tr",{staticClass:"el-table__row"},[e("td",[t._v(t._s(t.$t("userProfile.localUppercase")))]),t._v(" "),e("td",[t.user.local?e("el-tag",{attrs:{type:"info"}},[t._v(t._s(t.$t("userProfile.local")))]):t._e(),t._v(" "),t.user.local?t._e():e("el-tag",{attrs:{type:"info"}},[t._v(t._s(t.$t("userProfile.external")))])],1)]),t._v(" "),e("tr",{staticClass:"el-table__row"},[e("td",[t._v(t._s(t.$t("userProfile.activeUppercase")))]),t._v(" "),e("td",[t.user.deactivated?t._e():e("el-tag",{attrs:{type:"success"}},[t._v(t._s(t.$t("userProfile.active")))]),t._v(" "),t.user.deactivated?e("el-tag",{attrs:{type:"danger"}},[t._v(t._s(t.$t("userProfile.deactivated")))]):t._e()],1)])])])]),t._v(" "),e("el-button",{staticClass:"security-setting-button",attrs:{icon:"el-icon-lock"},on:{click:function(s){t.securitySettingsModalVisible=!0}}},[t._v("\n "+t._s(t.$t("userProfile.securitySettings.securitySettings"))+"\n ")]),t._v(" "),e("SecuritySettingsModal",{attrs:{user:t.user,visible:t.securitySettingsModalVisible},on:{close:function(s){t.securitySettingsModalVisible=!1}}})],1),t._v(" "),e("div",{staticClass:"recent-statuses-container"},[e("h2",{staticClass:"recent-statuses"},[t._v(t._s(t.$t("userProfile.recentStatuses")))]),t._v(" "),e("el-checkbox",{staticClass:"show-private-statuses",on:{change:t.onTogglePrivate},model:{value:t.showPrivate,callback:function(s){t.showPrivate=s},expression:"showPrivate"}},[t._v("\n "+t._s(t.$t("statuses.showPrivateStatuses"))+"\n ")]),t._v(" "),t.statusesLoading?t._e():e("el-timeline",{staticClass:"statuses"},[t._l(t.statuses,function(s){return e("el-timeline-item",{key:s.id},[e("status",{attrs:{status:s,account:s.account,"show-checkbox":!1,"user-id":t.user.id,godmode:t.showPrivate}})],1)}),t._v(" "),0===t.statuses.length?e("p",{staticClass:"no-statuses"},[t._v(t._s(t.$t("userProfile.noStatuses")))]):t._e()],2)],1)],1)],1)},[],!1,null,"d4bc7d00",null));h.options.__file="show.vue";s.default=h.exports},"53Av":function(t,s,e){"use strict";var a=e("lOBV");e.n(a).a},Kw8l:function(t,s,e){"use strict";var a=e("cRgN");e.n(a).a},RnhZ:function(t,s,e){var a={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function i(t){var s=n(t);return e(s)}function n(t){if(!e.o(a,t)){var s=new Error("Cannot find module '"+t+"'");throw s.code="MODULE_NOT_FOUND",s}return a[t]}i.keys=function(){return Object.keys(a)},i.resolve=n,t.exports=i,i.id="RnhZ"},SMFL:function(t,s,e){},cRgN:function(t,s,e){},lOBV:function(t,s,e){},ot3S:function(t,s,e){"use strict";var a=e("wd/R"),i=e.n(a),n={name:"Status",props:{account:{type:Object,required:!1,default:function(){return{}}},fetchStatusesByInstance:{type:Boolean,required:!1,default:!1},showCheckbox:{type:Boolean,required:!0,default:!1},status:{type:Object,required:!0},page:{type:Number,required:!1,default:0},userId:{type:String,required:!1,default:""},godmode:{type:Boolean,required:!1,default:!1}},data:function(){return{showHiddenStatus:!1}},methods:{capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},changeStatus:function(t,s,e){this.$store.dispatch("ChangeStatusScope",{statusId:t,isSensitive:s,visibility:e,reportCurrentPage:this.page,userId:this.userId,godmode:this.godmode,fetchStatusesByInstance:this.fetchStatusesByInstance})},deleteStatus:function(t){var s=this;this.$confirm("Are you sure you want to delete this status?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){s.$store.dispatch("DeleteStatus",{statusId:t,reportCurrentPage:s.page,userId:s.userId,godmode:s.godmode,fetchStatusesByInstance:s.fetchStatusesByInstance}),s.$message({type:"success",message:"Delete completed"})}).catch(function(){s.$message({type:"info",message:"Delete canceled"})})},optionPercent:function(t,s){var e=t.options.reduce(function(t,s){return t+s.votes_count},0);return 0===e?0:+(s.votes_count/e*100).toFixed(1)},parseTimestamp:function(t){return i()(t).format("YYYY-MM-DD HH:mm")},handleStatusSelection:function(t){this.$emit("status-selection",t)}}},r=(e("Kw8l"),e("KHd+")),o=Object(r.a)(n,function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",[t.status.deleted?e("el-card",{staticClass:"status-card"},[e("div",{attrs:{slot:"header"},slot:"header"},[e("div",{staticClass:"status-header"},[e("div",{staticClass:"status-account-container"},[e("div",{staticClass:"status-account"},[e("h4",{staticClass:"status-deleted"},[t._v(t._s(t.$t("reports.statusDeleted")))])])])])]),t._v(" "),e("div",{staticClass:"status-body"},[t.status.content?e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}):e("span",{staticClass:"status-without-content"},[t._v("no content")])]),t._v(" "),t.status.created_at?e("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"}},[t._v("\n "+t._s(t.parseTimestamp(t.status.created_at))+"\n ")]):t._e()]):e("el-card",{staticClass:"status-card"},[e("div",{attrs:{slot:"header"},slot:"header"},[e("div",{staticClass:"status-header"},[e("div",{staticClass:"status-account-container"},[e("div",{staticClass:"status-account"},[t.showCheckbox?e("el-checkbox",{staticClass:"status-checkbox",on:{change:function(s){return t.handleStatusSelection(t.account)}}}):t._e(),t._v(" "),e("img",{staticClass:"status-avatar-img",attrs:{src:t.account.avatar}}),t._v(" "),t.account.deactivated?e("span",[e("h3",{staticClass:"status-account-name"},[t._v(t._s(t.account.display_name))]),t._v(" "),e("h3",{staticClass:"status-account-name deactivated"},[t._v(" (deactivated)")])]):e("a",{staticClass:"account",attrs:{href:t.account.url,target:"_blank"}},[e("h3",{staticClass:"status-account-name"},[t._v(t._s(t.account.display_name))])])],1)]),t._v(" "),e("div",{staticClass:"status-actions"},[t.status.sensitive?e("el-tag",{attrs:{type:"warning",size:"large"}},[t._v(t._s(t.$t("reports.sensitive")))]):t._e(),t._v(" "),e("el-tag",{attrs:{size:"large"}},[t._v(t._s(t.capitalizeFirstLetter(t.status.visibility)))]),t._v(" "),e("el-dropdown",{attrs:{trigger:"click"}},[e("el-button",{staticClass:"status-actions-button",attrs:{plain:"",size:"small",icon:"el-icon-edit"}},[t._v("\n "+t._s(t.$t("reports.changeScope"))),e("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),e("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[t.status.sensitive?t._e():e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,!0,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.addSensitive"))+"\n ")]),t._v(" "),t.status.sensitive?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,!1,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.removeSensitive"))+"\n ")]):t._e(),t._v(" "),"public"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"public")}}},[t._v("\n "+t._s(t.$t("reports.public"))+"\n ")]):t._e(),t._v(" "),"private"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"private")}}},[t._v("\n "+t._s(t.$t("reports.private"))+"\n ")]):t._e(),t._v(" "),"unlisted"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"unlisted")}}},[t._v("\n "+t._s(t.$t("reports.unlisted"))+"\n ")]):t._e(),t._v(" "),e("el-dropdown-item",{nativeOn:{click:function(s){return t.deleteStatus(t.status.id)}}},[t._v("\n "+t._s(t.$t("reports.deleteStatus"))+"\n ")])],1)],1)],1)])]),t._v(" "),e("div",{staticClass:"status-body"},[t.status.spoiler_text?e("div",[e("strong",[t._v(t._s(t.status.spoiler_text))]),t._v(" "),t.showHiddenStatus?t._e():e("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(s){t.showHiddenStatus=!0}}},[t._v("Show more")]),t._v(" "),t.showHiddenStatus?e("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(s){t.showHiddenStatus=!1}}},[t._v("Show less")]):t._e(),t._v(" "),t.showHiddenStatus?e("div",[e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?e("div",{staticClass:"poll"},[e("ul",t._l(t.status.poll.options,function(s,a){return e("li",{key:a},[t._v("\n "+t._s(s.title)+"\n "),e("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,s)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,s){return e("div",{key:s,staticClass:"image"},[e("img",{attrs:{src:t.preview_url}})])})],2):t._e()],1):t._e(),t._v(" "),t.status.spoiler_text?t._e():e("div",[e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?e("div",{staticClass:"poll"},[e("ul",t._l(t.status.poll.options,function(s,a){return e("li",{key:a},[t._v("\n "+t._s(s.title)+"\n "),e("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,s)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,s){return e("div",{key:s,staticClass:"image"},[e("img",{attrs:{src:t.preview_url}})])})],2),t._v(" "),e("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"}},[t._v("\n "+t._s(t.parseTimestamp(t.status.created_at))+"\n ")])])])],1)},[],!1,null,null,null);o.options.__file="index.vue";s.a=o.exports},rIUS:function(t,s,e){"use strict";var a=e("o0o1"),i=e.n(a),n=e("yXPU"),r=e.n(n),o=e("mSNy"),u={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var t=r()(i.a.mark(function t(){return i.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("RestartApplication");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.restartSuccess")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},c=e("KHd+"),l=Object(c.a)(u,function(){var t=this.$createElement,s=this._self._c||t;return this.needReboot?s("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[s("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[s("span",[s("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);l.options.__file="index.vue";s.a=l.exports},tIqt:function(t,s,e){"use strict";var a=e("SMFL");e.n(a).a},tPM3:function(t,s,e){"use strict";var a={name:"ModerationDropdown",props:{user:{type:Object,default:function(){return{}}},page:{type:String,default:"users"}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{getPasswordResetToken:function(t){this.$emit("open-reset-token-dialog"),this.$store.dispatch("GetPasswordResetToken",t)},handleConfirmationResend:function(t){this.$store.dispatch("ResendConfirmationEmail",[t])},handleDeletion:function(t){this.$store.dispatch("DeleteUsers",{users:[t],_userId:t.id})},handleEmailConfirmation:function(t){this.$store.dispatch("ConfirmUsersEmail",{users:[t],_userId:t.id})},requirePasswordReset:function(t){this.$store.state.user.nodeInfo.metadata.mailerEnabled?this.$store.dispatch("RequirePasswordReset",[t]):this.$alert(this.$t("users.mailerMustBeEnabled"),"Error",{type:"error"})},showAdminAction:function(t){var s=t.local,e=t.id;return s&&this.showDeactivatedButton(e)},showDeactivatedButton:function(t){return this.$store.state.user.id!==t},toggleActivation:function(t){t.deactivated?this.$store.dispatch("ActivateUsers",{users:[t],_userId:t.id}):this.$store.dispatch("DeactivateUsers",{users:[t],_userId:t.id})},toggleTag:function(t,s){t.tags.includes(s)?this.$store.dispatch("RemoveTag",{users:[t],tag:s,_userId:t.id}):this.$store.dispatch("AddTag",{users:[t],tag:s,_userId:t.id})},toggleUserRight:function(t,s){t.roles[s]?this.$store.dispatch("DeleteRight",{users:[t],right:s,_userId:t.id}):this.$store.dispatch("AddRight",{users:[t],right:s,_userId:t.id})}}},i=(e("53Av"),e("KHd+")),n=Object(i.a)(a,function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("el-dropdown",{attrs:{"hide-on-click":!1,size:"small",trigger:"click"}},[e("div",["users"===t.page?e("span",{staticClass:"el-dropdown-link"},[t._v("\n "+t._s(t.$t("users.moderation"))+"\n "),t.isDesktop?e("i",{staticClass:"el-icon-arrow-down el-icon--right"}):t._e()]):t._e(),t._v(" "),"userPage"===t.page?e("el-button",{staticClass:"moderate-user-button"},[e("span",{staticClass:"moderate-user-button-container"},[e("span",[e("i",{staticClass:"el-icon-edit"}),t._v("\n "+t._s(t.$t("users.moderateUser"))+"\n ")]),t._v(" "),e("i",{staticClass:"el-icon-arrow-down el-icon--right"})])]):t._e()],1),t._v(" "),e("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[t.showAdminAction(t.user)?e("el-dropdown-item",{nativeOn:{click:function(s){return t.toggleUserRight(t.user,"admin")}}},[t._v("\n "+t._s(t.user.roles.admin?t.$t("users.revokeAdmin"):t.$t("users.grantAdmin"))+"\n ")]):t._e(),t._v(" "),t.showAdminAction(t.user)?e("el-dropdown-item",{nativeOn:{click:function(s){return t.toggleUserRight(t.user,"moderator")}}},[t._v("\n "+t._s(t.user.roles.moderator?t.$t("users.revokeModerator"):t.$t("users.grantModerator"))+"\n ")]):t._e(),t._v(" "),t.showDeactivatedButton(t.user.id)?e("el-dropdown-item",{attrs:{divided:t.showAdminAction(t.user)},nativeOn:{click:function(s){return t.toggleActivation(t.user)}}},[t._v("\n "+t._s(t.user.deactivated?t.$t("users.activateAccount"):t.$t("users.deactivateAccount"))+"\n ")]):t._e(),t._v(" "),t.showDeactivatedButton(t.user.id)?e("el-dropdown-item",{nativeOn:{click:function(s){return t.handleDeletion(t.user)}}},[t._v("\n "+t._s(t.$t("users.deleteAccount"))+"\n ")]):t._e(),t._v(" "),t.user.local&&t.user.confirmation_pending?e("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(s){return t.handleEmailConfirmation(t.user)}}},[t._v("\n "+t._s(t.$t("users.confirmAccount"))+"\n ")]):t._e(),t._v(" "),t.user.local&&t.user.confirmation_pending?e("el-dropdown-item",{nativeOn:{click:function(s){return t.handleConfirmationResend(t.user)}}},[t._v("\n "+t._s(t.$t("users.resendConfirmation"))+"\n ")]):t._e(),t._v(" "),e("el-dropdown-item",{class:{"active-tag":t.user.tags.includes("force_nsfw")},attrs:{divided:t.showAdminAction(t.user)},nativeOn:{click:function(s){return t.toggleTag(t.user,"force_nsfw")}}},[t._v("\n "+t._s(t.$t("users.forceNsfw"))+"\n "),t.user.tags.includes("force_nsfw")?e("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),e("el-dropdown-item",{class:{"active-tag":t.user.tags.includes("strip_media")},nativeOn:{click:function(s){return t.toggleTag(t.user,"strip_media")}}},[t._v("\n "+t._s(t.$t("users.stripMedia"))+"\n "),t.user.tags.includes("strip_media")?e("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),e("el-dropdown-item",{class:{"active-tag":t.user.tags.includes("force_unlisted")},nativeOn:{click:function(s){return t.toggleTag(t.user,"force_unlisted")}}},[t._v("\n "+t._s(t.$t("users.forceUnlisted"))+"\n "),t.user.tags.includes("force_unlisted")?e("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),e("el-dropdown-item",{class:{"active-tag":t.user.tags.includes("sandbox")},nativeOn:{click:function(s){return t.toggleTag(t.user,"sandbox")}}},[t._v("\n "+t._s(t.$t("users.sandbox"))+"\n "),t.user.tags.includes("sandbox")?e("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),t.user.local?e("el-dropdown-item",{class:{"active-tag":t.user.tags.includes("disable_remote_subscription")},nativeOn:{click:function(s){return t.toggleTag(t.user,"disable_remote_subscription")}}},[t._v("\n "+t._s(t.$t("users.disableRemoteSubscription"))+"\n "),t.user.tags.includes("disable_remote_subscription")?e("i",{staticClass:"el-icon-check"}):t._e()]):t._e(),t._v(" "),t.user.local?e("el-dropdown-item",{class:{"active-tag":t.user.tags.includes("disable_any_subscription")},nativeOn:{click:function(s){return t.toggleTag(t.user,"disable_any_subscription")}}},[t._v("\n "+t._s(t.$t("users.disableAnySubscription"))+"\n "),t.user.tags.includes("disable_any_subscription")?e("i",{staticClass:"el-icon-check"}):t._e()]):t._e(),t._v(" "),t.user.local?e("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(s){return t.getPasswordResetToken(t.user.nickname)}}},[t._v("\n "+t._s(t.$t("users.getPasswordResetToken"))+"\n ")]):t._e(),t._v(" "),t.user.local?e("el-dropdown-item",{nativeOn:{click:function(s){return t.requirePasswordReset(t.user)}}},[t._v("\n "+t._s(t.$t("users.requirePasswordReset"))+"\n ")]):t._e()],1)],1)},[],!1,null,null,null);n.options.__file="ModerationDropdown.vue";s.a=n.exports}}]); -//# sourceMappingURL=chunk-22d2.a0cf7976.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map b/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map deleted file mode 100644 index 68735ed26..000000000 --- a/priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/users/components/SecuritySettingsModal.vue?5147","webpack:///./src/views/users/show.vue?f435","webpack:///./src/views/users/components/SecuritySettingsModal.vue?49db","webpack:///src/views/users/components/SecuritySettingsModal.vue","webpack:///./src/views/users/components/SecuritySettingsModal.vue","webpack:///./src/views/users/components/SecuritySettingsModal.vue?dd3f","webpack:///./src/views/users/show.vue?ac8b","webpack:///src/views/users/show.vue","webpack:///./src/views/users/show.vue","webpack:///./src/views/users/components/ModerationDropdown.vue?e3f0","webpack:///./src/components/Status/index.vue?aecc","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/components/Status/index.vue?f9b2","webpack:///./src/components/Status/index.vue?6071","webpack:///src/components/Status/index.vue","webpack:///./src/components/Status/index.vue","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue","webpack:///./src/views/users/show.vue?5f99","webpack:///./src/views/users/components/ModerationDropdown.vue?f4d5","webpack:///./src/views/users/components/ModerationDropdown.vue?676e","webpack:///src/views/users/components/ModerationDropdown.vue","webpack:///./src/views/users/components/ModerationDropdown.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_SecuritySettingsModal_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","components_SecuritySettingsModalvue_type_script_lang_js_","name","props","visible","type","Boolean","default","user","Object","data","securitySettingsForm","newEmail","newPassword","isEmailLoading","isPasswordLoading","computed","isDesktop","this","$store","state","app","device","getLabelWidth","userCredentials","userProfile","mounted","_mounted","asyncToGenerator_default","regenerator_default","a","mark","_callee","wrap","_context","prev","next","dispatch","nickname","email","stop","apply","arguments","methods","updateEmail","_updateEmail","_callee2","credentials","_context2","element_ui_common","message","$t","duration","updatePassword","_updatePassword","_callee3","_context3","password","close","$emit","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","before-close","title","model","label-width","label","placeholder","value","callback","$$v","$set","expression","_v","loading","disabled","on","click","$event","_s","minLength","closable","show-icon","length","options","__file","SecuritySettingsModal","users_showvue_type_script_lang_js_","components","ModerationDropdown","RebootButton","Status","showPrivate","resetPasswordDialogOpen","securitySettingsModalVisible","isMobile","isTablet","users","passwordResetLink","passwordResetToken","link","token","statuses","statusesLoading","userProfileLoading","userId","$route","params","id","godmode","closeResetPasswordDialog","onTogglePrivate","openResetPasswordDialog","show_component","_e","src","avatar","size","display_name","page","open-reset-token-dialog","directives","rawName","custom-class","update:visible","href","target","_l","tag","key","tags","roles","moderator","admin","local","deactivated","icon","change","status","account","show-checkbox","user-id","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ModerationDropdown_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","resolve","module","exports","components_Statusvue_type_script_lang_js_","required","fetchStatusesByInstance","showCheckbox","Number","String","showHiddenStatus","capitalizeFirstLetter","str","charAt","toUpperCase","slice","changeStatus","statusId","isSensitive","visibility","reportCurrentPage","deleteStatus","_this","$confirm","confirmButtonText","cancelButtonText","then","$message","catch","optionPercent","poll","pollOption","allVotes","reduce","acc","option","votes_count","toFixed","parseTimestamp","timestamp","moment_default","format","handleStatusSelection","deleted","slot","domProps","innerHTML","content","url","created_at","trigger","plain","sensitive","nativeOn","spoiler_text","index","percentage","attachment","preview_url","components_RebootButtonvue_type_script_lang_js_","needReboot","restartApp","_restartApp","t0","abrupt","lang","t","placement","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_show_vue_vue_type_style_index_0_id_d4bc7d00_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","components_ModerationDropdownvue_type_script_lang_js_","getPasswordResetToken","handleConfirmationResend","handleDeletion","_userId","handleEmailConfirmation","requirePasswordReset","nodeInfo","metadata","mailerEnabled","$alert","showAdminAction","_ref","showDeactivatedButton","toggleActivation","toggleTag","includes","toggleUserRight","right","hide-on-click","divided","confirmation_pending","class","active-tag"],"mappings":"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AA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,QAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,WAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,QAIA,SAAAC,EAAAC,GACA,IAAArS,EAAAsS,EAAAD,GACA,OAAAzZ,EAAAoH,GAEA,SAAAsS,EAAAD,GACA,IAAAzZ,EAAA2Z,EAAAlQ,EAAAgQ,GAAA,CACA,IAAAG,EAAA,IAAAC,MAAA,uBAAAJ,EAAA,KAEA,MADAG,EAAAE,KAAA,mBACAF,EAEA,OAAAnQ,EAAAgQ,GAEAD,EAAAO,KAAA,WACA,OAAArZ,OAAAqZ,KAAAtQ,IAEA+P,EAAAQ,QAAAN,EACAO,EAAAC,QAAAV,EACAA,EAAApS,GAAA,+GCnRA,yBCA0M+S,GC6H1Mha,KAAA,SACAC,OACA+I,SACA7I,KAAAI,OACA0Z,UAAA,EACA5Z,QAAA,sBAEA6Z,yBACA/Z,KAAAC,QACA6Z,UAAA,EACA5Z,SAAA,GAEA8Z,cACAha,KAAAC,QACA6Z,UAAA,EACA5Z,SAAA,GAEA0I,QACA5I,KAAAI,OACA0Z,UAAA,GAEArS,MACAzH,KAAAia,OACAH,UAAA,EACA5Z,QAAA,GAEAyG,QACA3G,KAAAka,OACAJ,UAAA,EACA5Z,QAAA,IAEA6G,SACA/G,KAAAC,QACA6Z,UAAA,EACA5Z,SAAA,IAGAG,KAtCA,WAuCA,OACA8Z,kBAAA,IAGA7X,SACA8X,sBADA,SACAC,GACA,OAAAA,EAAAC,OAAA,GAAAC,cAAAF,EAAAG,MAAA,IAEAC,aAJA,SAIAC,EAAAC,EAAAC,GACA/Z,KAAAC,OAAAkB,SAAA,qBACA0Y,WACAC,cACAC,aACAC,kBAAAha,KAAA4G,KACAd,OAAA9F,KAAA8F,OACAI,QAAAlG,KAAAkG,QACAgT,wBAAAlZ,KAAAkZ,2BAGAe,aAfA,SAeAJ,GAAA,IAAAK,EAAAla,KACAA,KAAAma,SAAA,0DACAC,kBAAA,KACAC,iBAAA,SACAlb,KAAA,YACAmb,KAAA,WACAJ,EAAAja,OAAAkB,SAAA,gBACA0Y,WACAG,kBAAAE,EAAAtT,KACAd,OAAAoU,EAAApU,OACAI,QAAAgU,EAAAhU,QACAgT,wBAAAgB,EAAAhB,0BAEAgB,EAAAK,UACApb,KAAA,UACA6C,QAAA,uBAEAwY,MAAA,WACAN,EAAAK,UACApb,KAAA,OACA6C,QAAA,uBAIAyY,cAvCA,SAuCAC,EAAAC,GACA,IAAAC,EAAAF,EAAAjW,QAAAoW,OAAA,SAAAC,EAAAC,GAAA,OAAAD,EAAAC,EAAAC,aAAA,GACA,WAAAJ,EACA,IAEAD,EAAAK,YAAAJ,EAAA,KAAAK,QAAA,IAEAC,eA9CA,SA8CAC,GACA,OAAAC,IAAAD,GAAAE,OAAA,qBAEAC,sBAjDA,SAiDAtT,GACAhI,KAAAyC,MAAA,mBAAAuF,8BCjNAtF,EAAgBnD,OAAAoD,EAAA,EAAApD,CACdyZ,EHTF,WAA0B,IAAApW,EAAA5C,KAAa6C,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAAH,EAAAmF,OAAAwT,QAA4/JxY,EAAA,WAAwGE,YAAA,gBAA0BF,EAAA,OAAYG,OAAOsY,KAAA,UAAgBA,KAAA,WAAezY,EAAA,OAAYE,YAAA,kBAA4BF,EAAA,OAAYE,YAAA,6BAAuCF,EAAA,OAAYE,YAAA,mBAA6BF,EAAA,MAAWE,YAAA,mBAA6BL,EAAAkB,GAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,qCAAAW,EAAAkB,GAAA,KAAAf,EAAA,OAAkFE,YAAA,gBAA0BL,EAAAmF,OAAA,QAAAhF,EAAA,QAAkCE,YAAA,iBAAAwY,UAAuCC,UAAA9Y,EAAAwB,GAAAxB,EAAAmF,OAAA4T,YAAwC5Y,EAAA,QAAaE,YAAA,2BAAqCL,EAAAkB,GAAA,kBAAAlB,EAAAkB,GAAA,KAAAlB,EAAAmF,OAAA,WAAAhF,EAAA,KAAuEE,YAAA,UAAAC,OAA6BgE,KAAAtE,EAAAmF,OAAA6T,IAAAzU,OAAA,YAAyCvE,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAsY,eAAAtY,EAAAmF,OAAA8T,aAAA,YAAAjZ,EAAA2D,OAAxvLxD,EAAA,WAAqDE,YAAA,gBAA0BF,EAAA,OAAYG,OAAOsY,KAAA,UAAgBA,KAAA,WAAezY,EAAA,OAAYE,YAAA,kBAA4BF,EAAA,OAAYE,YAAA,6BAAuCF,EAAA,OAAYE,YAAA,mBAA6BL,EAAA,aAAAG,EAAA,eAAuCE,YAAA,kBAAAgB,IAAkC6D,OAAA,SAAA3D,GAA0B,OAAAvB,EAAA0Y,sBAAA1Y,EAAAoF,aAAgDpF,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAf,EAAA,OAAiCE,YAAA,oBAAAC,OAAuCsD,IAAA5D,EAAAoF,QAAAvB,UAA0B7D,EAAAkB,GAAA,KAAAlB,EAAAoF,QAAAJ,YAAqK7E,EAAA,QAAAA,EAAA,MAAmEE,YAAA,wBAAkCL,EAAAkB,GAAAlB,EAAAwB,GAAAxB,EAAAoF,QAAArB,iBAAA/D,EAAAkB,GAAA,KAAAf,EAAA,MAAkEE,YAAA,oCAA8CL,EAAAkB,GAAA,sBAA1Xf,EAAA,KAAiDE,YAAA,UAAAC,OAA6BgE,KAAAtE,EAAAoF,QAAA4T,IAAAzU,OAAA,YAA0CpE,EAAA,MAAWE,YAAA,wBAAkCL,EAAAkB,GAAAlB,EAAAwB,GAAAxB,EAAAoF,QAAArB,oBAAqN,KAAA/D,EAAAkB,GAAA,KAAAf,EAAA,OAA2DE,YAAA,mBAA6BL,EAAAmF,OAAA,UAAAhF,EAAA,UAAsCG,OAAO/D,KAAA,UAAAuH,KAAA,WAAiC9D,EAAAkB,GAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,yBAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAf,EAAA,UAAkFG,OAAOwD,KAAA,WAAgB9D,EAAAkB,GAAAlB,EAAAwB,GAAAxB,EAAA2W,sBAAA3W,EAAAmF,OAAAgS,gBAAAnX,EAAAkB,GAAA,KAAAf,EAAA,eAAmGG,OAAO4Y,QAAA,WAAmB/Y,EAAA,aAAkBE,YAAA,wBAAAC,OAA2C6Y,MAAA,GAAArV,KAAA,QAAAmB,KAAA,kBAAiDjF,EAAAkB,GAAA,mBAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,yBAAAc,EAAA,KAA2EE,YAAA,wCAAgDL,EAAAkB,GAAA,KAAAf,EAAA,oBAAuCG,OAAOsY,KAAA,YAAkBA,KAAA,aAAiB5Y,EAAAmF,OAAAiU,UAA0JpZ,EAAA2D,KAA1JxD,EAAA,oBAAiDkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAgX,aAAAhX,EAAAmF,OAAA9B,IAAA,EAAArD,EAAAmF,OAAAgS,gBAAsEnX,EAAAkB,GAAA,qBAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,+CAAAW,EAAAkB,GAAA,KAAAlB,EAAAmF,OAAA,UAAAhF,EAAA,oBAA8JkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAgX,aAAAhX,EAAAmF,OAAA9B,IAAA,EAAArD,EAAAmF,OAAAgS,gBAAuEnX,EAAAkB,GAAA,qBAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,kDAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,gBAAAlB,EAAAmF,OAAAgS,WAAAhX,EAAA,oBAA+KkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAgX,aAAAhX,EAAAmF,OAAA9B,GAAArD,EAAAmF,OAAAiU,UAAA,cAAyEpZ,EAAAkB,GAAA,qBAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,yCAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,iBAAAlB,EAAAmF,OAAAgS,WAAAhX,EAAA,oBAAuKkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAgX,aAAAhX,EAAAmF,OAAA9B,GAAArD,EAAAmF,OAAAiU,UAAA,eAA0EpZ,EAAAkB,GAAA,qBAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,0CAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,kBAAAlB,EAAAmF,OAAAgS,WAAAhX,EAAA,oBAAyKkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAgX,aAAAhX,EAAAmF,OAAA9B,GAAArD,EAAAmF,OAAAiU,UAAA,gBAA2EpZ,EAAAkB,GAAA,qBAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,2CAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAf,EAAA,oBAAmIkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAqX,aAAArX,EAAAmF,OAAA9B,QAAyCrD,EAAAkB,GAAA,qBAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,+DAAAW,EAAAkB,GAAA,KAAAf,EAAA,OAAiIE,YAAA,gBAA0BL,EAAAmF,OAAA,aAAAhF,EAAA,OAAAA,EAAA,UAAAH,EAAAkB,GAAAlB,EAAAwB,GAAAxB,EAAAmF,OAAAmU,iBAAAtZ,EAAAkB,GAAA,KAAAlB,EAAA0W,iBAAiQ1W,EAAA2D,KAAjQxD,EAAA,aAAiJE,YAAA,mBAAAC,OAAsCwD,KAAA,QAAczC,IAAKC,MAAA,SAAAC,GAAyBvB,EAAA0W,kBAAA,MAA8B1W,EAAAkB,GAAA,eAAAlB,EAAAkB,GAAA,KAAAlB,EAAA,iBAAAG,EAAA,aAAoFE,YAAA,mBAAAC,OAAsCwD,KAAA,QAAczC,IAAKC,MAAA,SAAAC,GAAyBvB,EAAA0W,kBAAA,MAA+B1W,EAAAkB,GAAA,eAAAlB,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAA,iBAAAG,EAAA,OAAAA,EAAA,QAAyFE,YAAA,iBAAAwY,UAAuCC,UAAA9Y,EAAAwB,GAAAxB,EAAAmF,OAAA4T,YAAwC/Y,EAAAkB,GAAA,KAAAlB,EAAAmF,OAAA,KAAAhF,EAAA,OAA0CE,YAAA,SAAmBF,EAAA,KAAAH,EAAAwE,GAAAxE,EAAAmF,OAAA2S,KAAA,iBAAAK,EAAAoB,GAAkE,OAAApZ,EAAA,MAAgBuE,IAAA6U,IAAUvZ,EAAAkB,GAAA,qBAAAlB,EAAAwB,GAAA2W,EAAA3X,OAAA,sBAAAL,EAAA,eAA2FG,OAAOkZ,WAAAxZ,EAAA6X,cAAA7X,EAAAmF,OAAA2S,KAAAK,OAAyD,KAAM,KAAAnY,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAwE,GAAAxE,EAAAmF,OAAA,2BAAAsU,EAAAF,GAA6F,OAAApZ,EAAA,OAAiBuE,IAAA6U,EAAAlZ,YAAA,UAA8BF,EAAA,OAAYG,OAAOsD,IAAA6V,EAAAC,oBAAkC,GAAA1Z,EAAA2D,MAAA,GAAA3D,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAmF,OAAAmU,aAA8pBtZ,EAAA2D,KAA9pBxD,EAAA,OAAAA,EAAA,QAAwFE,YAAA,iBAAAwY,UAAuCC,UAAA9Y,EAAAwB,GAAAxB,EAAAmF,OAAA4T,YAAwC/Y,EAAAkB,GAAA,KAAAlB,EAAAmF,OAAA,KAAAhF,EAAA,OAA0CE,YAAA,SAAmBF,EAAA,KAAAH,EAAAwE,GAAAxE,EAAAmF,OAAA2S,KAAA,iBAAAK,EAAAoB,GAAkE,OAAApZ,EAAA,MAAgBuE,IAAA6U,IAAUvZ,EAAAkB,GAAA,mBAAAlB,EAAAwB,GAAA2W,EAAA3X,OAAA,oBAAAL,EAAA,eAAuFG,OAAOkZ,WAAAxZ,EAAA6X,cAAA7X,EAAAmF,OAAA2S,KAAAK,OAAyD,KAAM,KAAAnY,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAwE,GAAAxE,EAAAmF,OAAA,2BAAAsU,EAAAF,GAA6F,OAAApZ,EAAA,OAAiBuE,IAAA6U,EAAAlZ,YAAA,UAA8BF,EAAA,OAAYG,OAAOsD,IAAA6V,EAAAC,oBAAkC,GAAA1Z,EAAAkB,GAAA,KAAAf,EAAA,KAAmCE,YAAA,UAAAC,OAA6BgE,KAAAtE,EAAAmF,OAAA6T,IAAAzU,OAAA,YAAyCvE,EAAAkB,GAAA,aAAAlB,EAAAwB,GAAAxB,EAAAsY,eAAAtY,EAAAmF,OAAA8T,aAAA,mBAA4vB,QGYj1L,EACA,KACA,KACA,MAIAnZ,EAAA+B,QAAAC,OAAA,YACeyD,EAAA,EAAAzF,6CCpBf,0DCA0M6Z,GCe1Mvd,KAAA,eACAc,UACA0c,WADA,WAEA,OAAAxc,KAAAC,OAAAC,MAAAC,IAAAqc,aAGA/a,SACAgb,WADA,eAAAC,EAAAhc,IAAAC,EAAAC,EAAAC,KAAA,SAAAC,IAAA,OAAAH,EAAAC,EAAAG,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAAAF,EAAAC,KAAA,EAAAD,EAAAE,KAAA,EAGAlB,KAAAC,OAAAkB,SAAA,sBAHA,OAAAH,EAAAE,KAAA,sBAAAF,EAAAC,KAAA,EAAAD,EAAA2b,GAAA3b,EAAA,SAAAA,EAAA4b,OAAA,iBAOA5c,KAAAua,UACApb,KAAA,UACA6C,QAAA6a,EAAA,EAAAC,EAAA,6BATA,wBAAA9b,EAAAM,SAAAR,EAAAd,OAAA,mCAAA0c,EAAAnb,MAAAvB,KAAAwB,YAAA,iBCdAkB,EAAgBnD,OAAAoD,EAAA,EAAApD,CACdgd,EHRF,WAA0B,IAAa1Z,EAAb7C,KAAa8C,eAA0BC,EAAvC/C,KAAuCgD,MAAAD,IAAAF,EAAwB,OAA/D7C,KAA+D,WAAA+C,EAAA,cAAyCG,OAAOyY,QAA/G3b,KAA+GiC,GAAA,uBAAA8a,UAAA,gBAAkEha,EAAA,aAAkBE,YAAA,gBAAAC,OAAmC/D,KAAA,WAAiB8E,IAAKC,MAA5PlE,KAA4Pyc,cAAwB1Z,EAAA,QAAAA,EAAA,KAAqBE,YAAA,oBAAzSjD,KAAuU8D,GAAA,WAAvU9D,KAAuUoE,GAAvUpE,KAAuUiC,GAAA,8CAAvUjC,KAAuUuG,UGWjW,EACA,KACA,KACA,MAIA7D,EAAA+B,QAAAC,OAAA,YACeyD,EAAA,EAAAzF,6CCnBf,IAAAsa,EAAAne,EAAA,QAAAA,EAAAC,EAAAke,GAA8e,qCCA9e,ICA6NC,GC0G7Nje,KAAA,qBACAC,OACAK,MACAH,KAAAI,OACAF,QAAA,WACA,WAGAuH,MACAzH,KAAAka,OACAha,QAAA,UAGAS,UACAC,UADA,WAEA,kBAAAC,KAAAC,OAAAC,MAAAC,IAAAC,SAGAqB,SACAyb,sBADA,SACA9b,GACApB,KAAAyC,MAAA,2BACAzC,KAAAC,OAAAkB,SAAA,wBAAAC,IAEA+b,yBALA,SAKA7d,GACAU,KAAAC,OAAAkB,SAAA,2BAAA7B,KAEA8d,eARA,SAQA9d,GACAU,KAAAC,OAAAkB,SAAA,eAAAmE,OAAAhG,GAAA+d,QAAA/d,EAAA2G,MAEAqX,wBAXA,SAWAhe,GACAU,KAAAC,OAAAkB,SAAA,qBAAAmE,OAAAhG,GAAA+d,QAAA/d,EAAA2G,MAEAsX,qBAdA,SAcAje,GACAU,KAAAC,OAAAC,MAAAZ,KAAAke,SAAAC,SAAAC,cAKA1d,KAAAC,OAAAkB,SAAA,wBAAA7B,IAHAU,KAAA2d,OAAA3d,KAAAiC,GAAA,sCAAA9C,KAAA,WAKAye,gBAtBA,SAAAC,GAsBA,IAAAlW,EAAAkW,EAAAlW,MAAA1B,EAAA4X,EAAA5X,GACA,OAAA0B,GAAA3H,KAAA8d,sBAAA7X,IAEA6X,sBAzBA,SAyBA7X,GACA,OAAAjG,KAAAC,OAAAC,MAAAZ,KAAA2G,QAEA8X,iBA5BA,SA4BAze,GACAA,EAAAsI,YACA5H,KAAAC,OAAAkB,SAAA,iBAAAmE,OAAAhG,GAAA+d,QAAA/d,EAAA2G,KACAjG,KAAAC,OAAAkB,SAAA,mBAAAmE,OAAAhG,GAAA+d,QAAA/d,EAAA2G,MAEA+X,UAjCA,SAiCA1e,EAAA+H,GACA/H,EAAAiI,KAAA0W,SAAA5W,GACArH,KAAAC,OAAAkB,SAAA,aAAAmE,OAAAhG,GAAA+H,MAAAgW,QAAA/d,EAAA2G,KACAjG,KAAAC,OAAAkB,SAAA,UAAAmE,OAAAhG,GAAA+H,MAAAgW,QAAA/d,EAAA2G,MAEAiY,gBAtCA,SAsCA5e,EAAA6e,GACA7e,EAAAkI,MAAA2W,GACAne,KAAAC,OAAAkB,SAAA,eAAAmE,OAAAhG,GAAA6e,QAAAd,QAAA/d,EAAA2G,KACAjG,KAAAC,OAAAkB,SAAA,YAAAmE,OAAAhG,GAAA6e,QAAAd,QAAA/d,EAAA2G,gCC7JAvD,EAAgBnD,OAAAoD,EAAA,EAAApD,CACd0d,EHTF,WAA0B,IAAAra,EAAA5C,KAAa6C,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,eAAyBG,OAAOkb,iBAAA,EAAA1X,KAAA,QAAAoV,QAAA,WAAwD/Y,EAAA,iBAAAH,EAAAgE,KAAA7D,EAAA,QAA8CE,YAAA,qBAA+BL,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,iCAAAW,EAAA,UAAAG,EAAA,KAA2FE,YAAA,sCAAgDL,EAAA2D,OAAA3D,EAAA2D,KAAA3D,EAAAkB,GAAA,kBAAAlB,EAAAgE,KAAA7D,EAAA,aAA4EE,YAAA,yBAAmCF,EAAA,QAAaE,YAAA,mCAA6CF,EAAA,QAAAA,EAAA,KAAqBE,YAAA,iBAA2BL,EAAAkB,GAAA,eAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,uCAAAW,EAAAkB,GAAA,KAAAf,EAAA,KAAiGE,YAAA,0CAAgDL,EAAA2D,MAAA,GAAA3D,EAAAkB,GAAA,KAAAf,EAAA,oBAAsDG,OAAOsY,KAAA,YAAkBA,KAAA,aAAiB5Y,EAAAgb,gBAAAhb,EAAAtD,MAAAyD,EAAA,oBAAyDkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAsb,gBAAAtb,EAAAtD,KAAA,aAAgDsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAtD,KAAAkI,MAAAE,MAAA9E,EAAAX,GAAA,qBAAAW,EAAAX,GAAA,iCAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAgb,gBAAAhb,EAAAtD,MAAAyD,EAAA,oBAAoMkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAsb,gBAAAtb,EAAAtD,KAAA,iBAAoDsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAtD,KAAAkI,MAAAC,UAAA7E,EAAAX,GAAA,yBAAAW,EAAAX,GAAA,qCAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAkb,sBAAAlb,EAAAtD,KAAA2G,IAAAlD,EAAA,oBAAyNG,OAAOmb,QAAAzb,EAAAgb,gBAAAhb,EAAAtD,OAAwC2c,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAmb,iBAAAnb,EAAAtD,UAAwCsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAtD,KAAAsI,YAAAhF,EAAAX,GAAA,yBAAAW,EAAAX,GAAA,wCAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAkb,sBAAAlb,EAAAtD,KAAA2G,IAAAlD,EAAA,oBAAwNkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAwa,eAAAxa,EAAAtD,UAAsCsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,oCAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAtD,KAAAqI,OAAA/E,EAAAtD,KAAAgf,qBAAAvb,EAAA,oBAAoKG,OAAOmb,QAAA,IAAapC,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAA0a,wBAAA1a,EAAAtD,UAA+CsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,qCAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAtD,KAAAqI,OAAA/E,EAAAtD,KAAAgf,qBAAAvb,EAAA,oBAAqKkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAua,yBAAAva,EAAAtD,UAAgDsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,yCAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAf,EAAA,oBAAuHwb,OAAOC,aAAA5b,EAAAtD,KAAAiI,KAAA0W,SAAA,eAAqD/a,OAAQmb,QAAAzb,EAAAgb,gBAAAhb,EAAAtD,OAAwC2c,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAob,UAAApb,EAAAtD,KAAA,kBAA+CsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,gCAAAW,EAAAtD,KAAAiI,KAAA0W,SAAA,cAAAlb,EAAA,KAAiHE,YAAA,kBAA4BL,EAAA2D,OAAA3D,EAAAkB,GAAA,KAAAf,EAAA,oBAAgDwb,OAAOC,aAAA5b,EAAAtD,KAAAiI,KAAA0W,SAAA,gBAAsDhC,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAob,UAAApb,EAAAtD,KAAA,mBAAgDsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,iCAAAW,EAAAtD,KAAAiI,KAAA0W,SAAA,eAAAlb,EAAA,KAAmHE,YAAA,kBAA4BL,EAAA2D,OAAA3D,EAAAkB,GAAA,KAAAf,EAAA,oBAAgDwb,OAAOC,aAAA5b,EAAAtD,KAAAiI,KAAA0W,SAAA,mBAAyDhC,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAob,UAAApb,EAAAtD,KAAA,sBAAmDsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,oCAAAW,EAAAtD,KAAAiI,KAAA0W,SAAA,kBAAAlb,EAAA,KAAyHE,YAAA,kBAA4BL,EAAA2D,OAAA3D,EAAAkB,GAAA,KAAAf,EAAA,oBAAgDwb,OAAOC,aAAA5b,EAAAtD,KAAAiI,KAAA0W,SAAA,YAAkDhC,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAob,UAAApb,EAAAtD,KAAA,eAA4CsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,8BAAAW,EAAAtD,KAAAiI,KAAA0W,SAAA,WAAAlb,EAAA,KAA4GE,YAAA,kBAA4BL,EAAA2D,OAAA3D,EAAAkB,GAAA,KAAAlB,EAAAtD,KAAA,MAAAyD,EAAA,oBAAiEwb,OAAOC,aAAA5b,EAAAtD,KAAAiI,KAAA0W,SAAA,gCAAsEhC,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAob,UAAApb,EAAAtD,KAAA,mCAAgEsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,gDAAAW,EAAAtD,KAAAiI,KAAA0W,SAAA,+BAAAlb,EAAA,KAAkJE,YAAA,kBAA4BL,EAAA2D,OAAA3D,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAtD,KAAA,MAAAyD,EAAA,oBAA0Ewb,OAAOC,aAAA5b,EAAAtD,KAAAiI,KAAA0W,SAAA,6BAAmEhC,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAob,UAAApb,EAAAtD,KAAA,gCAA6DsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,6CAAAW,EAAAtD,KAAAiI,KAAA0W,SAAA,4BAAAlb,EAAA,KAA4IE,YAAA,kBAA4BL,EAAA2D,OAAA3D,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAtD,KAAA,MAAAyD,EAAA,oBAA0EG,OAAOmb,QAAA,IAAapC,UAAW/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAAsa,sBAAAta,EAAAtD,KAAA8B,cAAsDwB,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,4CAAAW,EAAA2D,KAAA3D,EAAAkB,GAAA,KAAAlB,EAAAtD,KAAA,MAAAyD,EAAA,oBAA2IkZ,UAAU/X,MAAA,SAAAC,GAAyB,OAAAvB,EAAA2a,qBAAA3a,EAAAtD,UAA4CsD,EAAAkB,GAAA,WAAAlB,EAAAwB,GAAAxB,EAAAX,GAAA,2CAAAW,EAAA2D,MAAA,YGYj/J,EACA,KACA,KACA,MAIA7D,EAAA+B,QAAAC,OAAA,yBACeyD,EAAA,EAAAzF","file":"static/js/chunk-22d2.a0cf7976.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.userProfileLoading)?_c('main',[(_vm.isDesktop || _vm.isTablet)?_c('header',{staticClass:\"user-page-header\"},[_c('div',{staticClass:\"avatar-name-container\"},[_c('el-avatar',{attrs:{\"src\":_vm.user.avatar,\"size\":\"large\"}}),_vm._v(\" \"),_c('h1',[_vm._v(_vm._s(_vm.user.display_name))])],1),_vm._v(\" \"),_c('div',{staticClass:\"left-header-container\"},[_c('moderation-dropdown',{attrs:{\"user\":_vm.user,\"page\":'userPage'},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}}),_vm._v(\" \"),_c('reboot-button')],1)]):_vm._e(),_vm._v(\" \"),(_vm.isMobile)?_c('div',{staticClass:\"user-page-header-container\"},[_c('header',{staticClass:\"user-page-header\"},[_c('div',{staticClass:\"avatar-name-container\"},[_c('el-avatar',{attrs:{\"src\":_vm.user.avatar,\"size\":\"large\"}}),_vm._v(\" \"),_c('h1',[_vm._v(_vm._s(_vm.user.display_name))])],1),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('moderation-dropdown',{attrs:{\"user\":_vm.user,\"page\":'userPage'},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}})],1):_vm._e(),_vm._v(\" \"),_c('el-dialog',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],attrs:{\"visible\":_vm.resetPasswordDialogOpen,\"title\":_vm.$t('users.passwordResetTokenCreated'),\"custom-class\":\"password-reset-token-dialog\"},on:{\"update:visible\":function($event){_vm.resetPasswordDialogOpen=$event},\"close\":_vm.closeResetPasswordDialog}},[_c('div',[_c('p',{staticClass:\"password-reset-token\"},[_vm._v(\"Password reset token was generated: \"+_vm._s(_vm.passwordResetToken))]),_vm._v(\" \"),_c('p',[_vm._v(\"You can also use this link to reset password:\\n \"),_c('a',{staticClass:\"reset-password-link\",attrs:{\"href\":_vm.passwordResetLink,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.passwordResetLink))])])])]),_vm._v(\" \"),_c('div',{staticClass:\"user-profile-container\"},[_c('el-card',{staticClass:\"user-profile-card\"},[_c('div',{staticClass:\"el-table el-table--fit el-table--enable-row-hover el-table--enable-row-transition el-table--medium\"},[_c('table',{staticClass:\"user-profile-table\"},[_c('tbody',[_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.nickname')))]),_vm._v(\" \"),_c('td',[_vm._v(\"\\n \"+_vm._s(_vm.user.nickname)+\"\\n \")])]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',{staticClass:\"name-col\"},[_vm._v(\"ID\")]),_vm._v(\" \"),_c('td',{staticClass:\"value-col\"},[_vm._v(\"\\n \"+_vm._s(_vm.user.id)+\"\\n \")])]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.tags')))]),_vm._v(\" \"),_c('td',[_vm._l((_vm.user.tags),function(tag){return _c('el-tag',{key:tag,staticClass:\"user-profile-tag\"},[_vm._v(_vm._s(tag))])}),_vm._v(\" \"),(_vm.user.tags.length === 0)?_c('span',[_vm._v(\"—\")]):_vm._e()],2)]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.roles')))]),_vm._v(\" \"),_c('td',[(_vm.user.roles.admin)?_c('el-tag',{staticClass:\"user-profile-tag\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.admin'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.roles.moderator)?_c('el-tag',{staticClass:\"user-profile-tag\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderator'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(!_vm.user.roles.moderator && !_vm.user.roles.admin)?_c('span',[_vm._v(\"—\")]):_vm._e()],1)]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.localUppercase')))]),_vm._v(\" \"),_c('td',[(_vm.user.local)?_c('el-tag',{attrs:{\"type\":\"info\"}},[_vm._v(_vm._s(_vm.$t('userProfile.local')))]):_vm._e(),_vm._v(\" \"),(!_vm.user.local)?_c('el-tag',{attrs:{\"type\":\"info\"}},[_vm._v(_vm._s(_vm.$t('userProfile.external')))]):_vm._e()],1)]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.activeUppercase')))]),_vm._v(\" \"),_c('td',[(!_vm.user.deactivated)?_c('el-tag',{attrs:{\"type\":\"success\"}},[_vm._v(_vm._s(_vm.$t('userProfile.active')))]):_vm._e(),_vm._v(\" \"),(_vm.user.deactivated)?_c('el-tag',{attrs:{\"type\":\"danger\"}},[_vm._v(_vm._s(_vm.$t('userProfile.deactivated')))]):_vm._e()],1)])])])]),_vm._v(\" \"),_c('el-button',{staticClass:\"security-setting-button\",attrs:{\"icon\":\"el-icon-lock\"},on:{\"click\":function($event){_vm.securitySettingsModalVisible = true}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.securitySettings'))+\"\\n \")]),_vm._v(\" \"),_c('SecuritySettingsModal',{attrs:{\"user\":_vm.user,\"visible\":_vm.securitySettingsModalVisible},on:{\"close\":function($event){_vm.securitySettingsModalVisible = false}}})],1),_vm._v(\" \"),_c('div',{staticClass:\"recent-statuses-container\"},[_c('h2',{staticClass:\"recent-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.recentStatuses')))]),_vm._v(\" \"),_c('el-checkbox',{staticClass:\"show-private-statuses\",on:{\"change\":_vm.onTogglePrivate},model:{value:(_vm.showPrivate),callback:function ($$v) {_vm.showPrivate=$$v},expression:\"showPrivate\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.showPrivateStatuses'))+\"\\n \")]),_vm._v(\" \"),(!_vm.statusesLoading)?_c('el-timeline',{staticClass:\"statuses\"},[_vm._l((_vm.statuses),function(status){return _c('el-timeline-item',{key:status.id},[_c('status',{attrs:{\"status\":status,\"account\":status.account,\"show-checkbox\":false,\"user-id\":_vm.user.id,\"godmode\":_vm.showPrivate}})],1)}),_vm._v(\" \"),(_vm.statuses.length === 0)?_c('p',{staticClass:\"no-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.noStatuses')))]):_vm._e()],2):_vm._e()],1)],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./SecuritySettingsModal.vue?vue&type=template&id=7fb08478&\"\nimport script from \"./SecuritySettingsModal.vue?vue&type=script&lang=js&\"\nexport * from \"./SecuritySettingsModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SecuritySettingsModal.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SecuritySettingsModal.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{staticClass:\"security-settings-modal\",attrs:{\"before-close\":_vm.close,\"title\":_vm.$t('userProfile.securitySettings.securitySettings'),\"visible\":_vm.visible}},[_c('el-form',{attrs:{\"model\":_vm.securitySettingsForm,\"label-width\":_vm.getLabelWidth}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('userProfile.securitySettings.email')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('userProfile.securitySettings.inputNewEmail')},model:{value:(_vm.securitySettingsForm.newEmail),callback:function ($$v) {_vm.$set(_vm.securitySettingsForm, \"newEmail\", $$v)},expression:\"securitySettingsForm.newEmail\"}})],1),_vm._v(\" \"),_c('el-form-item',[_c('el-button',{staticClass:\"security-settings-submit-button\",attrs:{\"loading\":_vm.securitySettingsForm.isEmailLoading,\"disabled\":!_vm.securitySettingsForm.newEmail || _vm.securitySettingsForm.newEmail === _vm.userCredentials.email,\"type\":\"primary\"},on:{\"click\":function($event){return _vm.updateEmail()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.submit'))+\"\\n \")])],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"password-input\",attrs:{\"label\":_vm.$t('userProfile.securitySettings.password')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('userProfile.securitySettings.inputNewPassword')},model:{value:(_vm.securitySettingsForm.newPassword),callback:function ($$v) {_vm.$set(_vm.securitySettingsForm, \"newPassword\", $$v)},expression:\"securitySettingsForm.newPassword\"}}),_vm._v(\" \"),_c('small',{staticClass:\"form-text\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.passwordLengthNotice', { minLength: 8 }))+\"\\n \")])],1),_vm._v(\" \"),_c('el-alert',{staticClass:\"password-alert\",attrs:{\"closable\":false,\"type\":\"warning\",\"show-icon\":\"\"}},[_c('p',[_vm._v(_vm._s(_vm.$t('userProfile.securitySettings.passwordChangeWarning1')))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('userProfile.securitySettings.passwordChangeWarning2')))])]),_vm._v(\" \"),_c('el-form-item',[_c('el-button',{staticClass:\"security-settings-submit-button\",attrs:{\"loading\":_vm.securitySettingsForm.isPasswordLoading,\"disabled\":_vm.securitySettingsForm.newPassword.length < 8,\"type\":\"primary\"},on:{\"click\":function($event){return _vm.updatePassword()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.submit'))+\"\\n \")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./show.vue?vue&type=template&id=d4bc7d00&scoped=true&\"\nimport script from \"./show.vue?vue&type=script&lang=js&\"\nexport * from \"./show.vue?vue&type=script&lang=js&\"\nimport style0 from \"./show.vue?vue&type=style&index=0&id=d4bc7d00&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d4bc7d00\",\n null\n \n)\n\ncomponent.options.__file = \"show.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(!_vm.status.deleted)?_c('el-card',{staticClass:\"status-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[(_vm.showCheckbox)?_c('el-checkbox',{staticClass:\"status-checkbox\",on:{\"change\":function($event){return _vm.handleStatusSelection(_vm.account)}}}):_vm._e(),_vm._v(\" \"),_c('img',{staticClass:\"status-avatar-img\",attrs:{\"src\":_vm.account.avatar}}),_vm._v(\" \"),(!_vm.account.deactivated)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.account.url,\"target\":\"_blank\"}},[_c('h3',{staticClass:\"status-account-name\"},[_vm._v(_vm._s(_vm.account.display_name))])]):_c('span',[_c('h3',{staticClass:\"status-account-name\"},[_vm._v(_vm._s(_vm.account.display_name))]),_vm._v(\" \"),_c('h3',{staticClass:\"status-account-name deactivated\"},[_vm._v(\" (deactivated)\")])])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"status-actions\"},[(_vm.status.sensitive)?_c('el-tag',{attrs:{\"type\":\"warning\",\"size\":\"large\"}},[_vm._v(_vm._s(_vm.$t('reports.sensitive')))]):_vm._e(),_vm._v(\" \"),_c('el-tag',{attrs:{\"size\":\"large\"}},[_vm._v(_vm._s(_vm.capitalizeFirstLetter(_vm.status.visibility)))]),_vm._v(\" \"),_c('el-dropdown',{attrs:{\"trigger\":\"click\"}},[_c('el-button',{staticClass:\"status-actions-button\",attrs:{\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-edit\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.changeScope'))),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(!_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, true, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.addSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, false, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.removeSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'public')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'public')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.public'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'private')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'private')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.private'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'unlisted')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.unlisted'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deleteStatus(_vm.status.id)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.deleteStatus'))+\"\\n \")])],1)],1)],1)])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.spoiler_text)?_c('div',[_c('strong',[_vm._v(_vm._s(_vm.status.spoiler_text))]),_vm._v(\" \"),(!_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = true}}},[_vm._v(\"Show more\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = false}}},[_vm._v(\"Show less\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.status.spoiler_text)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e(),_vm._v(\" \"),_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.status.created_at))+\"\\n \")])])]):_c('el-card',{staticClass:\"status-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[_c('h4',{staticClass:\"status-deleted\"},[_vm._v(_vm._s(_vm.$t('reports.statusDeleted')))])])])])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.content)?_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}):_c('span',{staticClass:\"status-without-content\"},[_vm._v(\"no content\")])]),_vm._v(\" \"),(_vm.status.created_at)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.status.created_at))+\"\\n \")]):_vm._e()])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=0fdc1bba&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=style&index=0&id=d4bc7d00&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=style&index=0&id=d4bc7d00&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"hide-on-click\":false,\"size\":\"small\",\"trigger\":\"click\"}},[_c('div',[(_vm.page === 'users')?_c('span',{staticClass:\"el-dropdown-link\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderation'))+\"\\n \"),(_vm.isDesktop)?_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.page === 'userPage')?_c('el-button',{staticClass:\"moderate-user-button\"},[_c('span',{staticClass:\"moderate-user-button-container\"},[_c('span',[_c('i',{staticClass:\"el-icon-edit\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderateUser'))+\"\\n \")]),_vm._v(\" \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})])]):_vm._e()],1),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.admin ? _vm.$t('users.revokeAdmin') : _vm.$t('users.grantAdmin'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.moderator ? _vm.$t('users.revokeModerator') : _vm.$t('users.grantModerator'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id))?_c('el-dropdown-item',{attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleActivation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.deactivated ? _vm.$t('users.activateAccount') : _vm.$t('users.deactivateAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeletion(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.handleEmailConfirmation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.confirmAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleConfirmationResend(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.resendConfirmation'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_nsfw') },attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceNsfw'))+\"\\n \"),(_vm.user.tags.includes('force_nsfw'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('strip_media') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.stripMedia'))+\"\\n \"),(_vm.user.tags.includes('strip_media'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_unlisted') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceUnlisted'))+\"\\n \"),(_vm.user.tags.includes('force_unlisted'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('sandbox') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.sandbox'))+\"\\n \"),(_vm.user.tags.includes('sandbox'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_remote_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableRemoteSubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_remote_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_any_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableAnySubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_any_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.getPasswordResetToken(_vm.user.nickname)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.getPasswordResetToken'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.requirePasswordReset(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.requirePasswordReset'))+\"\\n \")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ModerationDropdown.vue?vue&type=template&id=4841469c&\"\nimport script from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ModerationDropdown.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-3384.458ffaf1.js b/priv/static/adminfe/static/js/chunk-3384.458ffaf1.js deleted file mode 100644 index eb2b55d37..000000000 --- a/priv/static/adminfe/static/js/chunk-3384.458ffaf1.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-3384"],{"26YS":function(e,t,a){"use strict";a.r(t);var o=a("o0o1"),s=a.n(o),i=a("yXPU"),c=a.n(i),n=a("mm8V"),l={props:{host:{type:String,required:!0},packName:{type:String,required:!0},name:{type:String,required:!0},file:{type:String,required:!0},isLocal:{type:Boolean,required:!0}},data:function(){return{newName:null,newFile:null,copyToLocalPackName:null,copyPopoverVisible:!1,copyToShortcode:"",copyToFilename:""}},computed:{emojiName:{get:function(){return null!==this.newName?this.newName:this.name},set:function(e){this.newName=e}},emojiFile:{get:function(){return null!==this.newFile?this.newFile:this.file},set:function(e){this.newFile=e}},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},localPacks:function(){return this.$store.state.emojiPacks.localPacks},remoteInstance:function(){return this.$store.state.emojiPacks.remoteInstance}},methods:{update:function(){var e=this;this.$store.dispatch("UpdateAndSavePackFile",{action:"update",packName:this.packName,oldName:this.name,newName:this.emojiName,newFilename:this.emojiFile}).then(function(){e.newName=null,e.newFile=null,e.$store.dispatch("ReloadEmoji")})},remove:function(){var e=this;this.$confirm("This will delete the emoji, are you sure?","Warning",{confirmButtonText:"Yes, delete the emoji",cancelButtonText:"No, leave it be",type:"warning"}).then(function(){e.$store.dispatch("UpdateAndSavePackFile",{action:"remove",packName:e.packName,name:e.name}).then(function(){e.newName=null,e.newFile=null,e.$store.dispatch("ReloadEmoji")})})},copyToLocal:function(){var e=this;this.$store.dispatch("UpdateAndSavePackFile",{action:"add",packName:this.copyToLocalPackName,shortcode:""!==this.copyToShortcode.trim()?this.copyToShortcode.trim():this.name,fileName:""!==this.copyToFilename.trim()?this.copyToFilename.trim():this.file,file:this.addressOfEmojiInPack(this.host,this.packName,this.file)}).then(function(){e.copyToLocalPackName=null,e.copyToLocalVisible=!1,e.copyToShortcode="",e.copyToFilename="",e.$store.dispatch("ReloadEmoji")})},addressOfEmojiInPack:n.a}},r=(a("4ySm"),a("KHd+")),m=Object(r.a)(l,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[e.isLocal?a("div",{class:e.isMobile?"emoji-container-flex":"emoji-container-grid"},[a("img",{staticClass:"emoji-preview-img",attrs:{src:e.addressOfEmojiInPack(e.host,e.packName,e.file)}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{placeholder:e.$t("emoji.shortcode")},model:{value:e.emojiName,callback:function(t){e.emojiName=t},expression:"emojiName"}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{placeholder:e.$t("emoji.file")},model:{value:e.emojiFile,callback:function(t){e.emojiFile=t},expression:"emojiFile"}}),e._v(" "),a("div",{staticClass:"emoji-buttons"},[a("el-button",{attrs:{type:"primary"},on:{click:e.update}},[e._v(e._s(e.$t("emoji.update")))]),e._v(" "),a("el-button",{staticClass:"remove-emoji-button",on:{click:e.remove}},[e._v(e._s(e.$t("emoji.remove")))])],1)],1):e._e(),e._v(" "),e.isLocal?e._e():a("div",{class:e.isMobile?"emoji-container-flex":"remote-emoji-container-grid"},[a("img",{staticClass:"emoji-preview-img",attrs:{src:e.addressOfEmojiInPack(e.remoteInstance,e.packName,e.file)}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{value:e.emojiName,placeholder:e.$t("emoji.shortcode")}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{value:e.emojiFile,placeholder:e.$t("emoji.file")}}),e._v(" "),a("el-popover",{staticClass:"copy-pack-container",attrs:{placement:"left-start","popper-class":"copy-popover"},model:{value:e.copyPopoverVisible,callback:function(t){e.copyPopoverVisible=t},expression:"copyPopoverVisible"}},[a("p",[e._v(e._s(e.$t("emoji.selectLocalPack")))]),e._v(" "),a("el-select",{staticClass:"copy-pack-select",attrs:{placeholder:e.$t("emoji.localPack")},model:{value:e.copyToLocalPackName,callback:function(t){e.copyToLocalPackName=t},expression:"copyToLocalPackName"}},e._l(e.localPacks,function(e,t){return a("el-option",{key:t,attrs:{label:t,value:t}})}),1),e._v(" "),a("p",[e._v(e._s(e.$t("emoji.specifyShortcode")))]),e._v(" "),a("el-input",{attrs:{placeholder:e.$t("emoji.leaveEmptyShortcode")},model:{value:e.copyToShortcode,callback:function(t){e.copyToShortcode=t},expression:"copyToShortcode"}}),e._v(" "),a("p",[e._v(e._s(e.$t("emoji.specifyFilename")))]),e._v(" "),a("el-input",{attrs:{placeholder:e.$t("emoji.leaveEmptyFilename")},model:{value:e.copyToFilename,callback:function(t){e.copyToFilename=t},expression:"copyToFilename"}}),e._v(" "),a("el-button",{attrs:{disabled:!e.copyToLocalPackName,type:"primary"},on:{click:e.copyToLocal}},[e._v(e._s(e.$t("emoji.copy")))]),e._v(" "),a("el-button",{staticClass:"emoji-button",attrs:{slot:"reference",type:"primary"},slot:"reference"},[e._v(e._s(e.$t("emoji.copyToLocalPack")))])],1)],1)])},[],!1,null,null,null);m.options.__file="SingleEmojiEditor.vue";var p=m.exports,d={props:{packName:{type:String,required:!0}},data:function(){return{shortcode:"",imageUploadURL:"",customFileName:""}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},shortcodePresent:function(){return""===this.shortcode.trim()}},methods:{uploadEmoji:function(e){var t=this,a=e.file;this.$store.dispatch("UpdateAndSavePackFile",{action:"add",packName:this.packName,shortcode:this.shortcode,file:a||this.imageUploadURL,fileName:this.customFileName}).then(function(){t.shortcode="",t.imageUploadURL="",t.customFileName="",t.$store.dispatch("ReloadEmoji")})}}},u=(a("IVv3"),Object(r.a)(d,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("el-form",{staticClass:"new-emoji-uploader-form",attrs:{"label-position":e.isMobile?"top":"left","label-width":"130px",size:"small"}},[a("el-form-item",{attrs:{label:e.$t("emoji.shortcode")}},[a("el-input",{attrs:{placeholder:e.$t("emoji.required")},model:{value:e.shortcode,callback:function(t){e.shortcode=t},expression:"shortcode"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.customFilename")}},[a("el-input",{attrs:{placeholder:e.$t("emoji.optional")},model:{value:e.customFileName,callback:function(t){e.customFileName=t},expression:"customFileName"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.uploadFile")}},[a("div",{staticClass:"upload-file-url"},[a("el-input",{attrs:{placeholder:e.$t("emoji.url")},model:{value:e.imageUploadURL,callback:function(t){e.imageUploadURL=t},expression:"imageUploadURL"}}),e._v(" "),a("el-button",{staticClass:"upload-button",attrs:{disabled:e.shortcodePresent,type:"primary"},on:{click:e.uploadEmoji}},[e._v(e._s(e.$t("emoji.upload")))])],1),e._v(" "),a("div",{staticClass:"upload-container"},[a("p",{staticClass:"text"},[e._v("or")]),e._v(" "),a("el-upload",{attrs:{"http-request":e.uploadEmoji,multiple:!1,"show-file-list":!1,action:"add"}},[a("el-button",{attrs:{disabled:e.shortcodePresent,type:"primary"}},[e._v(e._s(e.$t("emoji.clickToUpload")))])],1)],1)])],1)},[],!1,null,null,null));u.options.__file="NewEmojiUploader.vue";var h={components:{SingleEmojiEditor:p,NewEmojiUploader:u.exports},props:{name:{type:String,required:!0},pack:{type:Object,required:!0},host:{type:String,required:!0},isLocal:{type:Boolean,required:!0}},data:function(){return{showPackContent:[]}},computed:{isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"90px":(this.isTablet,"120px")},share:{get:function(){return this.pack.pack["share-files"]},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"share-files",value:e})}},homepage:{get:function(){return this.pack.pack.homepage},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"homepage",value:e})}},description:{get:function(){return this.pack.pack.description},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"description",value:e})}},license:{get:function(){return this.pack.pack.license},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"license",value:e})}},fallbackSrc:{get:function(){return this.pack.pack["fallback-src"]},set:function(e){""!==e.trim()?this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:e}):(this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:null}),this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src-sha256",value:null}))}}},methods:{deletePack:function(){var e=this;this.$confirm("This will delete the pack, are you sure?","Warning",{confirmButtonText:"Yes, delete the pack",cancelButtonText:"No, leave it be",type:"warning"}).then(function(){e.$store.dispatch("DeletePack",{name:e.name}).then(function(){return e.$store.dispatch("ReloadEmoji")}).then(function(){return e.$store.dispatch("SetLocalEmojiPacks")})}).catch(function(){})},savePackMetadata:function(){this.$store.dispatch("SavePackMetadata",{packName:this.name})}}},k=(a("LE4i"),Object(r.a)(h,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("el-collapse-item",{staticClass:"has-background",attrs:{title:e.name,name:e.name}},[a("el-form",{staticClass:"emoji-pack-metadata",attrs:{"label-width":e.labelWidth,"label-position":"left",size:"small"}},[a("el-form-item",{attrs:{label:e.$t("emoji.sharePack")}},[a("el-switch",{model:{value:e.share,callback:function(t){e.share=t},expression:"share"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.homepage")}},[a("el-input",{model:{value:e.homepage,callback:function(t){e.homepage=t},expression:"homepage"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.description")}},[a("el-input",{attrs:{type:"textarea"},model:{value:e.description,callback:function(t){e.description=t},expression:"description"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.license")}},[a("el-input",{model:{value:e.license,callback:function(t){e.license=t},expression:"license"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrc")}},[a("el-input",{model:{value:e.fallbackSrc,callback:function(t){e.fallbackSrc=t},expression:"fallbackSrc"}})],1),e._v(" "),e.fallbackSrc&&""!==e.fallbackSrc.trim()?a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrcSha")}},[e._v("\n "+e._s(e.pack.pack["fallback-src-sha256"])+"\n ")]):e._e()],1),e._v(" "),a("div",{staticClass:"pack-button-container"},[a("div",{staticClass:"save-pack-button-container"},[a("el-button",{staticClass:"save-pack-button",attrs:{type:"primary"},on:{click:e.savePackMetadata}},[e._v(e._s(e.$t("emoji.saveMetadata")))]),e._v(" "),a("el-button",{staticClass:"delete-pack-button",on:{click:e.deletePack}},[e._v(e._s(e.$t("emoji.deletePack")))])],1),e._v(" "),a("div",{staticClass:"download-pack-button-container"},[e.pack.pack["can-download"]?a("el-link",{attrs:{href:"//"+e.host+"/api/pleroma/emoji/packs/"+e.name+"/download_shared",underline:!1,type:"primary",target:"_blank"}},[a("el-button",{staticClass:"download-archive"},[e._v(e._s(e.$t("emoji.downloadPackArchive")))])],1):e._e()],1)]),e._v(" "),a("el-collapse",{staticClass:"contents-collapse",model:{value:e.showPackContent,callback:function(t){e.showPackContent=t},expression:"showPackContent"}},[e.isLocal?a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.addNewEmoji"),name:"addEmoji"}},[a("new-emoji-uploader",{attrs:{"pack-name":e.name}})],1):e._e(),e._v(" "),Object.keys(e.pack.files).length>0?a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.manageEmoji"),name:"manageEmoji"}},e._l(e.pack.files,function(t,o){return a("single-emoji-editor",{key:o,attrs:{host:e.host,"pack-name":e.name,name:o,file:t,"is-local":e.isLocal}})}),1):e._e()],1)],1)},[],!1,null,null,null));k.options.__file="LocalEmojiPack.vue";var f=k.exports,v={components:{SingleEmojiEditor:p},props:{name:{type:String,required:!0},pack:{type:Object,required:!0},host:{type:String,required:!0},isLocal:{type:Boolean,required:!0}},data:function(){return{showPackContent:[],downloadSharedAs:""}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"90px":(this.isTablet,"120px")},loadRemotePack:function(){return this.$store.state.emojiPacks.activeCollapseItems.includes(this.name)},share:{get:function(){return this.pack.pack["share-files"]},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"share-files",value:e})}},homepage:{get:function(){return this.pack.pack.homepage},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"homepage",value:e})}},description:{get:function(){return this.pack.pack.description},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"description",value:e})}},license:{get:function(){return this.pack.pack.license},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"license",value:e})}},fallbackSrc:{get:function(){return this.pack.pack["fallback-src"]},set:function(e){""!==e.trim()?this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:e}):(this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:null}),this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src-sha256",value:null}))}}},methods:{downloadFromInstance:function(e){var t=this,a="".concat(new URL(e).protocol,"//").concat(new URL(e).hostname);this.$store.dispatch("DownloadFrom",{instanceAddress:a,packName:this.name,as:this.downloadSharedAs}).then(function(){return t.$store.dispatch("ReloadEmoji")}).then(function(){return t.$store.dispatch("SetLocalEmojiPacks")})}}},b=(a("Zd0x"),Object(r.a)(v,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("el-collapse-item",{staticClass:"has-background",attrs:{title:e.name,name:e.name}},[e.loadRemotePack?a("div",[a("el-form",{staticClass:"emoji-pack-metadata remote-pack-metadata",attrs:{"label-width":e.labelWidth,"label-position":"left",size:"small"}},[a("el-form-item",{attrs:{label:e.$t("emoji.sharePack")}},[a("el-switch",{attrs:{disabled:""},model:{value:e.share,callback:function(t){e.share=t},expression:"share"}})],1),e._v(" "),e.homepage?a("el-form-item",{attrs:{label:e.$t("emoji.homepage")}},[a("span",[e._v(e._s(e.homepage))])]):e._e(),e._v(" "),e.description?a("el-form-item",{attrs:{label:e.$t("emoji.description")}},[a("span",[e._v(e._s(e.description))])]):e._e(),e._v(" "),e.license?a("el-form-item",{attrs:{label:e.$t("emoji.license")}},[a("span",[e._v(e._s(e.license))])]):e._e(),e._v(" "),e.fallbackSrc?a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrc")}},[a("span",[e._v(e._s(e.fallbackSrc))])]):e._e(),e._v(" "),e.fallbackSrc&&""!==e.fallbackSrc.trim()?a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrcSha")}},[e._v("\n "+e._s(e.pack.pack["fallback-src-sha256"])+"\n ")]):e._e(),e._v(" "),a("el-form-item",[e.pack.pack["can-download"]?a("el-link",{attrs:{href:e.pack.pack["fallback-src"],underline:!1,type:"primary",target:"_blank"}},[a("el-button",{staticClass:"download-archive"},[e._v(e._s(e.$t("emoji.downloadPackArchive")))])],1):e._e()],1)],1),e._v(" "),a("el-collapse",{staticClass:"contents-collapse",model:{value:e.showPackContent,callback:function(t){e.showPackContent=t},expression:"showPackContent"}},[Object.keys(e.pack.files).length>0?a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.manageEmoji"),name:"manageEmoji"}},e._l(e.pack.files,function(t,o){return a("single-emoji-editor",{key:o,attrs:{host:e.host,"pack-name":e.name,name:o,file:t,"is-local":e.isLocal}})}),1):e._e(),e._v(" "),a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.downloadPack"),name:"downloadPack"}},[a("p",[e._v("\n "+e._s(e.$t("emoji.thisWillDownload"))+' "'+e._s(e.name)+'" '+e._s(e.$t("emoji.downloadToCurrentInstance"))+'\n "'+e._s(""===e.downloadSharedAs.trim()?e.name:e.downloadSharedAs)+'" ('+e._s(e.$t("emoji.canBeChanged"))+").\n "+e._s(e.$t("emoji.willBeUsable"))+".\n ")]),e._v(" "),a("div",{staticClass:"download-shared-pack"},[a("el-input",{attrs:{placeholder:e.$t("emoji.downloadAsOptional")},model:{value:e.downloadSharedAs,callback:function(t){e.downloadSharedAs=t},expression:"downloadSharedAs"}}),e._v(" "),a("el-button",{staticClass:"download-shared-pack-button",attrs:{type:"primary"},on:{click:function(t){return e.downloadFromInstance(e.pack.pack.homepage)}}},[e._v("\n "+e._s(e.isDesktop?e.$t("emoji.downloadSharedPack"):e.$t("emoji.downloadSharedPackMobile"))+"\n ")])],1)])],1)],1):e._e()])},[],!1,null,null,null));b.options.__file="RemoteEmojiPack.vue";var j=b.exports,_=a("mSNy"),$={components:{LocalEmojiPack:f,RebootButton:a("rIUS").a,RemoteEmojiPack:j},data:function(){return{remoteInstanceAddress:"",newPackName:"",activeLocalPack:[],activeRemotePack:[],fullscreenLoading:!1}},computed:{isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"105px":this.isTablet?"180px":"240px"},localPacks:function(){return this.$store.state.emojiPacks.localPacks},remotePacks:function(){return this.$store.state.emojiPacks.remotePacks}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.refreshLocalPacks()},methods:{createLocalPack:function(){var e=this;this.$store.dispatch("CreatePack",{name:this.newPackName}).then(function(){e.newPackName="",e.$store.dispatch("SetLocalEmojiPacks"),e.$store.dispatch("ReloadEmoji")})},importFromFS:function(){var e=this;this.$store.dispatch("ImportFromFS").then(function(){e.$store.dispatch("SetLocalEmojiPacks"),e.$store.dispatch("ReloadEmoji")})},refreshLocalPacks:function(){try{this.$store.dispatch("SetLocalEmojiPacks")}catch(e){return}this.$message({type:"success",message:_.a.t("emoji.refreshed")})},refreshRemotePacks:function(){var e=c()(s.a.mark(function e(){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return this.fullscreenLoading=!0,e.next=3,this.$store.dispatch("SetRemoteEmojiPacks",{remoteInstance:this.remoteInstanceAddress});case 3:this.fullscreenLoading=!1;case 4:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}(),reloadEmoji:function(){var e=c()(s.a.mark(function e(){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0,this.$store.dispatch("ReloadEmoji"),e.next=7;break;case 4:return e.prev=4,e.t0=e.catch(0),e.abrupt("return");case 7:this.$message({type:"success",message:_.a.t("emoji.reloaded")});case 8:case"end":return e.stop()}},e,this,[[0,4]])}));return function(){return e.apply(this,arguments)}}(),setActiveCollapseItems:function(e){var t=Array.isArray(e)?e:[e];this.$store.dispatch("SetActiveCollapseItems",t)}}},P=(a("smuD"),Object(r.a)($,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"emoji-packs"},[a("div",{staticClass:"emoji-packs-header"},[a("h1",[e._v(e._s(e.$t("emoji.emojiPacks")))]),e._v(" "),a("reboot-button")],1),e._v(" "),a("div",{staticClass:"emoji-header-container"},[a("div",{staticClass:"emoji-packs-header-button-container"},[a("el-button",{staticClass:"reload-emoji-button",attrs:{type:"primary"},on:{click:e.reloadEmoji}},[e._v(e._s(e.$t("emoji.reloadEmoji")))]),e._v(" "),a("el-tooltip",{staticClass:"import-pack-button",attrs:{content:e.$t("emoji.importEmojiTooltip"),effects:"dark",placement:"bottom"}},[a("el-button",{attrs:{type:"primary"},on:{click:e.importFromFS}},[e._v("\n "+e._s(e.$t("emoji.importPacks"))+"\n ")])],1)],1)]),e._v(" "),a("el-divider",{staticClass:"divider"}),e._v(" "),a("el-form",{staticClass:"emoji-packs-form",attrs:{"label-width":e.labelWidth}},[a("el-form-item",{attrs:{label:e.$t("emoji.localPacks")}},[a("el-button",{attrs:{type:"primary"},on:{click:e.refreshLocalPacks}},[e._v(e._s(e.$t("emoji.refreshLocalPacks")))])],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.createLocalPack")}},[a("div",{staticClass:"create-pack"},[a("el-input",{attrs:{placeholder:e.$t("users.name")},model:{value:e.newPackName,callback:function(t){e.newPackName=t},expression:"newPackName"}}),e._v(" "),a("el-button",{staticClass:"create-pack-button",attrs:{disabled:""===e.newPackName.trim()},on:{click:e.createLocalPack}},[e._v("\n "+e._s(e.$t("users.create"))+"\n ")])],1)]),e._v(" "),Object.keys(e.localPacks).length>0?a("el-form-item",{attrs:{label:e.$t("emoji.packs")}},e._l(e.localPacks,function(t,o){return a("el-collapse",{key:o,model:{value:e.activeLocalPack,callback:function(t){e.activeLocalPack=t},expression:"activeLocalPack"}},[a("local-emoji-pack",{attrs:{name:o,pack:t,host:e.$store.getters.authHost,"is-local":!0}})],1)}),1):e._e(),e._v(" "),a("el-divider",{staticClass:"divider"}),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.remotePacks")}},[a("div",{staticClass:"create-pack"},[a("el-input",{attrs:{placeholder:e.$t("emoji.remoteInstanceAddress")},model:{value:e.remoteInstanceAddress,callback:function(t){e.remoteInstanceAddress=t},expression:"remoteInstanceAddress"}}),e._v(" "),a("el-button",{directives:[{name:"loading",rawName:"v-loading.fullscreen.lock",value:e.fullscreenLoading,expression:"fullscreenLoading",modifiers:{fullscreen:!0,lock:!0}}],staticClass:"create-pack-button",attrs:{disabled:""===e.remoteInstanceAddress.trim()},on:{click:e.refreshRemotePacks}},[e._v("\n "+e._s(e.$t("emoji.refreshRemote"))+"\n ")])],1)]),e._v(" "),Object.keys(e.remotePacks).length>0?a("el-form-item",{attrs:{label:e.$t("emoji.packs")}},e._l(e.remotePacks,function(t,o){return a("el-collapse",{key:o,on:{change:e.setActiveCollapseItems},model:{value:e.activeRemotePack,callback:function(t){e.activeRemotePack=t},expression:"activeRemotePack"}},[a("remote-emoji-pack",{attrs:{name:o,pack:t,host:e.$store.getters.authHost,"is-local":!1}})],1)}),1):e._e()],1)],1)},[],!1,null,null,null));P.options.__file="index.vue";t.default=P.exports},"4ySm":function(e,t,a){"use strict";var o=a("n6gr");a.n(o).a},"6lYW":function(e,t,a){},HBNe:function(e,t,a){},IVv3:function(e,t,a){"use strict";var o=a("6lYW");a.n(o).a},LE4i:function(e,t,a){"use strict";var o=a("HBNe");a.n(o).a},QZC8:function(e,t,a){},Zd0x:function(e,t,a){"use strict";var o=a("eDOw");a.n(o).a},eDOw:function(e,t,a){},n6gr:function(e,t,a){},rIUS:function(e,t,a){"use strict";var o=a("o0o1"),s=a.n(o),i=a("yXPU"),c=a.n(i),n=a("mSNy"),l={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var e=c()(s.a.mark(function e(){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this.$store.dispatch("RestartApplication");case 3:e.next=8;break;case 5:return e.prev=5,e.t0=e.catch(0),e.abrupt("return");case 8:this.$message({type:"success",message:n.a.t("settings.restartSuccess")});case 9:case"end":return e.stop()}},e,this,[[0,5]])}));return function(){return e.apply(this,arguments)}}()}},r=a("KHd+"),m=Object(r.a)(l,function(){var e=this.$createElement,t=this._self._c||e;return this.needReboot?t("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[t("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[t("span",[t("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);m.options.__file="index.vue";t.a=m.exports},smuD:function(e,t,a){"use strict";var o=a("QZC8");a.n(o).a}}]); -//# sourceMappingURL=chunk-3384.458ffaf1.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-3384.458ffaf1.js.map b/priv/static/adminfe/static/js/chunk-3384.458ffaf1.js.map deleted file mode 100644 index 0bb577aab..000000000 --- a/priv/static/adminfe/static/js/chunk-3384.458ffaf1.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/emojiPacks/index.vue?a765","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue?5a7e","webpack:///src/views/emojiPacks/components/SingleEmojiEditor.vue","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue?65cb","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue?1c09","webpack:///src/views/emojiPacks/components/NewEmojiUploader.vue","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue?325f","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue?88cd","webpack:///src/views/emojiPacks/components/LocalEmojiPack.vue","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue?bf5f","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue?4c9f","webpack:///src/views/emojiPacks/components/RemoteEmojiPack.vue","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue?2349","webpack:///./src/views/emojiPacks/index.vue?a332","webpack:///src/views/emojiPacks/index.vue","webpack:///./src/views/emojiPacks/index.vue","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue?bc44","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue?d98f","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue?2a38","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue?118a","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue","webpack:///./src/views/emojiPacks/index.vue?7b86"],"names":["components_SingleEmojiEditorvue_type_script_lang_js_","props","host","type","String","required","packName","name","file","isLocal","Boolean","data","newName","newFile","copyToLocalPackName","copyPopoverVisible","copyToShortcode","copyToFilename","computed","emojiName","get","this","set","val","emojiFile","isDesktop","$store","state","app","device","isMobile","localPacks","emojiPacks","remoteInstance","methods","update","_this","dispatch","action","oldName","newFilename","then","remove","_this2","$confirm","confirmButtonText","cancelButtonText","copyToLocal","_this3","shortcode","trim","fileName","addressOfEmojiInPack","copyToLocalVisible","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","class","staticClass","attrs","src","_v","placeholder","$t","model","value","callback","$$v","expression","on","click","_s","_e","placement","popper-class","_l","_pack","key","label","disabled","slot","options","__file","SingleEmojiEditor","components_NewEmojiUploadervue_type_script_lang_js_","imageUploadURL","customFileName","shortcodePresent","uploadEmoji","_ref","NewEmojiUploader_component","label-position","label-width","size","http-request","multiple","show-file-list","components_LocalEmojiPackvue_type_script_lang_js_","components","NewEmojiUploader","pack","showPackContent","isTablet","labelWidth","share","homepage","description","license","fallbackSrc","deletePack","catch","savePackMetadata","LocalEmojiPack_component","title","href","underline","target","pack-name","keys","files","length","ename","is-local","LocalEmojiPack","components_RemoteEmojiPackvue_type_script_lang_js_","downloadSharedAs","loadRemotePack","activeCollapseItems","includes","downloadFromInstance","url","instanceAddress","concat","URL","protocol","hostname","as","RemoteEmojiPack_component","$event","RemoteEmojiPack","views_emojiPacksvue_type_script_lang_js_","RebootButton","remoteInstanceAddress","newPackName","activeLocalPack","activeRemotePack","fullscreenLoading","remotePacks","mounted","refreshLocalPacks","createLocalPack","importFromFS","e","$message","message","lang","t","refreshRemotePacks","_refreshRemotePacks","asyncToGenerator_default","regenerator_default","a","mark","_callee","wrap","_context","prev","next","stop","apply","arguments","reloadEmoji","_reloadEmoji","_callee2","_context2","t0","abrupt","setActiveCollapseItems","activeItems","items","Array","isArray","emojiPacks_component","content","effects","getters","authHost","directives","rawName","modifiers","fullscreen","lock","change","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_SingleEmojiEditor_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_NewEmojiUploader_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_LocalEmojiPack_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RemoteEmojiPack_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","components_RebootButtonvue_type_script_lang_js_","needReboot","restartApp","_restartApp","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__"],"mappings":"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","file":"static/js/chunk-3384.458ffaf1.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"emoji-packs\"},[_c('div',{staticClass:\"emoji-packs-header\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('emoji.emojiPacks')))]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"emoji-header-container\"},[_c('div',{staticClass:\"emoji-packs-header-button-container\"},[_c('el-button',{staticClass:\"reload-emoji-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.reloadEmoji}},[_vm._v(_vm._s(_vm.$t('emoji.reloadEmoji')))]),_vm._v(\" \"),_c('el-tooltip',{staticClass:\"import-pack-button\",attrs:{\"content\":_vm.$t('emoji.importEmojiTooltip'),\"effects\":\"dark\",\"placement\":\"bottom\"}},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.importFromFS}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.importPacks'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('el-form',{staticClass:\"emoji-packs-form\",attrs:{\"label-width\":_vm.labelWidth}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.localPacks')}},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.refreshLocalPacks}},[_vm._v(_vm._s(_vm.$t('emoji.refreshLocalPacks')))])],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.createLocalPack')}},[_c('div',{staticClass:\"create-pack\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('users.name')},model:{value:(_vm.newPackName),callback:function ($$v) {_vm.newPackName=$$v},expression:\"newPackName\"}}),_vm._v(\" \"),_c('el-button',{staticClass:\"create-pack-button\",attrs:{\"disabled\":_vm.newPackName.trim() === ''},on:{\"click\":_vm.createLocalPack}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.create'))+\"\\n \")])],1)]),_vm._v(\" \"),(Object.keys(_vm.localPacks).length > 0)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.packs')}},_vm._l((_vm.localPacks),function(pack,name){return _c('el-collapse',{key:name,model:{value:(_vm.activeLocalPack),callback:function ($$v) {_vm.activeLocalPack=$$v},expression:\"activeLocalPack\"}},[_c('local-emoji-pack',{attrs:{\"name\":name,\"pack\":pack,\"host\":_vm.$store.getters.authHost,\"is-local\":true}})],1)}),1):_vm._e(),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.remotePacks')}},[_c('div',{staticClass:\"create-pack\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.remoteInstanceAddress')},model:{value:(_vm.remoteInstanceAddress),callback:function ($$v) {_vm.remoteInstanceAddress=$$v},expression:\"remoteInstanceAddress\"}}),_vm._v(\" \"),_c('el-button',{directives:[{name:\"loading\",rawName:\"v-loading.fullscreen.lock\",value:(_vm.fullscreenLoading),expression:\"fullscreenLoading\",modifiers:{\"fullscreen\":true,\"lock\":true}}],staticClass:\"create-pack-button\",attrs:{\"disabled\":_vm.remoteInstanceAddress.trim() === ''},on:{\"click\":_vm.refreshRemotePacks}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.refreshRemote'))+\"\\n \")])],1)]),_vm._v(\" \"),(Object.keys(_vm.remotePacks).length > 0)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.packs')}},_vm._l((_vm.remotePacks),function(pack,name){return _c('el-collapse',{key:name,on:{\"change\":_vm.setActiveCollapseItems},model:{value:(_vm.activeRemotePack),callback:function ($$v) {_vm.activeRemotePack=$$v},expression:\"activeRemotePack\"}},[_c('remote-emoji-pack',{attrs:{\"name\":name,\"pack\":pack,\"host\":_vm.$store.getters.authHost,\"is-local\":false}})],1)}),1):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./SingleEmojiEditor.vue?vue&type=template&id=6afaf62f&\"\nimport script from \"./SingleEmojiEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./SingleEmojiEditor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SingleEmojiEditor.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SingleEmojiEditor.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.isLocal)?_c('div',{class:_vm.isMobile ? 'emoji-container-flex' : 'emoji-container-grid'},[_c('img',{staticClass:\"emoji-preview-img\",attrs:{\"src\":_vm.addressOfEmojiInPack(_vm.host, _vm.packName, _vm.file)}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"placeholder\":_vm.$t('emoji.shortcode')},model:{value:(_vm.emojiName),callback:function ($$v) {_vm.emojiName=$$v},expression:\"emojiName\"}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"placeholder\":_vm.$t('emoji.file')},model:{value:(_vm.emojiFile),callback:function ($$v) {_vm.emojiFile=$$v},expression:\"emojiFile\"}}),_vm._v(\" \"),_c('div',{staticClass:\"emoji-buttons\"},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.update}},[_vm._v(_vm._s(_vm.$t('emoji.update')))]),_vm._v(\" \"),_c('el-button',{staticClass:\"remove-emoji-button\",on:{\"click\":_vm.remove}},[_vm._v(_vm._s(_vm.$t('emoji.remove')))])],1)],1):_vm._e(),_vm._v(\" \"),(!_vm.isLocal)?_c('div',{class:_vm.isMobile ? 'emoji-container-flex' : 'remote-emoji-container-grid'},[_c('img',{staticClass:\"emoji-preview-img\",attrs:{\"src\":_vm.addressOfEmojiInPack(_vm.remoteInstance, _vm.packName, _vm.file)}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"value\":_vm.emojiName,\"placeholder\":_vm.$t('emoji.shortcode')}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"value\":_vm.emojiFile,\"placeholder\":_vm.$t('emoji.file')}}),_vm._v(\" \"),_c('el-popover',{staticClass:\"copy-pack-container\",attrs:{\"placement\":\"left-start\",\"popper-class\":\"copy-popover\"},model:{value:(_vm.copyPopoverVisible),callback:function ($$v) {_vm.copyPopoverVisible=$$v},expression:\"copyPopoverVisible\"}},[_c('p',[_vm._v(_vm._s(_vm.$t('emoji.selectLocalPack')))]),_vm._v(\" \"),_c('el-select',{staticClass:\"copy-pack-select\",attrs:{\"placeholder\":_vm.$t('emoji.localPack')},model:{value:(_vm.copyToLocalPackName),callback:function ($$v) {_vm.copyToLocalPackName=$$v},expression:\"copyToLocalPackName\"}},_vm._l((_vm.localPacks),function(_pack,name){return _c('el-option',{key:name,attrs:{\"label\":name,\"value\":name}})}),1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('emoji.specifyShortcode')))]),_vm._v(\" \"),_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.leaveEmptyShortcode')},model:{value:(_vm.copyToShortcode),callback:function ($$v) {_vm.copyToShortcode=$$v},expression:\"copyToShortcode\"}}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('emoji.specifyFilename')))]),_vm._v(\" \"),_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.leaveEmptyFilename')},model:{value:(_vm.copyToFilename),callback:function ($$v) {_vm.copyToFilename=$$v},expression:\"copyToFilename\"}}),_vm._v(\" \"),_c('el-button',{attrs:{\"disabled\":!_vm.copyToLocalPackName,\"type\":\"primary\"},on:{\"click\":_vm.copyToLocal}},[_vm._v(_vm._s(_vm.$t('emoji.copy')))]),_vm._v(\" \"),_c('el-button',{staticClass:\"emoji-button\",attrs:{\"slot\":\"reference\",\"type\":\"primary\"},slot:\"reference\"},[_vm._v(_vm._s(_vm.$t('emoji.copyToLocalPack')))])],1)],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./NewEmojiUploader.vue?vue&type=template&id=45b4c7fe&\"\nimport script from \"./NewEmojiUploader.vue?vue&type=script&lang=js&\"\nexport * from \"./NewEmojiUploader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewEmojiUploader.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"NewEmojiUploader.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-form',{staticClass:\"new-emoji-uploader-form\",attrs:{\"label-position\":_vm.isMobile ? 'top' : 'left',\"label-width\":\"130px\",\"size\":\"small\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.shortcode')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.required')},model:{value:(_vm.shortcode),callback:function ($$v) {_vm.shortcode=$$v},expression:\"shortcode\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.customFilename')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.optional')},model:{value:(_vm.customFileName),callback:function ($$v) {_vm.customFileName=$$v},expression:\"customFileName\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.uploadFile')}},[_c('div',{staticClass:\"upload-file-url\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.url')},model:{value:(_vm.imageUploadURL),callback:function ($$v) {_vm.imageUploadURL=$$v},expression:\"imageUploadURL\"}}),_vm._v(\" \"),_c('el-button',{staticClass:\"upload-button\",attrs:{\"disabled\":_vm.shortcodePresent,\"type\":\"primary\"},on:{\"click\":_vm.uploadEmoji}},[_vm._v(_vm._s(_vm.$t('emoji.upload')))])],1),_vm._v(\" \"),_c('div',{staticClass:\"upload-container\"},[_c('p',{staticClass:\"text\"},[_vm._v(\"or\")]),_vm._v(\" \"),_c('el-upload',{attrs:{\"http-request\":_vm.uploadEmoji,\"multiple\":false,\"show-file-list\":false,\"action\":\"add\"}},[_c('el-button',{attrs:{\"disabled\":_vm.shortcodePresent,\"type\":\"primary\"}},[_vm._v(_vm._s(_vm.$t('emoji.clickToUpload')))])],1)],1)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./LocalEmojiPack.vue?vue&type=template&id=1b65e97b&\"\nimport script from \"./LocalEmojiPack.vue?vue&type=script&lang=js&\"\nexport * from \"./LocalEmojiPack.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LocalEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"LocalEmojiPack.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-collapse-item',{staticClass:\"has-background\",attrs:{\"title\":_vm.name,\"name\":_vm.name}},[_c('el-form',{staticClass:\"emoji-pack-metadata\",attrs:{\"label-width\":_vm.labelWidth,\"label-position\":\"left\",\"size\":\"small\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.sharePack')}},[_c('el-switch',{model:{value:(_vm.share),callback:function ($$v) {_vm.share=$$v},expression:\"share\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.homepage')}},[_c('el-input',{model:{value:(_vm.homepage),callback:function ($$v) {_vm.homepage=$$v},expression:\"homepage\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.description')}},[_c('el-input',{attrs:{\"type\":\"textarea\"},model:{value:(_vm.description),callback:function ($$v) {_vm.description=$$v},expression:\"description\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.license')}},[_c('el-input',{model:{value:(_vm.license),callback:function ($$v) {_vm.license=$$v},expression:\"license\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrc')}},[_c('el-input',{model:{value:(_vm.fallbackSrc),callback:function ($$v) {_vm.fallbackSrc=$$v},expression:\"fallbackSrc\"}})],1),_vm._v(\" \"),(_vm.fallbackSrc && _vm.fallbackSrc.trim() !== '')?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrcSha')}},[_vm._v(\"\\n \"+_vm._s(_vm.pack.pack[\"fallback-src-sha256\"])+\"\\n \")]):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"pack-button-container\"},[_c('div',{staticClass:\"save-pack-button-container\"},[_c('el-button',{staticClass:\"save-pack-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.savePackMetadata}},[_vm._v(_vm._s(_vm.$t('emoji.saveMetadata')))]),_vm._v(\" \"),_c('el-button',{staticClass:\"delete-pack-button\",on:{\"click\":_vm.deletePack}},[_vm._v(_vm._s(_vm.$t('emoji.deletePack')))])],1),_vm._v(\" \"),_c('div',{staticClass:\"download-pack-button-container\"},[(_vm.pack.pack['can-download'])?_c('el-link',{attrs:{\"href\":(\"//\" + _vm.host + \"/api/pleroma/emoji/packs/\" + _vm.name + \"/download_shared\"),\"underline\":false,\"type\":\"primary\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"download-archive\"},[_vm._v(_vm._s(_vm.$t('emoji.downloadPackArchive')))])],1):_vm._e()],1)]),_vm._v(\" \"),_c('el-collapse',{staticClass:\"contents-collapse\",model:{value:(_vm.showPackContent),callback:function ($$v) {_vm.showPackContent=$$v},expression:\"showPackContent\"}},[(_vm.isLocal)?_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.addNewEmoji'),\"name\":\"addEmoji\"}},[_c('new-emoji-uploader',{attrs:{\"pack-name\":_vm.name}})],1):_vm._e(),_vm._v(\" \"),(Object.keys(_vm.pack.files).length > 0)?_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.manageEmoji'),\"name\":\"manageEmoji\"}},_vm._l((_vm.pack.files),function(file,ename){return _c('single-emoji-editor',{key:ename,attrs:{\"host\":_vm.host,\"pack-name\":_vm.name,\"name\":ename,\"file\":file,\"is-local\":_vm.isLocal}})}),1):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RemoteEmojiPack.vue?vue&type=template&id=ec4f7892&\"\nimport script from \"./RemoteEmojiPack.vue?vue&type=script&lang=js&\"\nexport * from \"./RemoteEmojiPack.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RemoteEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RemoteEmojiPack.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-collapse-item',{staticClass:\"has-background\",attrs:{\"title\":_vm.name,\"name\":_vm.name}},[(_vm.loadRemotePack)?_c('div',[_c('el-form',{staticClass:\"emoji-pack-metadata remote-pack-metadata\",attrs:{\"label-width\":_vm.labelWidth,\"label-position\":\"left\",\"size\":\"small\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.sharePack')}},[_c('el-switch',{attrs:{\"disabled\":\"\"},model:{value:(_vm.share),callback:function ($$v) {_vm.share=$$v},expression:\"share\"}})],1),_vm._v(\" \"),(_vm.homepage)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.homepage')}},[_c('span',[_vm._v(_vm._s(_vm.homepage))])]):_vm._e(),_vm._v(\" \"),(_vm.description)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.description')}},[_c('span',[_vm._v(_vm._s(_vm.description))])]):_vm._e(),_vm._v(\" \"),(_vm.license)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.license')}},[_c('span',[_vm._v(_vm._s(_vm.license))])]):_vm._e(),_vm._v(\" \"),(_vm.fallbackSrc)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrc')}},[_c('span',[_vm._v(_vm._s(_vm.fallbackSrc))])]):_vm._e(),_vm._v(\" \"),(_vm.fallbackSrc && _vm.fallbackSrc.trim() !== '')?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrcSha')}},[_vm._v(\"\\n \"+_vm._s(_vm.pack.pack[\"fallback-src-sha256\"])+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-form-item',[(_vm.pack.pack['can-download'])?_c('el-link',{attrs:{\"href\":_vm.pack.pack['fallback-src'],\"underline\":false,\"type\":\"primary\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"download-archive\"},[_vm._v(_vm._s(_vm.$t('emoji.downloadPackArchive')))])],1):_vm._e()],1)],1),_vm._v(\" \"),_c('el-collapse',{staticClass:\"contents-collapse\",model:{value:(_vm.showPackContent),callback:function ($$v) {_vm.showPackContent=$$v},expression:\"showPackContent\"}},[(Object.keys(_vm.pack.files).length > 0)?_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.manageEmoji'),\"name\":\"manageEmoji\"}},_vm._l((_vm.pack.files),function(file,ename){return _c('single-emoji-editor',{key:ename,attrs:{\"host\":_vm.host,\"pack-name\":_vm.name,\"name\":ename,\"file\":file,\"is-local\":_vm.isLocal}})}),1):_vm._e(),_vm._v(\" \"),_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.downloadPack'),\"name\":\"downloadPack\"}},[_c('p',[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.thisWillDownload'))+\" \\\"\"+_vm._s(_vm.name)+\"\\\" \"+_vm._s(_vm.$t('emoji.downloadToCurrentInstance'))+\"\\n \\\"\"+_vm._s(_vm.downloadSharedAs.trim() === '' ? _vm.name : _vm.downloadSharedAs)+\"\\\" (\"+_vm._s(_vm.$t('emoji.canBeChanged'))+\").\\n \"+_vm._s(_vm.$t('emoji.willBeUsable'))+\".\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"download-shared-pack\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.downloadAsOptional')},model:{value:(_vm.downloadSharedAs),callback:function ($$v) {_vm.downloadSharedAs=$$v},expression:\"downloadSharedAs\"}}),_vm._v(\" \"),_c('el-button',{staticClass:\"download-shared-pack-button\",attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.downloadFromInstance(_vm.pack.pack['homepage'])}}},[_vm._v(\"\\n \"+_vm._s(_vm.isDesktop ? _vm.$t('emoji.downloadSharedPack') : _vm.$t('emoji.downloadSharedPackMobile'))+\"\\n \")])],1)])],1)],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=7bc01b62&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\""],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-4011.67fb1692.js b/priv/static/adminfe/static/js/chunk-4011.67fb1692.js deleted file mode 100644 index 775ed26f1..000000000 --- a/priv/static/adminfe/static/js/chunk-4011.67fb1692.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-4011"],{"+2nY":function(t,e,i){"use strict";var s=i("ld6V");i.n(s).a},"+qaP":function(t,e,i){"use strict";var s=i("60OA");i.n(s).a},"0ods":function(t,e,i){},"2q6O":function(t,e,i){"use strict";var s=i("Scsy");i.n(s).a},"3IoU":function(t,e,i){"use strict";var s=i("6V7o");i.n(s).a},"4NUT":function(t,e,i){},"4b9x":function(t,e,i){"use strict";var s=i("wgcy");i.n(s).a},"60OA":function(t,e,i){},"6V7o":function(t,e,i){},"77pt":function(t,e,i){},"9Hof":function(t,e,i){"use strict";var s=i("ncj/");i.n(s).a},"9p49":function(t,e,i){},AUFL:function(t,e,i){},DPt0:function(t,e,i){"use strict";var s=i("x6RV");i.n(s).a},Ezi3:function(t,e,i){"use strict";var s=i("MNl6");i.n(s).a},FCne:function(t,e,i){"use strict";var s=i("OCuP");i.n(s).a},"J7+w":function(t,e,i){"use strict";var s=i("fyIw");i.n(s).a},JqY8:function(t,e,i){},KFE3:function(t,e,i){"use strict";var s=i("mSK5");i.n(s).a},LHUV:function(t,e,i){"use strict";var s=i("0ods");i.n(s).a},MNl6:function(t,e,i){},NiUD:function(t,e,i){},OCuP:function(t,e,i){},PYLh:function(t,e,i){},Px65:function(t,e,i){},PygS:function(t,e,i){"use strict";var s=i("TtMh");i.n(s).a},QtHe:function(t,e,i){"use strict";var s=i("AUFL");i.n(s).a},Scsy:function(t,e,i){},TOIk:function(t,e,i){},TRR9:function(t,e,i){},TtMh:function(t,e,i){},TudB:function(t,e,i){},"UbP/":function(t,e,i){},UdS4:function(t,e,i){"use strict";var s=i("WwJU");i.n(s).a},UtFC:function(t,e,i){},"WvM+":function(t,e,i){"use strict";var s=i("TRR9");i.n(s).a},WwJU:function(t,e,i){},YKHE:function(t,e,i){},YcIK:function(t,e,i){"use strict";i.r(e);var s=i("o0o1"),n=i.n(s),a=i("yXPU"),r=i.n(a),o=i("mSNy"),u={"activity-pub":{label:"settings.activityPub",settings:[":activitypub",":user"]},authentication:{label:"settings.auth",settings:[":auth",":ldap",":oauth2","Pleroma.Web.Auth.Authenticator"]},"auto-linker":{label:"settings.autoLinker",settings:[":opts"]},esshd:{label:"settings.esshd",settings:[":esshd"]},captcha:{label:"settings.captcha",settings:["Pleroma.Captcha","Pleroma.Captcha.Kocaptcha"]},frontend:{label:"settings.frontend",settings:[":assets",":chat",":emoji",":frontend_configurations",":markup",":static_fe"]},gopher:{label:"settings.gopher",settings:[":gopher"]},http:{label:"settings.http",settings:[":cors_plug",":http",":http_security",":http_signatures",":web_cache_ttl"]},instance:{label:"settings.instance",settings:[":admin_token",":instance",":manifest","Pleroma.User","Pleroma.ScheduledActivity",":uri_schemes",":feed",":streamer"]},"job-queue":{label:"settings.jobQueue",settings:["Pleroma.ActivityExpiration","Oban",":workers"]},logger:{label:"settings.logger",settings:[":console",":ex_syslogger",":quack",":logger"]},mailer:{label:"settings.mailer",settings:[":email_notifications","Pleroma.Emails.Mailer","Pleroma.Emails.UserEmail",":swoosh","Pleroma.Emails.NewUsersDigestEmail"]},"media-proxy":{label:"settings.mediaProxy",settings:[":media_proxy"]},metadata:{label:"settings.metadata",settings:["Pleroma.Web.Metadata",":rich_media"]},mrf:{label:"settings.mrf",settings:[":mrf_simple",":mrf_rejectnonpublic",":mrf_hellthread",":mrf_keyword",":mrf_subchain",":mrf_mention",":mrf_normalize_markup",":mrf_vocabulary",":mrf_object_age",":modules"]},"rate-limiters":{label:"settings.rateLimiters",settings:[":rate_limit"]},relays:{label:"settings.relays",settings:[]},"web-push":{label:"settings.webPush",settings:[":vapid_details"]},upload:{label:"settings.upload",settings:["Pleroma.Upload.Filter.AnonymizeFilename","Pleroma.Upload.Filter.Mogrify","Pleroma.Uploaders.S3","Pleroma.Uploaders.Local","Pleroma.Upload"]},other:{label:"settings.other",settings:[":mime","Pleroma.Plugs.RemoteIp"]}},l=i("MVZn"),c=i.n(l),p=i("L2JU"),d=i("lSNA"),g=i.n(d),h={name:"AutoLinkerInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},methods:{autoLinkerBooleanValue:function(t){var e=this.data[this.setting.key];return"string"==typeof e||"number"==typeof e},autoLinkerIntegerValue:function(t){return this.data[this.setting.key]||0},autoLinkerStringValue:function(t){return this.data[this.setting.key]||""},processTwoTypeValue:function(t,e){if(!0===t){var i=":truncate"===e?0:"";this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,e,this.setting.type)}else this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,e,this.setting.type)},updateSetting:function(t,e,i,s,n){this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},m=(i("LHUV"),i("KHd+")),b=Object(m.a)(h,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[":class"===t.setting.key||":rel"===t.setting.key?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-switch",{attrs:{value:t.autoLinkerBooleanValue(t.setting.key)},on:{change:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}),t._v(" "),t.autoLinkerBooleanValue(t.setting.key)?i("el-input",{attrs:{value:t.autoLinkerStringValue(t.setting.key)},on:{input:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}):t._e()],1):t._e(),t._v(" "),":truncate"===t.setting.key?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-switch",{attrs:{value:t.autoLinkerBooleanValue(t.setting.key)},on:{change:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}),t._v(" "),t.autoLinkerBooleanValue(t.setting.key)?i("el-input-number",{attrs:{value:t.autoLinkerIntegerValue(t.setting.key)},on:{input:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}):t._e()],1):t._e()])},[],!1,null,null,null);b.options.__file="AutoLinkerInput.vue";var f=b.exports,v=i("RIqP"),y=i.n(v),_={name:"EditableKeywordInput",props:{data:{type:Array,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{editableKeywordWithInteger:function(){return Array.isArray(this.setting.type)&&this.setting.type.includes("keyword")&&this.setting.type.includes("integer")},isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{addRowToEditableKeyword:function(){var t=[].concat(y()(this.data),[{"":{value:"",id:this.generateID()}}]);this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},deleteEditableKeywordRow:function(t){var e=this.getId(t),i=this.data.filter(function(t){return Object.values(t)[0].id!==e});this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},generateID:function(){return"f".concat((~~(1e8*Math.random())).toString(16))},getKey:function(t){return Object.keys(t)[0]},getId:function(t){return Object.values(t)[0].id},getValue:function(t){return Object.values(t)[0].value},parseEditableKeyword:function(t,e,i){var s=this,n=this.getId(i),a=this.data.map(function(i,a){return Object.values(i)[0].id===n?"key"===e?g()({},t,Object.values(s.data[a])[0]):g()({},Object.keys(i)[0],c()({},Object.values(s.data[a])[0],{value:t})):i});this.updateSetting(a,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=this.wrapUpdatedSettings(t,s,n);this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})},wrapUpdatedSettings:function(t,e,i){return"map"===i?t.reduce(function(t,e){return c()({},t,g()({},Object.keys(e)[0],Object.values(e)[0].value))},{}):t.reduce(function(t,e){return c()({},t,g()({},Object.keys(e)[0],["list",Object.values(e)[0].value]))},{})}}},k=(i("nKzF"),Object(m.a)(_,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"editable-keyword-container"},[":replace"===t.setting.key?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"setting-input"},[i("el-input",{staticClass:"name-input",attrs:{value:t.getKey(e),placeholder:"pattern"},on:{input:function(i){return t.parseEditableKeyword(i,"key",e)}}}),t._v(" :\n "),i("el-input",{staticClass:"value-input",attrs:{value:t.getValue(e),placeholder:"replacement"},on:{input:function(i){return t.parseEditableKeyword(i,"value",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteEditableKeywordRow(e)}}})],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToEditableKeyword}})],2):t.editableKeywordWithInteger?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"setting-input"},[i("el-input",{staticClass:"name-input",attrs:{value:t.getKey(e),placeholder:"key"},on:{input:function(i){return t.parseEditableKeyword(i,"key",e)}}}),t._v(" :\n "),i("el-input-number",{staticClass:"value-input",attrs:{value:t.getValue(e),min:0,size:"large"},on:{change:function(i){return t.parseEditableKeyword(i,"value",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteEditableKeywordRow(e)}}})],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToEditableKeyword}})],2):i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"setting-input"},[i("el-input",{staticClass:"name-input",attrs:{value:t.getKey(e),placeholder:"key"},on:{input:function(i){return t.parseEditableKeyword(i,"key",e)}}}),t._v(" :\n "),i("el-select",{staticClass:"value-input",attrs:{value:t.getValue(e),multiple:"",filterable:"","allow-create":""},on:{change:function(i){return t.parseEditableKeyword(i,"value",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteEditableKeywordRow(e)}}})],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToEditableKeyword}})],2)])},[],!1,null,null,null));k.options.__file="EditableKeywordInput.vue";var S=k.exports,D={name:"CrontabInput",props:{data:{type:Object,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"100%":"380px"},workers:function(){return this.setting.suggestions.map(function(t){return t[1]})}},methods:{getSuggestion:function(t){return this.setting.suggestions.find(function(e){return e[1]===t})[0]},update:function(t,e){var i=this.$store.state.settings.settings[this.settingGroup.group][this.settingGroup.key][this.setting.key],s=c()({},i,g()({},e,t)),n=Object.keys(i).reduce(function(s,n){return n===e?c()({},s,g()({},n,["reversed_tuple",t])):c()({},s,g()({},n,["reversed_tuple",i[n]]))},{});this.$store.dispatch("UpdateSettings",{group:this.settingGroup.group,key:this.settingGroup.key,input:this.setting.key,value:n,type:this.setting.type}),this.$store.dispatch("UpdateState",{group:this.settingGroup.group,key:this.settingGroup.key,input:this.setting.key,value:s})}}},w=(i("mstB"),Object(m.a)(D,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("el-form",{staticClass:"crontab",attrs:{"label-width":t.labelWidth,"label-position":t.isMobile?"top":"right"}},t._l(t.workers,function(e){return i("el-form-item",{key:e,staticClass:"crontab-container",attrs:{label:e,"data-search":t.setting.key}},[i("el-input",{staticClass:"input setting-input",attrs:{value:t.data[e],placeholder:t.getSuggestion(e)||null},on:{input:function(i){return t.update(i,e)}}})],1)}),1)},[],!1,null,null,null));w.options.__file="CrontabInput.vue";var x=w.exports,C={name:"EditableKeywordInput",props:{data:{type:Array,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{addIconToIcons:function(){var t=[].concat(y()(this.data),[[{key:"",value:"",id:this.generateID()}]]);this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},addValueToIcons:function(t){var e=this,i=this.data.map(function(i,s){return s===t?[].concat(y()(i),[{key:"",value:"",id:e.generateID()}]):i});this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},deleteIcondRow:function(t){var e=this.data.filter(function(e,i){return i!==t});this.updateSetting(e,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},generateID:function(){return"f".concat((~~(1e8*Math.random())).toString(16))},parseIcons:function(t,e,i,s){var n=this.data.map(function(n,a){return a===i?n.map(function(i){return i.id===s?"key"===e?c()({},i,{key:t}):c()({},i,{value:t}):i}):n});this.updateSetting(n,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.map(function(t){return t.reduce(function(t,e){var i=e.key,s=e.value;return c()({},t,g()({},i,s))},{})},{});this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},P=(i("rdar"),Object(m.a)(C,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"mascot-container",attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e,s){return i("div",{key:s,staticClass:"mascot"},[i("div",{staticClass:"icons-container"},[i("div",{staticClass:"icon-container"},t._l(e,function(e){var n=e.key,a=e.value,r=e.id;return i("div",{key:r,staticClass:"icon-values-container"},[i("el-input",{staticClass:"icon-key-input",attrs:{value:n,placeholder:"key"},on:{input:function(e){return t.parseIcons(e,"key",s,r)}}}),t._v(" :\n "),i("el-input",{staticClass:"icon-value-input",attrs:{value:a,placeholder:"value"},on:{input:function(e){return t.parseIcons(e,"value",s,r)}}})],1)}),0),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(e){return t.deleteIcondRow(s)}}})],1),t._v(" "),i("div",{staticClass:"icons-button-container"},[i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:function(e){return t.addValueToIcons(s)}}}),t._v(" "),i("span",{staticClass:"icons-button-desc"},[t._v("Add another `key - value` pair to this icon")])],1),t._v(" "),i("el-divider",{staticClass:"divider"})],1)}),t._v(" "),i("div",{staticClass:"icons-button-container"},[i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addIconToIcons}}),t._v(" "),i("span",{staticClass:"icons-button-desc"},[t._v("Add another icon configuration")])],1)],2)},[],!1,null,null,null));P.options.__file="IconsInput.vue";var $=P.exports,O=i("QILm"),U=i.n(O),M=i("J4zp"),j=i.n(M),T={name:"MascotsInput",props:{data:{type:Array,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{addRowToMascots:function(){var t=[].concat(y()(this.data),[{"":{":url":"",":mime_type":"",id:this.generateID()}}]);this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},deleteMascotsRow:function(t){var e=this.getId(t),i=this.data.filter(function(t){return Object.values(t)[0].id!==e});this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},generateID:function(){return"f".concat((~~(1e8*Math.random())).toString(16))},getId:function(t){return Object.values(t)[0].id},getName:function(t){return Object.keys(t)[0]},getUrl:function(t){var e=Object.values(t);return j()(e,1)[0][":url"]},getMimeType:function(t){var e=Object.values(t);return j()(e,1)[0][":mime_type"]},parseMascots:function(t,e,i){var s=this,n=this.getId(i),a=this.data.map(function(i,a){return Object.values(i)[0].id===n?"name"===e?g()({},t,Object.values(s.data[a])[0]):"url"===e?g()({},Object.keys(i)[0],c()({},Object.values(s.data[a])[0],{":url":t})):g()({},Object.keys(i)[0],c()({},Object.values(s.data[a])[0],{":mime_type":t})):i});this.updateSetting(a,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.reduce(function(t,e){var i=Object.values(e)[0],s=(i.id,U()(i,["id"]));return c()({},t,g()({},Object.keys(e)[0],["",s]))},{});this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},A=(i("+2nY"),Object(m.a)(T,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"mascot-container",attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"mascot"},[i("el-form-item",{staticClass:"mascot-form-item",attrs:{label:"Name","label-width":"85px"}},[i("div",{staticClass:"mascot-name-container"},[i("el-input",{staticClass:"mascot-name-input",attrs:{value:t.getName(e),placeholder:"Name"},on:{input:function(i){return t.parseMascots(i,"name",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteMascotsRow(e)}}})],1)]),t._v(" "),i("el-form-item",{staticClass:"mascot-form-item",attrs:{label:"URL","label-width":"85px"}},[i("el-input",{staticClass:"mascot-input",attrs:{value:t.getUrl(e),placeholder:"URL"},on:{input:function(i){return t.parseMascots(i,"url",e)}}})],1),t._v(" "),i("el-form-item",{staticClass:"mascot-form-item",attrs:{label:"Mime type","label-width":"85px"}},[i("el-input",{staticClass:"mascot-input",attrs:{value:t.getMimeType(e),placeholder:"Mime type"},on:{input:function(i){return t.parseMascots(i,"mimeType",e)}}})],1)],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToMascots}})],2)},[],!1,null,null,null));A.options.__file="MascotsInput.vue";var G=A.exports,L={name:"MultipleSelect",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},methods:{updateSetting:function(t,e,i,s,n){this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},W=(i("QtHe"),Object(m.a)(L,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"multiple-select-container"},[":backends"===t.setting.key?i("el-select",{staticClass:"input",attrs:{value:t.data.value,"data-search":t.setting.key||t.setting.group,multiple:"",filterable:"","allow-create":""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},[i("el-option",{attrs:{value:":console",label:"console"}}),t._v(" "),i("el-option",{attrs:{value:":ex_syslogger",label:"ExSyslogger"}}),t._v(" "),i("el-option",{attrs:{value:"Quack.Logger",label:"Quack.Logger"}})],1):t._e(),t._v(" "),":args"===t.setting.key?i("el-select",{staticClass:"input",attrs:{value:t.data[t.setting.key],"data-search":t.setting.key||t.setting.group,multiple:"",filterable:"","allow-create":""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},[i("el-option",{attrs:{value:"strip",label:"strip"}}),t._v(" "),i("el-option",{attrs:{value:"auto-orient",label:"auto-orient"}}),t._v(" "),i("el-option",{attrs:{value:"implode",label:"implode"}})],1):t._e()],1)},[],!1,null,null,null));W.options.__file="MultipleSelect.vue";var E=W.exports,I=i("h74u"),R={name:"ProxyUrlInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}},parents:{type:Array,default:function(){return[]},required:!1}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},settings:function(){return this.$store.state.settings.settings},updatedSettings:function(){return this.$store.state.settings.updatedSettings},proxyUrlData:function(){return 0===Object.keys(this.data).length?{socks5:!1,host:null,port:null}:this.data}},methods:{updateProxyUrl:function(t,e){var i;i="socks5"===e?c()({},this.proxyUrlData,{socks5:t}):"host"===e?c()({},this.proxyUrlData,{host:t}):c()({},this.proxyUrlData,{port:t}),this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.socks5?[":socks5",t.host,t.port]:"".concat(t.host,":").concat(t.port);if(this.parents.length>0){var r=Object(I.e)(t,a,e,i,this.parents.reverse(),this.settings,this.updatedSettings),o=r.valueForState,u=r.valueForUpdatedSettings,l=r.setting;this.$store.dispatch("UpdateSettings",{group:e,key:i,input:l.key,value:u,type:l.type}),this.$store.dispatch("UpdateState",{group:e,key:i,input:l.key,value:o})}else this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},F=(i("mGnP"),Object(m.a)(R,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"proxy-url-input",attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-input",{staticClass:"proxy-url-host-input",attrs:{value:t.proxyUrlData.host,placeholder:"host (e.g. localhost or 127.0.0.1)"},on:{input:function(e){return t.updateProxyUrl(e,"host")}}}),t._v(" "),t.isDesktop?i("span",[t._v(":")]):t._e(),t._v(" "),i("el-input",{staticClass:"proxy-url-value-input",attrs:{value:t.proxyUrlData.port,placeholder:"port (e.g 9020 or 3090)"},on:{input:function(e){return t.updateProxyUrl(e,"port")}}}),t._v(" "),i("div",{staticClass:"socks5-checkbox-container"},[i("el-checkbox",{attrs:{value:t.proxyUrlData.socks5},on:{change:function(e){return t.updateProxyUrl(e,"socks5")}}}),t._v(" "),i("span",{staticClass:"socks5-checkbox"},[t._v("Socks5")])],1)],1)},[],!1,null,null,null));F.options.__file="ProxyUrlInput.vue";var K=F.exports,z={name:"PruneInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{prune:{get:function(){return this.data[0]},set:function(t){this.updateRadioInput(t)}}},methods:{updateIntInput:function(t,e){this.updateSetting([e,t],this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.includes(":disabled")?":disabled":t;this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})},updateRadioInput:function(t){var e=":disabled"===t?[t]:[t,0];this.updateSetting(e,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)}}},V=(i("Ezi3"),Object(m.a)(z,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-radio-group",{staticClass:"prune-options",model:{value:t.prune,callback:function(e){t.prune=e},expression:"prune"}},[i("el-radio",{attrs:{label:":disabled"}},[t._v("Disabled")]),t._v(" "),i("el-radio",{attrs:{label:":maxlen"}},[t._v("Limit-based")]),t._v(" "),i("el-radio",{attrs:{label:":maxage"}},[t._v("Time-based")])],1),t._v(" "),":maxlen"===t.prune?i("el-form-item",{attrs:{label:"max length","label-width":"100","label-position":"left"}},[i("el-input-number",{staticClass:"top-margin",attrs:{value:t.data[1],min:0,placeholder:"1500",size:"large"},on:{change:function(e){return t.updateIntInput(e,":maxlen")}}})],1):t._e(),t._v(" "),":maxage"===t.prune?i("el-form-item",{attrs:{label:"max age","label-width":"100","label-position":"left"}},[i("el-input-number",{staticClass:"top-margin",attrs:{value:t.data[1],min:0,placeholder:"3600",size:"large"},on:{change:function(e){return t.updateIntInput(e,":maxage")}}})],1):t._e()],1)},[],!1,null,null,null));V.options.__file="PruneInput.vue";var N=V.exports,q={name:"RateLimitInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},rateLimitAllUsers:function(){return this.data[this.setting.key]?this.data[this.setting.key]:["",""]},rateLimitAuthUsers:function(){return!(!this.data[this.setting.key]||!Array.isArray(this.data[this.setting.key][0]))&&this.data[this.setting.key][1]},rateLimitUnauthUsers:function(){return!(!this.data[this.setting.key]||!Array.isArray(this.data[this.setting.key][1]))&&this.data[this.setting.key][0]}},methods:{parseRateLimiter:function(t,e,i,s,n){var a;"oneLimit"===s?a="scale"===i?[t,n[1]]:[n[0],t]:"unauthUsersLimit"===s?a="scale"===i?[[t,n[0][1]],[n[1][0],n[1][1]]]:[[n[0][0],t],[n[1][0],n[1][1]]]:"authUserslimit"===s&&(a="scale"===i?[[n[0][0],n[0][1]],[t,n[1][1]]]:[[n[0][0],n[0][1]],[n[1][0],t]]),this.updateSetting(a,this.settingGroup.group,this.settingGroup.key,e,this.setting.type)},toggleLimits:function(t,e){this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,e)},updateSetting:function(t,e,i,s,n){var a=Array.isArray(t[0])?t.map(function(t){return{tuple:t}}):{tuple:t};this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},B=(i("irif"),Object(m.a)(q,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"rate-limit-container",attrs:{"data-search":t.setting.key||t.setting.group}},[t.rateLimitAuthUsers?t._e():i("div",[i("el-input",{staticClass:"scale-input",attrs:{value:t.rateLimitAllUsers[0],placeholder:"scale"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"scale","oneLimit",t.rateLimitAllUsers)}}}),t._v(" "),i("span",[t._v(":")]),t._v(" "),i("el-input",{staticClass:"limit-input",attrs:{value:t.rateLimitAllUsers[1],placeholder:"limit"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"limit","oneLimit",t.rateLimitAllUsers)}}}),t._v(" "),i("div",{staticClass:"limit-button-container"},[i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:function(e){return t.toggleLimits([["",""],["",""]],t.setting.key)}}}),t._v(" "),i("p",{staticClass:"expl limit-expl"},[t._v("Set different limits for unauthenticated and authenticated users")])],1)],1),t._v(" "),t.rateLimitAuthUsers?i("div",[i("el-form-item",{staticClass:"rate-limit"},[i("div",{staticClass:"rate-limit-label-container"},[i("span",{staticClass:"rate-limit-label"},[t._v("\n Unauthenticated users:\n ")])]),t._v(" "),i("div",{staticClass:"rate-limit-content"},[i("el-input",{staticClass:"scale-input",attrs:{value:t.rateLimitUnauthUsers[0],placeholder:"scale"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"scale","unauthUsersLimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}}),t._v(" "),i("span",[t._v(":")]),t._v(" "),i("el-input",{staticClass:"limit-input",attrs:{value:t.rateLimitUnauthUsers[1],placeholder:"limit"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"limit","unauthUsersLimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}})],1)]),t._v(" "),i("el-form-item",{staticClass:"rate-limit"},[i("div",{staticClass:"rate-limit-label-container"},[i("span",{staticClass:"rate-limit-label"},[t._v("\n Authenticated users:\n ")])]),t._v(" "),i("div",{staticClass:"rate-limit-content"},[i("el-input",{staticClass:"scale-input",attrs:{value:t.rateLimitAuthUsers[0],placeholder:"scale"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"scale","authUserslimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}}),t._v(" "),i("span",[t._v(":")]),t._v(" "),i("el-input",{staticClass:"limit-input",attrs:{value:t.rateLimitAuthUsers[1],placeholder:"limit"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"limit","authUserslimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}})],1)]),t._v(" "),i("div",{staticClass:"limit-button-container"},[i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(e){return t.toggleLimits(["",""],t.setting.key)}}}),t._v(" "),i("p",{staticClass:"expl limit-expl"},[t._v("Set limit for all users")])],1)],1):t._e()])},[],!1,null,null,null));B.options.__file="RateLimitInput.vue";var H=B.exports,Q={name:"RegInvitesInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},methods:{updateSetting:function(t,e,i,s,n){var a=this,r=this.$store.state.settings.settings[e][i][":registrations_open"],o=this.$store.state.settings.settings[e][i][":invites_enabled"];":registrations_open"===s&&t&&o?this.$confirm("Enabling this setting requires invites to be disabled. Are you sure you want to open registrations?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){a.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),a.$store.dispatch("UpdateSettings",{group:e,key:i,input:":invites_enabled",value:!1,type:n}),a.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t}),a.$store.dispatch("UpdateState",{group:e,key:i,input:":invites_enabled",value:!1})}):":invites_enabled"===s&&t&&r?this.$confirm("Enabling this setting requires registrations to be disabled. Are you sure you want to enable invitations?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){a.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),a.$store.dispatch("UpdateSettings",{group:e,key:i,input:":registrations_open",value:!1,type:n}),a.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t}),a.$store.dispatch("UpdateState",{group:e,key:i,input:":registrations_open",value:!1})}):(this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t}))}}},J=(i("9Hof"),Object(m.a)(Q,function(){var t=this,e=t.$createElement;return(t._self._c||e)("el-switch",{staticClass:"switch-input",attrs:{value:t.data[t.setting.key],"data-search":t.setting.key},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}})},[],!1,null,null,null));J.options.__file="RegInvitesInput.vue";var Y=J.exports,X={name:"SelectInputWithReducedLabels",props:{data:{type:[Array,Object],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{inputValue:function(){return"Pleroma.Web.Auth.Authenticator"===this.setting.key?this.data.value:":rewrite_policy"===this.setting.key&&"string"==typeof this.data[this.setting.key]?[this.data[this.setting.key]]:this.data[this.setting.key]},isMobile:function(){return"mobile"===this.$store.state.app.device}},methods:{options:function(t){var e=this,i={":rewrite_policy":"Pleroma.Web.ActivityPub.MRF.","Pleroma.Web.Auth.Authenticator":"Pleroma.Web.Auth.",":method":"Pleroma.Captcha.",":adapter":"Swoosh.Adapters.",":providers":"Pleroma.Web.Metadata.Providers.",":parsers":"Pleroma.Web.RichMedia.Parsers.",":ttl_setters":"Pleroma.Web.RichMedia.Parser.",":scrub_policy":"Pleroma.HTML.",":federation_publisher_modules":"Pleroma.Web.",":uploader":"Pleroma.Uploaders.",":filters":"Pleroma.Upload.Filter."};return t.map(function(t){return{value:t,label:t.split(i[e.setting.key])[1]?t.split(i[e.setting.key])[1]:t}})},renderMultipleSelect:function(t){return Array.isArray(t)&&":backends"!==this.setting.key&&":args"!==this.setting.key&&(t.includes("module")||t.includes("list")&&t.includes("string")||t.includes("list")&&t.includes("atom")||t.includes("regex")&&t.includes("string")||":args"===this.setting.key)},rewritePolicyOptions:function(t){return t.map(function(t){return{value:t,label:t.split("Pleroma.Web.ActivityPub.MRF.")[1]?t.split("Pleroma.Web.ActivityPub.MRF.")[1]:t}})},updateSetting:function(t,e,i,s,n){this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},Z=(i("3IoU"),Object(m.a)(X,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"input"},[t.renderMultipleSelect(t.setting.type)?i("el-select",{staticClass:"input",attrs:{value:t.inputValue,"data-search":t.setting.key,multiple:"",filterable:"","allow-create":""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},t._l(t.options(t.setting.suggestions),function(t,e){return i("el-option",{key:e,attrs:{value:t.value,label:t.label}})}),1):t._e(),t._v(" "),"module"===t.setting.type||t.setting.type.includes("atom")&&t.setting.type.includes("dropdown")?i("el-select",{staticClass:"input",attrs:{value:t.inputValue,"data-search":t.setting.key||t.setting.group,clearable:""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},t._l(t.options(t.setting.suggestions),function(t,e){return i("el-option",{key:e,attrs:{value:t.value,label:t.label}})}),1):t._e()],1)},[],!1,null,null,null));Z.options.__file="SelectInputWithReducedLabels.vue";var tt=Z.exports,et=i("LvDl"),it=i.n(et),st=i("4MG8"),nt=i.n(st),at={name:"Inputs",components:{AutoLinkerInput:f,CrontabInput:x,EditableKeywordInput:S,IconsInput:$,MascotsInput:G,MultipleSelect:E,ProxyUrlInput:K,PruneInput:N,RateLimitInput:H,RegInvitesInput:Y,SelectInputWithReducedLabels:tt},props:{customLabelWidth:{type:String,default:function(){return this.labelWidth},required:!1},data:{type:[Object,Array],default:function(){return{}}},labelClass:{type:String,default:function(){return"label"},required:!1},margin:{type:Number,default:function(){return 0},required:!1},nested:{type:Boolean,default:function(){return!1}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}},settingParent:{type:Array,default:function(){return[]},required:!1}},computed:{canBeDeleted:function(){var t=this.settingGroup,e=t.group,i=t.key;return it.a.get(this.$store.state.settings.db,[e,i])&&this.$store.state.settings.db[e][i].includes(this.setting.key)},iconsData:function(){return Array.isArray(this.data[":icons"])?this.data[":icons"]:[]},inputValue:function(){return[":esshd",":cors_plug",":quack",":http_signatures",":tesla",":swoosh"].includes(this.settingGroup.group)&&this.data[this.setting.key]?"atom"===this.setting.type&&":"===this.data[this.setting.key].value[0]?this.data[this.setting.key].value.substr(1):this.data[this.setting.key].value:":logger"===this.settingGroup.group&&":backends"===this.setting.key||"Pleroma.Web.Auth.Authenticator"===this.setting.key||":admin_token"===this.setting.key?this.data.value:":mime"===this.settingGroup.group&&":types"===this.settingParent[0].key?this.data.value?this.data.value[this.setting.key]:[]:"atom"===this.setting.type&&this.data[this.setting.key]&&":"===this.data[this.setting.key][0]?this.data[this.setting.key].substr(1):this.data[this.setting.key]},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},keywordData:function(){return Array.isArray(this.data)?this.data:[]},reducedSelects:function(){return[":filters",":uploader",":federation_publisher_modules",":scrub_policy",":ttl_setters",":parsers",":providers",":method",":rewrite_policy","Pleroma.Web.Auth.Authenticator"].includes(this.setting.key)||"Pleroma.Emails.Mailer"===this.settingGroup.key&&":adapter"===this.setting.key},settings:function(){return this.$store.state.settings.settings},updatedSettings:function(){return this.$store.state.settings.updatedSettings}},methods:{editableKeyword:function(t,e){return":replace"===t||"map"===e||Array.isArray(e)&&e.includes("keyword")&&e.includes("integer")||Array.isArray(e)&&e.includes("keyword")&&-1!==e.findIndex(function(t){return t.includes("list")&&t.includes("string")})},getFormattedDescription:function(t){return nt()(t)},processNestedData:function(t,e,i,s){var n=Object(I.e)(t,t,e,i,s.reverse(),this.settings,this.updatedSettings),a=n.valueForState,r=n.valueForUpdatedSettings,o=n.setting;this.$store.dispatch("UpdateSettings",{group:e,key:i,input:o.key,value:r,type:o.type}),this.$store.dispatch("UpdateState",{group:e,key:i,input:o.key,value:a})},removeSetting:function(){var t=r()(n.a.mark(function t(){var e;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return e=this.settingGroup.key?[{group:this.settingGroup.group,key:this.settingGroup.key,delete:!0,subkeys:[this.setting.key]}]:[{group:this.settingGroup.group,key:this.setting.key,delete:!0}],t.prev=1,t.next=4,this.$store.dispatch("RemoveSetting",e);case 4:t.next=9;break;case 6:return t.prev=6,t.t0=t.catch(1),t.abrupt("return");case 9:this.$message({type:"success",message:o.a.t("settings.successfullyRemoved")});case 10:case"end":return t.stop()}},t,this,[[1,6]])}));return function(){return t.apply(this,arguments)}}(),renderMultipleSelect:function(t){return Array.isArray(t)&&":backends"!==this.setting.key&&":args"!==this.setting.key&&(t.includes("module")||t.includes("list")&&t.includes("string")||t.includes("list")&&t.includes("atom")||t.includes("regex")&&t.includes("string")||":args"===this.setting.key)},update:function(t,e,i,s,n,a,r){r?this.processNestedData(t,e,i,s):this.updateSetting(t,e,i,n,a)},updateSetting:function(t,e,i,s,n){this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},rt=(i("y7KD"),Object(m.a)(at,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"input-container"},["keyword"===t.setting.type?i("div",{staticClass:"keyword-container"},[i("el-form-item",{class:t.labelClass,style:"margin-left:"+t.margin+"px;margin-bottom:0",attrs:{"label-width":t.customLabelWidth,"data-search":t.setting.key||t.setting.group}},[i("span",{attrs:{slot:"label"},slot:"label"},[t._v("\n "+t._s(t.setting.label)+"\n "),t.canBeDeleted&&t.isDesktop?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"delete-setting-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:t.removeSetting}})],1):t._e()],1)]),t._v(" "),t._l(t.setting.children,function(e){return i("el-form-item",{key:e.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,"setting-parent":t.settingParent.concat([e]),setting:e,data:t.data[t.setting.key],"custom-label-width":t.isMobile?"100px":"120px","label-class":"keyword"===e.type?"center-label":"",margin:t.isDesktop?t.margin+15:t.margin+8,nested:!0}})],1)})],2):t._e(),t._v(" "),"keyword"!==t.setting.type?i("el-form-item",{class:t.labelClass,style:t.isDesktop?"":"margin-left:"+t.margin+"px",attrs:{"label-width":t.customLabelWidth}},[i("span",{attrs:{slot:"label"},slot:"label"},[t._v("\n "+t._s(t.setting.label)+"\n "),t.canBeDeleted&&(t.isDesktop||t.isMobile)?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"delete-setting-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:t.removeSetting}})],1):t._e()],1),t._v(" "),i("div",{staticClass:"input-row"},["string"===t.setting.type||t.setting.type.includes("string")&&t.setting.type.includes("atom")?i("el-input",{staticClass:"input",attrs:{value:t.inputValue,placeholder:t.setting.suggestions?t.setting.suggestions[0]:null,"data-search":t.setting.key||t.setting.group},on:{input:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}):t._e(),t._v(" "),"boolean"!==t.setting.type||[":registrations_open",":invites_enabled"].includes(t.setting.key)?t._e():i("el-switch",{staticClass:"switch-input",attrs:{value:t.inputValue,"data-search":t.setting.key||t.setting.group},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}),t._v(" "),"integer"===t.setting.type?i("el-input-number",{attrs:{value:null===t.inputValue?void 0:t.inputValue,placeholder:t.setting.suggestions?t.setting.suggestions[0].toString():null,min:0,size:t.isDesktop?"large":"medium","data-search":t.setting.key||t.setting.group},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}):t._e(),t._v(" "),!t.reducedSelects&&("module"===t.setting.type||t.setting.type.includes("atom")&&t.setting.type.includes("dropdown"))?i("el-select",{staticClass:"input",attrs:{value:!1===t.inputValue?"false":t.inputValue,"data-search":t.setting.key||t.setting.group,clearable:""},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}},t._l(t.setting.suggestions,function(t,e){return i("el-option",{key:e,attrs:{value:t}})}),1):t._e(),t._v(" "),!t.reducedSelects&&t.renderMultipleSelect(t.setting.type)?i("el-select",{staticClass:"input",attrs:{value:t.inputValue,"data-search":t.setting.key||t.setting.group,multiple:"",filterable:"","allow-create":""},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}},t._l(t.setting.suggestions,function(t,e){return i("el-option",{key:e,attrs:{value:t}})}),1):t._e(),t._v(" "),":ip"===t.setting.key?i("el-input",{staticClass:"input",attrs:{value:t.inputValue,"data-search":t.setting.key||t.setting.group,placeholder:"xxx.xxx.xxx.xx"},on:{input:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}):t._e(),t._v(" "),"atom"===t.setting.type?i("el-input",{staticClass:"input",attrs:{value:t.inputValue,placeholder:t.setting.suggestions[0]?t.setting.suggestions[0].substr(1):"","data-search":t.setting.key||t.setting.group},on:{input:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}},[i("template",{slot:"prepend"},[t._v(":")])],2):t._e(),t._v(" "),":auto_linker"===t.settingGroup.group?i("auto-linker-input",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":crontab"===t.setting.key?i("crontab-input",{attrs:{data:t.data[t.setting.key],"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),t.editableKeyword(t.setting.key,t.setting.type)?i("editable-keyword-input",{attrs:{data:t.keywordData,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":icons"===t.setting.key?i("icons-input",{attrs:{data:t.iconsData,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":mascots"===t.setting.key?i("mascots-input",{attrs:{data:t.keywordData,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":backends"===t.setting.key||":args"===t.setting.key?i("multiple-select",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":proxy_url"===t.setting.key?i("proxy-url-input",{attrs:{data:t.data[t.setting.key],"setting-group":t.settingGroup,setting:t.setting,parents:t.settingParent}}):t._e(),t._v(" "),":prune"===t.setting.key?i("prune-input",{attrs:{data:t.data[t.setting.key],"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":rate_limit"===t.settingGroup.key?i("rate-limit-input",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),[":registrations_open",":invites_enabled"].includes(t.setting.key)?i("reg-invites-input",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),t.reducedSelects?i("select-input-with-reduced-labels",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),t.canBeDeleted&&t.isTablet?i("el-tooltip",{staticClass:"delete-setting-button-container",attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"delete-setting-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:t.removeSetting}})],1):t._e()],1),t._v(" "),t.setting.description&&"keyword"!==t.setting.type?i("div",{staticClass:"expl",domProps:{innerHTML:t._s(t.getFormattedDescription(t.setting.description))}}):t._e()]):t._e()],1)},[],!1,null,null,null));rt.options.__file="Inputs.vue";var ot={name:"Setting",components:{Inputs:rt.exports},props:{settingGroup:{type:Object,default:function(){return{}}},data:{type:Object,default:function(){return{}}}},computed:{emailAdapterChildren:function(){var t=this.$store.state.settings.settings[":pleroma"]["Pleroma.Emails.Mailer"][":adapter"];return this.settingGroup.children.filter(function(e){return e.group&&e.group.includes(t)})},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},loading:function(){return this.$store.state.settings.loading}},methods:{canBeDeleted:function(t){var e=this.settingGroup,i=e.group,s=e.key||t;return it.a.get(this.$store.state.settings.db,[i,s])&&this.$store.state.settings.db[i][s].includes(t)},compound:function(t){var e=t.type,i=t.key;t.children;return"keyword"===e||"map"===e||e.includes("keyword")||":replace"===i},divideSetting:function(t){return[":sslopts",":tlsopts",":adapter",":poll_limits",":queues",":styling",":proxy_opts"].includes(t)},getFormattedDescription:function(t){return nt()(t)},removeSetting:function(){var t=r()(n.a.mark(function t(e){var i;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return i=this.settingGroup.key?[{group:this.settingGroup.group,key:this.settingGroup.key,delete:!0,subkeys:[e]}]:[{group:this.settingGroup.group,key:e,delete:!0}],t.prev=1,t.next=4,this.$store.dispatch("RemoveSetting",i);case 4:t.next=9;break;case 6:return t.prev=6,t.t0=t.catch(1),t.abrupt("return");case 9:this.$message({type:"success",message:o.a.t("settings.successfullyRemoved")});case 10:case"end":return t.stop()}},t,this,[[1,6]])}));return function(e){return t.apply(this,arguments)}}(),updateSetting:function(t,e,i){this.$store.dispatch("UpdateSettings",{tab:e,data:g()({},i,t)})}}},ut=(i("pnah"),Object(m.a)(ot,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",[t.settingGroup.description?i("el-form-item",{staticClass:"description-container",attrs:{"data-search":t.settingGroup.key||t.settingGroup.group}},[i("span",{staticClass:"description",domProps:{innerHTML:t._s(t.getFormattedDescription(t.settingGroup.description))}})]):t._e(),t._v(" "),"Pleroma.Emails.Mailer"===t.settingGroup.key?i("div",[t._l(t.settingGroup.children.filter(function(t){return!t.group}),function(e){return i("div",{key:e.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data}})],1)}),t._v(" "),t._l(t.emailAdapterChildren,function(e){return i("div",{key:e.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data}})],1)})],2):i("div",t._l(t.settingGroup.children,function(e){return i("div",{key:e.key},[t.compound(e)?t._e():i("div",[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data,nested:!1}})],1),t._v(" "),t.compound(e)?i("div",[t.divideSetting(e.key)?i("el-divider",{staticClass:"divider"}):t._e(),t._v(" "),e.children?i("div",[i("div",{staticClass:"input-container"},[i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":e.key||e.group}},[i("span",{attrs:{slot:"label"},slot:"label"},[t.isDesktop&&t.canBeDeleted(e.key)?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticStyle:{"margin-left":"5px"},attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:function(i){return t.removeSetting(e.key)}}})],1):t._e()],1),t._v(" "),i("span",{staticClass:"label-font"},[t._v(t._s(e.label))]),t._v(" "),t.canBeDeleted(e.key)&&(t.isMobile||t.isTablet)?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"settings-delete-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:function(i){return t.removeSetting(e.key)}}})],1):t._e()],1)],1),t._v(" "),t._l(e.children,function(s){return i("div",{key:s.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,"setting-parent":[e,s],setting:s,data:t.data[e.key],nested:!0}})],1)})],2):i("div",[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data[e.key],nested:!0}})],1),t._v(" "),i("el-divider",{staticClass:"divider"})],1):t._e()])}),0)],1)},[],!1,null,null,null));ut.options.__file="Setting.vue";var lt=ut.exports,ct={name:"ActivityPub",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{activitypub:function(){return this.settings.description.find(function(t){return":activitypub"===t.key})},activitypubData:function(){return it.a.get(this.settings.settings,[":pleroma",":activitypub"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.$store.state.settings.loading},user:function(){return this.settings.description.find(function(t){return":user"===t.key})},userData:function(){return it.a.get(this.settings.settings,[":pleroma",":user"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},pt=(i("qEST"),Object(m.a)(ct,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"activitypubData",attrs:{model:t.activitypubData,"label-position":t.labelPosition,"label-width":t.labelWidth,"data-search":":activitypub"}},[i("setting",{attrs:{"setting-group":t.activitypub,data:t.activitypubData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"userData",attrs:{model:t.userData,"label-position":t.labelPosition,"label-width":t.labelWidth,"data-search":":user"}},[i("setting",{attrs:{"setting-group":t.user,data:t.userData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));pt.options.__file="ActivityPub.vue";var dt=pt.exports,gt={name:"Authentication",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{auth:function(){return this.settings.description.find(function(t){return":auth"===t.key})},authData:function(){return it.a.get(this.settings.settings,[":pleroma",":auth"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},ldap:function(){return this.settings.description.find(function(t){return":ldap"===t.key})},ldapData:function(){return it.a.get(this.settings.settings,[":pleroma",":ldap"])||{}},loading:function(){return this.settings.loading},oauth2:function(){return this.settings.description.find(function(t){return":oauth2"===t.key})},oauth2Data:function(){return it.a.get(this.settings.settings,[":pleroma",":oauth2"])||{}},pleromaAuthenticator:function(){return this.settings.description.find(function(t){return t.children&&"Pleroma.Web.Auth.Authenticator"===t.children[0].key})},pleromaAuthenticatorData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Web.Auth.Authenticator"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},ht=(i("4b9x"),Object(m.a)(gt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"pleromaAuthenticatorData",attrs:{model:t.pleromaAuthenticatorData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.pleromaAuthenticator,data:t.pleromaAuthenticatorData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"authData",attrs:{model:t.authData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.auth,data:t.authData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"ldapData",attrs:{model:t.ldapData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.ldap,data:t.ldapData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"oauth2",attrs:{model:t.oauth2Data,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.oauth2,data:t.oauth2Data}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));ht.options.__file="Authentication.vue";var mt=ht.exports,bt={name:"AutoLinker",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{autoLinker:function(){return this.settings.description.find(function(t){return":opts"===t.key})},autoLinkerData:function(){return it.a.get(this.settings.settings,[":auto_linker",":opts"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},ft=(i("cyzs"),Object(m.a)(bt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"autoLinker",attrs:{model:t.autoLinkerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.autoLinker,data:t.autoLinkerData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));ft.options.__file="AutoLinker.vue";var vt=ft.exports,yt={name:"Captcha",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{captcha:function(){return this.settings.description.find(function(t){return"Pleroma.Captcha"===t.key})},captchaData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Captcha"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},kocaptcha:function(){return this.settings.description.find(function(t){return"Pleroma.Captcha.Kocaptcha"===t.key})},kocaptchaData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Captcha.Kocaptcha"])||{}},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},_t=(i("2q6O"),Object(m.a)(yt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"captchaData",attrs:{model:t.captchaData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.captcha,data:t.captchaData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"kocaptchaData",attrs:{model:t.kocaptchaData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.kocaptcha,data:t.kocaptchaData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));_t.options.__file="Captcha.vue";var kt=_t.exports,St={name:"Esshd",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{esshd:function(){return this.settings.description.find(function(t){return":esshd"===t.group})},esshdData:function(){return it.a.get(this.settings.settings,[":esshd"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{toggleEsshd:function(t){this.$store.dispatch("ToggleEsshd",t)},updateSetting:function(t,e,i){this.$store.dispatch("UpdateSettings",{tab:e,data:g()({},i,t)})},onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Dt=(i("FCne"),Object(m.a)(St,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"esshdData",attrs:{model:t.esshdData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.esshd,data:t.esshdData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Dt.options.__file="Esshd.vue";var wt=Dt.exports,xt={name:"Frontend",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{assets:function(){return this.settings.description.find(function(t){return":assets"===t.key})},assetsData:function(){return it.a.get(this.settings.settings,[":pleroma",":assets"])||{}},chat:function(){return this.settings.description.find(function(t){return":chat"===t.key})},chatData:function(){return it.a.get(this.settings.settings,[":pleroma",":chat"])||{}},emoji:function(){return this.settings.description.find(function(t){return":emoji"===t.key})},emojiData:function(){return it.a.get(this.settings.settings,[":pleroma",":emoji"])||{}},frontend:function(){return this.settings.description.find(function(t){return":frontend_configurations"===t.key})},frontendData:function(){return it.a.get(this.settings.settings,[":pleroma",":frontend_configurations"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},markup:function(){return this.settings.description.find(function(t){return":markup"===t.key})},markupData:function(){return it.a.get(this.settings.settings,[":pleroma",":markup"])||{}},staticFe:function(){return this.settings.description.find(function(t){return":static_fe"===t.key})},staticFeData:function(){return it.a.get(this.settings.settings,[":pleroma",":static_fe"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Ct=(i("hVXW"),Object(m.a)(xt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"frontendData",attrs:{model:t.frontendData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.frontend,data:t.frontendData}})],1),t._v(" "),i("el-form",{ref:"staticFeData",attrs:{model:t.staticFeData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.staticFe,data:t.staticFeData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"assetsData",attrs:{model:t.assetsData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("el-form-item",{staticClass:"grouped-settings-header"},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.assets")))])]),t._v(" "),i("setting",{attrs:{"setting-group":t.assets,data:t.assetsData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"emojiData",attrs:{model:t.emojiData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":":emoji"}},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.emoji")))])]),t._v(" "),i("setting",{attrs:{"setting-group":t.emoji,data:t.emojiData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"chatData",attrs:{model:t.chatData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.chat,data:t.chatData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"markupData",attrs:{model:t.markupData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":":markup"}},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.markup")))])]),t._v(" "),i("setting",{attrs:{"setting-group":t.markup,data:t.markupData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Ct.options.__file="Frontend.vue";var Pt=Ct.exports,$t={name:"Gopher",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{gopher:function(){return this.settings.description.find(function(t){return":gopher"===t.key})},gopherData:function(){return it.a.get(this.settings.settings,[":pleroma",":gopher"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Ot=(i("w5cJ"),Object(m.a)($t,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"gopher",attrs:{model:t.gopherData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.gopher,data:t.gopherData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Ot.options.__file="Gopher.vue";var Ut=Ot.exports,Mt={name:"HTTP",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{corsPlug:function(){return this.settings.description.find(function(t){return":cors_plug"===t.group})},corsPlugData:function(){return it.a.get(this.settings.settings,[":cors_plug"])||{}},http:function(){return this.settings.description.find(function(t){return":http"===t.key})},httpData:function(){return it.a.get(this.settings.settings,[":pleroma",":http"])||{}},httpSecurity:function(){return this.settings.description.find(function(t){return":http_security"===t.key})},httpSecurityData:function(){return it.a.get(this.settings.settings,[":pleroma",":http_security"])||{}},httpSignatures:function(){return this.settings.description.find(function(t){return":http_signatures"===t.group})},httpSignaturesData:function(){return it.a.get(this.settings.settings,[":http_signatures"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},webCacheTtl:function(){return this.settings.description.find(function(t){return":web_cache_ttl"===t.key})},webCacheTtlData:function(){return it.a.get(this.settings.settings,[":pleroma",":web_cache_ttl"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},jt=(i("KFE3"),Object(m.a)(Mt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"httpData",attrs:{model:t.httpData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.http,data:t.httpData}})],1),t._v(" "),i("el-form",{ref:"corsPlugData",attrs:{model:t.corsPlugData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":":cors_plug"}},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.corsPlug")))])]),t._v(" "),i("setting",{attrs:{"setting-group":t.corsPlug,data:t.corsPlugData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"httpSignatures",attrs:{model:t.httpSignaturesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.httpSignatures,data:t.httpSignaturesData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"httpSecurityData",attrs:{model:t.httpSecurityData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.httpSecurity,data:t.httpSecurityData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"webCacheTtl",attrs:{model:t.webCacheTtlData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.webCacheTtl,data:t.webCacheTtlData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));jt.options.__file="Http.vue";var Tt=jt.exports,At={name:"Instance",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{adminToken:function(){return this.settings.description.find(function(t){return t.children&&":admin_token"===t.children[0].key})},adminTokenData:function(){return it.a.get(this.settings.settings,[":pleroma",":admin_token"])||{}},feed:function(){return this.settings.description.find(function(t){return":feed"===t.key})},feedData:function(){return it.a.get(this.settings.settings,[":pleroma",":feed"])||{}},instance:function(){return this.settings.description.find(function(t){return":instance"===t.key})},instanceData:function(){return it.a.get(this.settings.settings,[":pleroma",":instance"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},manifest:function(){return this.settings.description.find(function(t){return":manifest"===t.key})},manifestData:function(){return it.a.get(this.settings.settings,[":pleroma",":manifest"])||{}},pleromaUser:function(){return this.settings.description.find(function(t){return"Pleroma.User"===t.key})},pleromaUserData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.User"])||{}},scheduledActivity:function(){return this.$store.state.settings.description.find(function(t){return"Pleroma.ScheduledActivity"===t.key})},scheduledActivityData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.ScheduledActivity"])||{}},streamer:function(){return this.$store.state.settings.description.find(function(t){return":streamer"===t.key})},streamerData:function(){return it.a.get(this.settings.settings,[":pleroma",":streamer"])||{}},uriSchemes:function(){return this.settings.description.find(function(t){return":uri_schemes"===t.key})},uriSchemesData:function(){return it.a.get(this.settings.settings,[":pleroma",":uri_schemes"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Gt=(i("e0P1"),Object(m.a)(At,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"instanceData",attrs:{model:t.instanceData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.instance,data:t.instanceData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"adminToken",attrs:{model:t.adminTokenData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.adminToken,data:t.adminTokenData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"scheduledActivity",attrs:{model:t.scheduledActivityData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.scheduledActivity,data:t.scheduledActivityData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"manifest",attrs:{model:t.manifestData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.manifest,data:t.manifestData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"pleromaUser",attrs:{model:t.pleromaUserData,"label-position":t.labelPosition,"label-width":t.labelWidth,"data-search":"Pleroma.User"}},[i("setting",{attrs:{"setting-group":t.pleromaUser,data:t.pleromaUserData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"uriSchemes",attrs:{model:t.uriSchemesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uriSchemes,data:t.uriSchemesData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"feed",attrs:{model:t.feedData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.feed,data:t.feedData}})],1),t._v(" "),i("el-form",{ref:"streamer",attrs:{model:t.streamerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.streamer,data:t.streamerData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Gt.options.__file="Instance.vue";var Lt=Gt.exports,Wt={name:"JobQueue",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{activityExpiration:function(){return this.settings.description.find(function(t){return"Pleroma.ActivityExpiration"===t.key})},activityExpirationData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.ActivityExpiration"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},obanQueues:function(){return this.settings.description.find(function(t){return"Oban"===t.key})},obanQueuesData:function(){return it.a.get(this.settings.settings,[":pleroma","Oban"])||{}},workers:function(){return this.settings.description.find(function(t){return":workers"===t.key})},workersData:function(){return it.a.get(this.settings.settings,[":pleroma",":workers"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Et=(i("lNpP"),Object(m.a)(Wt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"obanQueuesData",attrs:{model:t.obanQueuesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.obanQueues,data:t.obanQueuesData}})],1),t._v(" "),i("el-form",{ref:"workersData",attrs:{model:t.workersData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.workers,data:t.workersData}})],1),t._v(" "),i("el-form",{ref:"activityExpiration",attrs:{model:t.activityExpirationData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.activityExpiration,data:t.activityExpirationData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Et.options.__file="JobQueue.vue";var It=Et.exports,Rt={name:"Logger",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{console:function(){return this.settings.description.find(function(t){return":console"===t.key})},consoleData:function(){return it.a.get(this.settings.settings,[":logger",":console"])||{}},exsyslogger:function(){return this.settings.description.find(function(t){return":ex_syslogger"===t.key})},exsysloggerData:function(){return it.a.get(this.settings.settings,[":logger",":ex_syslogger"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},logger:function(){return this.settings.description.find(function(t){return":logger"===t.group})},loggerData:function(){return it.a.get(this.settings.settings,[":logger",":backends"])||{}},quack:function(){return this.settings.description.find(function(t){return":quack"===t.group})},quackData:function(){return it.a.get(this.settings.settings,[":quack"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Ft=(i("mADP"),Object(m.a)(Rt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"loggerData",attrs:{model:t.loggerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.logger,data:t.loggerData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"consoleData",attrs:{model:t.consoleData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.console,data:t.consoleData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"exsysloggerData",attrs:{model:t.exsysloggerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.exsyslogger,data:t.exsysloggerData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"quackData",attrs:{model:t.quackData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.quack,data:t.quackData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Ft.options.__file="Logger.vue";var Kt=Ft.exports,zt={name:"Mailer",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{emailNotifications:function(){return this.settings.description.find(function(t){return":email_notifications"===t.key})},emailNotificationsData:function(){return it.a.get(this.settings.settings,[":pleroma",":email_notifications"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.$store.state.settings.loading},mailer:function(){return this.settings.description.find(function(t){return"Pleroma.Emails.Mailer"===t.key})},mailerData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Emails.Mailer"])||{}},newUsersDigestEmail:function(){return this.settings.description.find(function(t){return"Pleroma.Emails.NewUsersDigestEmail"===t.key})},newUsersDigestEmailData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Emails.NewUsersDigestEmail"])||{}},swoosh:function(){return this.settings.description.find(function(t){return":swoosh"===t.group})},swooshData:function(){return it.a.get(this.settings.settings,[":swoosh"])||{}},userEmail:function(){return this.settings.description.find(function(t){return"Pleroma.Emails.UserEmail"===t.key})},userEmailData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Emails.UserEmail"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Vt=(i("PygS"),Object(m.a)(zt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"mailer",attrs:{model:t.mailerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mailer,data:t.mailerData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"swoosh",attrs:{model:t.swooshData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.swoosh,data:t.swooshData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"emailNotifications",attrs:{model:t.emailNotificationsData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.emailNotifications,data:t.emailNotificationsData}})],1),t._v(" "),i("el-form",{ref:"userEmail",attrs:{model:t.userEmailData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.userEmail,data:t.userEmailData}})],1),t._v(" "),i("el-form",{ref:"newUsersDigestEmail",attrs:{model:t.newUsersDigestEmailData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.newUsersDigestEmail,data:t.newUsersDigestEmailData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Vt.options.__file="Mailer.vue";var Nt=Vt.exports,qt={name:"MediaProxy",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},mediaProxy:function(){return this.settings.description.find(function(t){return":media_proxy"===t.key})},mediaProxyData:function(){return it.a.get(this.settings.settings,[":pleroma",":media_proxy"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Bt=(i("UdS4"),Object(m.a)(qt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"mediaProxy",attrs:{model:t.mediaProxyData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mediaProxy,data:t.mediaProxyData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Bt.options.__file="MediaProxy.vue";var Ht=Bt.exports,Qt={name:"Metadata",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},metadata:function(){return this.settings.description.find(function(t){return"Pleroma.Web.Metadata"===t.key})},metadataData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Web.Metadata"])||{}},richMedia:function(){return this.settings.description.find(function(t){return":rich_media"===t.key})},richMediaData:function(){return it.a.get(this.settings.settings,[":pleroma",":rich_media"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Jt=(i("apN7"),Object(m.a)(Qt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"metadata",attrs:{model:t.metadataData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.metadata,data:t.metadataData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"richMedia",attrs:{model:t.richMediaData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.richMedia,data:t.richMediaData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Jt.options.__file="Metadata.vue";var Yt=Jt.exports,Xt={name:"MRF",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},modules:function(){return this.settings.description.find(function(t){return":modules"===t.key})},modulesData:function(){return it.a.get(this.settings.settings,[":pleroma",":modules"])||{}},mrfSimple:function(){return this.settings.description.find(function(t){return":mrf_simple"===t.key})},mrfSimpleData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_simple"])||{}},mrfRejectnonpublic:function(){return this.settings.description.find(function(t){return":mrf_rejectnonpublic"===t.key})},mrfRejectnonpublicData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_rejectnonpublic"])||{}},mrfHellthread:function(){return this.settings.description.find(function(t){return":mrf_hellthread"===t.key})},mrfHellthreadData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_hellthread"])||{}},mrfKeyword:function(){return this.settings.description.find(function(t){return":mrf_keyword"===t.key})},mrfKeywordData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_keyword"])||{}},mrfObjectAge:function(){return this.settings.description.find(function(t){return":mrf_object_age"===t.key})},mrfObjectAgeData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_object_age"])||{}},mrfSubchain:function(){return this.settings.description.find(function(t){return":mrf_subchain"===t.key})},mrfSubchainData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_subchain"])||{}},mrfMention:function(){return this.settings.description.find(function(t){return":mrf_mention"===t.key})},mrfMentionData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_mention"])||{}},mrfNormalizeMarkup:function(){return this.settings.description.find(function(t){return":mrf_normalize_markup"===t.key})},mrfNormalizeMarkupData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_normalize_markup"])||{}},mrfVocabulary:function(){return this.settings.description.find(function(t){return":mrf_vocabulary"===t.key})},mrfVocabularyData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_vocabulary"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Zt=(i("h9z7"),Object(m.a)(Xt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"mrfSimple",attrs:{model:t.mrfSimpleData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfSimple,data:t.mrfSimpleData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"mrfRejectnonpublic",attrs:{model:t.mrfRejectnonpublicData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfRejectnonpublic,data:t.mrfRejectnonpublicData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"mrfHellthread",attrs:{model:t.mrfHellthreadData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfHellthread,data:t.mrfHellthreadData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"mrfKeyword",attrs:{model:t.mrfKeywordData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfKeyword,data:t.mrfKeywordData}})],1),t._v(" "),i("el-form",{ref:"mrfSubchain",attrs:{model:t.mrfSubchainData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfSubchain,data:t.mrfSubchainData}})],1),t._v(" "),i("el-form",{ref:"mrfMention",attrs:{model:t.mrfMentionData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfMention,data:t.mrfMentionData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"mrfNormalizeMarkup",attrs:{model:t.mrfNormalizeMarkupData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfNormalizeMarkup,data:t.mrfNormalizeMarkupData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"mrfVocabulary",attrs:{model:t.mrfVocabularyData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfVocabulary,data:t.mrfVocabularyData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"mrfObjectAge",attrs:{model:t.mrfObjectAgeData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfObjectAge,data:t.mrfObjectAgeData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"modules",attrs:{model:t.modulesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.modules,data:t.modulesData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Zt.options.__file="MRF.vue";var te=Zt.exports,ee={name:"Other",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},mimeTypes:function(){return this.settings.description.find(function(t){return":mime"===t.group})},mimeTypesData:function(){return it.a.get(this.settings.settings,[":mime"])||{}},remoteIp:function(){return this.settings.description.find(function(t){return"Pleroma.Plugs.RemoteIp"===t.key})},remoteIpData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Plugs.RemoteIp"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},ie=(i("gFOO"),Object(m.a)(ee,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"mimeTypes",attrs:{model:t.mimeTypesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mimeTypes,data:t.mimeTypesData}})],1),t._v(" "),i("el-form",{ref:"remoteIp",attrs:{model:t.remoteIpData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.remoteIp,data:t.remoteIpData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));ie.options.__file="Other.vue";var se=ie.exports,ne={name:"RateLimiters",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{rateLimiters:function(){return this.settings.description.find(function(t){return":rate_limit"===t.key})},rateLimitersData:function(){return it.a.get(this.settings.settings,[":pleroma",":rate_limit"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.$store.state.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},ae=(i("WvM+"),Object(m.a)(ne,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"rateLimiters",attrs:{model:t.rateLimitersData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.rateLimiters,data:t.rateLimitersData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));ae.options.__file="RateLimiters.vue";var re=ae.exports,oe={name:"Relays",data:function(){return{newRelay:""}},computed:{relays:function(){return this.$store.state.relays.fetchedRelays},relaysTable:function(){return this.relays.map(function(t){return{instance:t}})},loading:function(){return this.$store.state.relays.loading}},mounted:function(){this.$store.dispatch("FetchRelays")},methods:{followRelay:function(){this.$store.dispatch("AddRelay",this.newRelay)},deleteRelay:function(t){this.$store.dispatch("DeleteRelay",t)}}},ue=(i("J7+w"),Object(m.a)(oe,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"relays-container"},[i("div",{staticClass:"follow-relay-container"},[i("el-input",{staticClass:"follow-relay",attrs:{placeholder:t.$t("settings.followRelay")},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.followRelay(e)}},model:{value:t.newRelay,callback:function(e){t.newRelay=e},expression:"newRelay"}}),t._v(" "),i("el-button",{attrs:{type:"primary"},nativeOn:{click:function(e){return t.followRelay(e)}}},[t._v(t._s(t.$t("settings.follow")))])],1),t._v(" "),i("el-table",{attrs:{data:t.relaysTable}},[i("el-table-column",{attrs:{label:t.$t("settings.instanceUrl"),prop:"instance"}}),t._v(" "),i("el-table-column",{attrs:{fixed:"right",width:"120"},scopedSlots:t._u([{key:"default",fn:function(e){return[i("el-button",{attrs:{type:"text",size:"small"},nativeOn:{click:function(i){return t.deleteRelay(e.row.instance)}}},[t._v("\n "+t._s(t.$t("table.delete"))+"\n ")])]}}],null,!1,2132974932)})],1)],1)},[],!1,null,null,null));ue.options.__file="Relays.vue";var le=ue.exports,ce={name:"Upload",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},showUploadersS3:function(){return"Pleroma.Uploaders.S3"===it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload",":uploader"])},showUploadersLocal:function(){return"Pleroma.Uploaders.Local"===it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload",":uploader"])},upload:function(){return this.settings.description.find(function(t){return"Pleroma.Upload"===t.key})},uploadData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload"])||{}},uploadersLocal:function(){return this.settings.description.find(function(t){return"Pleroma.Uploaders.Local"===t.key})},uploadersLocalData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Uploaders.Local"])||{}},uploadersS3:function(){return this.settings.description.find(function(t){return"Pleroma.Uploaders.S3"===t.key})},uploadersS3Data:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Uploaders.S3"])||{}},uploadFilterMogrify:function(){return this.settings.description.find(function(t){return"Pleroma.Upload.Filter.Mogrify"===t.key})},uploadFilterMogrifyData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload.Filter.Mogrify"])||{}},uploadAnonymizeFilename:function(){return this.settings.description.find(function(t){return"Pleroma.Upload.Filter.AnonymizeFilename"===t.key})},uploadAnonymizeFilenameData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload.Filter.AnonymizeFilename"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},pe=(i("DPt0"),Object(m.a)(ce,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"uploadData",attrs:{model:t.uploadData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.upload,data:t.uploadData}})],1),t._v(" "),t.showUploadersLocal?i("el-form",{ref:"uploadersLocal",attrs:{model:t.uploadersLocalData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("el-form-item",{staticClass:"grouped-settings-header"},[i("span",{staticClass:"label-font label-with-margin"},[t._v("Pleroma.Uploaders.Local")])]),t._v(" "),i("setting",{attrs:{"setting-group":t.uploadersLocal,data:t.uploadersLocalData}}),t._v(" "),i("el-divider",{staticClass:"divider thick-line"})],1):t._e(),t._v(" "),t.showUploadersS3?i("el-form",{ref:"uploadersS3",attrs:{model:t.uploadersS3Data,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uploadersS3,data:t.uploadersS3Data}}),t._v(" "),i("el-divider",{staticClass:"divider thick-line"})],1):t._e(),t._v(" "),i("el-form",{ref:"uploadFilterMogrify",attrs:{model:t.uploadFilterMogrifyData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uploadFilterMogrify,data:t.uploadFilterMogrifyData}})],1),t._v(" "),i("el-divider",{staticClass:"divider thick-line"}),t._v(" "),i("el-form",{ref:"uploadAnonymizeFilename",attrs:{model:t.uploadAnonymizeFilenameData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uploadAnonymizeFilename,data:t.uploadAnonymizeFilenameData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));pe.options.__file="Upload.vue";var de=pe.exports,ge={name:"WebPush",components:{Setting:lt},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},vapidDetails:function(){return this.settings.description.find(function(t){return":vapid_details"===t.key})},vapidDetailsData:function(){return it.a.get(this.settings.settings,[":web_push_encryption",":vapid_details"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},he=(i("+qaP"),Object(m.a)(ge,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"vapidDetailsData",attrs:{model:t.vapidDetailsData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.vapidDetails,data:t.vapidDetailsData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));he.options.__file="WebPush.vue";var me=he.exports,be={components:{ActivityPub:dt,Authentication:mt,AutoLinker:vt,Captcha:kt,Esshd:wt,Frontend:Pt,Gopher:Ut,Http:Tt,Instance:Lt,JobQueue:It,Logger:Kt,Mailer:Nt,MediaProxy:Ht,Metadata:Yt,Mrf:te,Other:se,RateLimiters:re,Relays:le,RebootButton:i("rIUS").a,Upload:de,WebPush:me},data:function(){return{options:[{value:"activityPub",label:o.a.t("settings.activityPub")},{value:"auth",label:o.a.t("settings.auth")},{value:"autoLinker",label:o.a.t("settings.autoLinker")},{value:"esshd",label:o.a.t("settings.esshd")},{value:"captcha",label:o.a.t("settings.captcha")},{value:"frontend",label:o.a.t("settings.frontend")},{value:"gopher",label:o.a.t("settings.gopher")},{value:"http",label:o.a.t("settings.http")},{value:"instance",label:o.a.t("settings.instance")},{value:"jobQueue",label:o.a.t("settings.jobQueue")},{value:"logger",label:o.a.t("settings.logger")},{value:"mailer",label:o.a.t("settings.mailer")},{value:"mediaProxy",label:o.a.t("settings.mediaProxy")},{value:"metadata",label:o.a.t("settings.metadata")},{value:"mrf",label:o.a.t("settings.mrf")},{value:"rateLimiters",label:o.a.t("settings.rateLimiters")},{value:"relays",label:o.a.t("settings.relays")},{value:"webPush",label:o.a.t("settings.webPush")},{value:"upload",label:o.a.t("settings.upload")},{value:"other",label:o.a.t("settings.other")}],searchQuery:""}},computed:{activeTab:{get:function(){return this.$store.state.settings.activeTab},set:function(t){this.$store.dispatch("SetActiveTab",t)}},configDisabled:function(){return this.$store.state.settings.configDisabled},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"header-sidebar-opened":"header-sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},rebootIsSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"reboot-sidebar-opened":"reboot-sidebar-closed"},searchData:function(){return this.$store.state.settings.searchData},tabs:function(){return u}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchSettings")},methods:{handleSearchSelect:function(){var t=r()(n.a.mark(function t(e){var i,s,a=this;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return i=Object.keys(this.tabs).find(function(t){return a.tabs[t].settings.includes(":pleroma"===e.group?e.key:e.group)}),t.next=3,this.$store.dispatch("SetActiveTab",i);case 3:(s=document.querySelector('[data-search="'.concat(e.key,'"]')))&&s.scrollIntoView({block:"start",behavior:"smooth"});case 5:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}(),querySearch:function(t,e){e(this.searchData.filter(function(e){return e.search.find(function(e){return e.includes(t.toLowerCase())})}).map(function(t){return":opts"===t.groupKey?{value:"".concat(t.label," in Auto Linker"),group:t.groupKey,key:t.key}:{value:"".concat(t.label," in ").concat(t.groupLabel),group:t.groupKey,key:t.key}}))}}},fe=(i("xOUI"),Object(m.a)(be,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"settings-container",class:t.rebootIsSidebarOpen},[i("div",{staticClass:"reboot-button-container"},[i("reboot-button")],1),t._v(" "),t.isDesktop?i("div",[i("div",{staticClass:"settings-header-container",class:t.isSidebarOpen},[i("h1",{staticClass:"settings-header"},[t._v(t._s(t.$t("settings.settings")))]),t._v(" "),i("div",{staticClass:"docs-search-container"},[i("el-link",{attrs:{underline:!1,href:"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/",target:"_blank"}},[i("el-button",{staticClass:"settings-docs-button"},[i("span",[i("i",{staticClass:"el-icon-document"}),t._v("\n "+t._s(t.$t("settings.seeDocs"))+"\n ")])])],1),t._v(" "),i("el-autocomplete",{staticClass:"settings-search-input",attrs:{"fetch-suggestions":t.querySearch,"trigger-on-focus":!1,clearable:"",placeholder:"Search","prefix-icon":"el-icon-search"},on:{select:t.handleSearchSelect},model:{value:t.searchQuery,callback:function(e){t.searchQuery=e},expression:"searchQuery"}})],1)]),t._v(" "),i("el-tabs",{attrs:{"tab-position":"left"},model:{value:t.activeTab,callback:function(e){t.activeTab=e},expression:"activeTab"}},t._l(t.tabs,function(e,s){return i("el-tab-pane",{key:s,attrs:{label:t.$t(e.label),disabled:t.configDisabled,name:s,lazy:""}},[i(s,{tag:"component"})],1)}),1)],1):t._e(),t._v(" "),t.isMobile||t.isTablet?i("div",[i("div",{staticClass:"settings-header-container",class:t.isSidebarOpen},[i("h1",{staticClass:"settings-header"},[t._v(t._s(t.$t("settings.settings")))])]),t._v(" "),i("div",{staticClass:"nav-container"},[i("el-select",{staticClass:"settings-menu",attrs:{placeholder:"Select"},model:{value:t.activeTab,callback:function(e){t.activeTab=e},expression:"activeTab"}},t._l(t.options,function(e){return i("el-option",{key:e.value,attrs:{label:e.label,value:e.value,disabled:t.configDisabled}})}),1),t._v(" "),i("el-link",{attrs:{underline:!1,href:"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/",target:"_blank"}},[i("el-button",{staticClass:"settings-docs-button"},[i("span",[i("i",{staticClass:"el-icon-document"}),t._v("\n "+t._s(t.$t("settings.seeDocs"))+"\n ")])])],1)],1),t._v(" "),i("div",{staticClass:"settings-search-input-container"}),t._v(" "),"activityPub"===t.activeTab?i("activity-pub"):t._e(),t._v(" "),"auth"===t.activeTab?i("authentication"):t._e(),t._v(" "),"autoLinker"===t.activeTab?i("auto-linker"):t._e(),t._v(" "),"esshd"===t.activeTab?i("esshd"):t._e(),t._v(" "),"captcha"===t.activeTab?i("captcha"):t._e(),t._v(" "),"frontend"===t.activeTab?i("frontend"):t._e(),t._v(" "),"gopher"===t.activeTab?i("gopher"):t._e(),t._v(" "),"http"===t.activeTab?i("http"):t._e(),t._v(" "),"instance"===t.activeTab?i("instance"):t._e(),t._v(" "),"jobQueue"===t.activeTab?i("job-queue"):t._e(),t._v(" "),"logger"===t.activeTab?i("logger"):t._e(),t._v(" "),"mailer"===t.activeTab?i("mailer"):t._e(),t._v(" "),"mediaProxy"===t.activeTab?i("media-proxy"):t._e(),t._v(" "),"metadata"===t.activeTab?i("metadata"):t._e(),t._v(" "),"mrf"===t.activeTab?i("mrf"):t._e(),t._v(" "),"rateLimiters"===t.activeTab?i("rate-limiters"):t._e(),t._v(" "),"relays"===t.activeTab?i("relays"):t._e(),t._v(" "),"webPush"===t.activeTab?i("web-push"):t._e(),t._v(" "),"upload"===t.activeTab?i("upload"):t._e(),t._v(" "),"other"===t.activeTab?i("other"):t._e()],1):t._e()])},[],!1,null,"667428a6",null));fe.options.__file="index.vue";e.default=fe.exports},apN7:function(t,e,i){"use strict";var s=i("9p49");i.n(s).a},cyzs:function(t,e,i){"use strict";var s=i("Px65");i.n(s).a},e0P1:function(t,e,i){"use strict";var s=i("TudB");i.n(s).a},fyIw:function(t,e,i){},gFOO:function(t,e,i){"use strict";var s=i("jqM2");i.n(s).a},h9z7:function(t,e,i){"use strict";var s=i("TOIk");i.n(s).a},hVXW:function(t,e,i){"use strict";var s=i("uswN");i.n(s).a},irif:function(t,e,i){"use strict";var s=i("UtFC");i.n(s).a},jqM2:function(t,e,i){},lNpP:function(t,e,i){"use strict";var s=i("UbP/");i.n(s).a},ld6V:function(t,e,i){},mADP:function(t,e,i){"use strict";var s=i("qLeA");i.n(s).a},mGnP:function(t,e,i){"use strict";var s=i("smg2");i.n(s).a},mSK5:function(t,e,i){},mstB:function(t,e,i){"use strict";var s=i("pd4h");i.n(s).a},nKzF:function(t,e,i){"use strict";var s=i("77pt");i.n(s).a},"ncj/":function(t,e,i){},pd4h:function(t,e,i){},pnah:function(t,e,i){"use strict";var s=i("JqY8");i.n(s).a},qEST:function(t,e,i){"use strict";var s=i("4NUT");i.n(s).a},qLeA:function(t,e,i){},qoXt:function(t,e,i){},rIUS:function(t,e,i){"use strict";var s=i("o0o1"),n=i.n(s),a=i("yXPU"),r=i.n(a),o=i("mSNy"),u={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("RestartApplication");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.restartSuccess")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},l=i("KHd+"),c=Object(l.a)(u,function(){var t=this.$createElement,e=this._self._c||t;return this.needReboot?e("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[e("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[e("span",[e("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);c.options.__file="index.vue";e.a=c.exports},rdar:function(t,e,i){"use strict";var s=i("NiUD");i.n(s).a},smg2:function(t,e,i){},uswN:function(t,e,i){},w5cJ:function(t,e,i){"use strict";var s=i("PYLh");i.n(s).a},wgcy:function(t,e,i){},x6RV:function(t,e,i){},xOUI:function(t,e,i){"use strict";var s=i("qoXt");i.n(s).a},y7KD:function(t,e,i){"use strict";var s=i("YKHE");i.n(s).a}}]); -//# sourceMappingURL=chunk-4011.67fb1692.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-4011.67fb1692.js.map b/priv/static/adminfe/static/js/chunk-4011.67fb1692.js.map deleted file mode 100644 index 6df398cbc..000000000 --- a/priv/static/adminfe/static/js/chunk-4011.67fb1692.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue?c65c","webpack:///./src/views/settings/components/WebPush.vue?38e3","webpack:///./src/views/settings/components/Captcha.vue?029c","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue?ac92","webpack:///./src/views/settings/components/Authentication.vue?4503","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue?b469","webpack:///./src/views/settings/components/Upload.vue?33cd","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue?cf11","webpack:///./src/views/settings/components/Esshd.vue?eedf","webpack:///./src/views/settings/components/Relays.vue?3141","webpack:///./src/views/settings/components/Http.vue?56b1","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue?7da2","webpack:///./src/views/settings/components/Mailer.vue?cb92","webpack:///./src/views/settings/components/inputComponents/MultipleSelect.vue?2e19","webpack:///./src/views/settings/components/MediaProxy.vue?e0fb","webpack:///./src/views/settings/components/RateLimiters.vue?0aac","webpack:///./src/views/settings/index.vue?a449","webpack:///./src/views/settings/components/tabs.js","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue?f6c5","webpack:///src/views/settings/components/inputComponents/AutoLinkerInput.vue","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue?2dcf","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue?859c","webpack:///src/views/settings/components/inputComponents/EditableKeywordInput.vue","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue?9a9b","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue?fcd8","webpack:///src/views/settings/components/inputComponents/CrontabInput.vue","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue?3c41","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue?bdb0","webpack:///src/views/settings/components/inputComponents/IconsInput.vue","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue?a391","webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue?9cfe","webpack:///src/views/settings/components/inputComponents/MascotsInput.vue","webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue","webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue?df45","webpack:///./src/views/settings/components/inputComponents/MultipleSelect.vue?4908","webpack:///src/views/settings/components/inputComponents/MultipleSelect.vue","webpack:///./src/views/settings/components/inputComponents/MultipleSelect.vue","webpack:///./src/views/settings/components/inputComponents/MultipleSelect.vue?122e","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue?4183","webpack:///src/views/settings/components/inputComponents/ProxyUrlInput.vue","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue?b4d0","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue?663f","webpack:///src/views/settings/components/inputComponents/PruneInput.vue","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue?cf76","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue?2905","webpack:///src/views/settings/components/inputComponents/RateLimitInput.vue","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue?29fc","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue?4de6","webpack:///src/views/settings/components/inputComponents/RegInvitesInput.vue","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue?ce9b","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue?b3f6","webpack:///src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue?bb9b","webpack:///./src/views/settings/components/Inputs.vue?5b3f","webpack:///src/views/settings/components/Inputs.vue","webpack:///./src/views/settings/components/Inputs.vue","webpack:///./src/views/settings/components/Inputs.vue?74cd","webpack:///./src/views/settings/components/Setting.vue?39a1","webpack:///src/views/settings/components/Setting.vue","webpack:///./src/views/settings/components/Setting.vue","webpack:///./src/views/settings/components/Setting.vue?4f77","webpack:///./src/views/settings/components/ActivityPub.vue?9ad8","webpack:///src/views/settings/components/ActivityPub.vue","webpack:///./src/views/settings/components/ActivityPub.vue","webpack:///./src/views/settings/components/ActivityPub.vue?0deb","webpack:///./src/views/settings/components/Authentication.vue?1922","webpack:///src/views/settings/components/Authentication.vue","webpack:///./src/views/settings/components/Authentication.vue","webpack:///./src/views/settings/components/Authentication.vue?5ce1","webpack:///./src/views/settings/components/AutoLinker.vue?fed2","webpack:///src/views/settings/components/AutoLinker.vue","webpack:///./src/views/settings/components/AutoLinker.vue","webpack:///./src/views/settings/components/AutoLinker.vue?7069","webpack:///./src/views/settings/components/Captcha.vue?b5df","webpack:///src/views/settings/components/Captcha.vue","webpack:///./src/views/settings/components/Captcha.vue","webpack:///./src/views/settings/components/Captcha.vue?1958","webpack:///./src/views/settings/components/Esshd.vue?b0ed","webpack:///src/views/settings/components/Esshd.vue","webpack:///./src/views/settings/components/Esshd.vue","webpack:///./src/views/settings/components/Esshd.vue?2ce0","webpack:///./src/views/settings/components/Frontend.vue?1622","webpack:///src/views/settings/components/Frontend.vue","webpack:///./src/views/settings/components/Frontend.vue","webpack:///./src/views/settings/components/Frontend.vue?d1dc","webpack:///./src/views/settings/components/Gopher.vue?cb09","webpack:///src/views/settings/components/Gopher.vue","webpack:///./src/views/settings/components/Gopher.vue","webpack:///./src/views/settings/components/Gopher.vue?290c","webpack:///./src/views/settings/components/Http.vue?0ecb","webpack:///src/views/settings/components/Http.vue","webpack:///./src/views/settings/components/Http.vue","webpack:///./src/views/settings/components/Http.vue?4644","webpack:///./src/views/settings/components/Instance.vue?ea1e","webpack:///src/views/settings/components/Instance.vue","webpack:///./src/views/settings/components/Instance.vue","webpack:///./src/views/settings/components/Instance.vue?b251","webpack:///./src/views/settings/components/JobQueue.vue?e650","webpack:///src/views/settings/components/JobQueue.vue","webpack:///./src/views/settings/components/JobQueue.vue","webpack:///./src/views/settings/components/JobQueue.vue?884a","webpack:///./src/views/settings/components/Logger.vue?aa5f","webpack:///src/views/settings/components/Logger.vue","webpack:///./src/views/settings/components/Logger.vue","webpack:///./src/views/settings/components/Logger.vue?35b2","webpack:///./src/views/settings/components/Mailer.vue?48d6","webpack:///src/views/settings/components/Mailer.vue","webpack:///./src/views/settings/components/Mailer.vue","webpack:///./src/views/settings/components/Mailer.vue?c66e","webpack:///./src/views/settings/components/MediaProxy.vue?9571","webpack:///src/views/settings/components/MediaProxy.vue","webpack:///./src/views/settings/components/MediaProxy.vue","webpack:///./src/views/settings/components/MediaProxy.vue?b888","webpack:///./src/views/settings/components/Metadata.vue?7f4f","webpack:///src/views/settings/components/Metadata.vue","webpack:///./src/views/settings/components/Metadata.vue","webpack:///./src/views/settings/components/Metadata.vue?cda7","webpack:///./src/views/settings/components/MRF.vue?274b","webpack:///src/views/settings/components/MRF.vue","webpack:///./src/views/settings/components/MRF.vue","webpack:///./src/views/settings/components/MRF.vue?8234","webpack:///./src/views/settings/components/Other.vue?7bf4","webpack:///src/views/settings/components/Other.vue","webpack:///./src/views/settings/components/Other.vue","webpack:///./src/views/settings/components/Other.vue?2b05","webpack:///./src/views/settings/components/RateLimiters.vue?15d2","webpack:///src/views/settings/components/RateLimiters.vue","webpack:///./src/views/settings/components/RateLimiters.vue","webpack:///./src/views/settings/components/RateLimiters.vue?10f8","webpack:///./src/views/settings/components/Relays.vue?72ba","webpack:///src/views/settings/components/Relays.vue","webpack:///./src/views/settings/components/Relays.vue","webpack:///./src/views/settings/components/Relays.vue?c6f8","webpack:///./src/views/settings/components/Upload.vue?304d","webpack:///src/views/settings/components/Upload.vue","webpack:///./src/views/settings/components/Upload.vue","webpack:///./src/views/settings/components/Upload.vue?2f3c","webpack:///./src/views/settings/components/WebPush.vue?5451","webpack:///src/views/settings/components/WebPush.vue","webpack:///./src/views/settings/components/WebPush.vue","webpack:///./src/views/settings/components/WebPush.vue?7f8e","webpack:///./src/views/settings/index.vue?3c3a","webpack:///src/views/settings/index.vue","webpack:///./src/views/settings/index.vue","webpack:///./src/views/settings/components/Metadata.vue?0952","webpack:///./src/views/settings/components/AutoLinker.vue?42b3","webpack:///./src/views/settings/components/Instance.vue?2668","webpack:///./src/views/settings/components/Other.vue?8e53","webpack:///./src/views/settings/components/MRF.vue?8c92","webpack:///./src/views/settings/components/Frontend.vue?f18f","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue?f3ab","webpack:///./src/views/settings/components/JobQueue.vue?d797","webpack:///./src/views/settings/components/Logger.vue?a62e","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue?e239","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue?b209","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue?5f84","webpack:///./src/views/settings/components/Setting.vue?ebdb","webpack:///./src/views/settings/components/ActivityPub.vue?48d9","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue?5a78","webpack:///./src/views/settings/components/Gopher.vue?5fd9","webpack:///./src/views/settings/index.vue?e050","webpack:///./src/views/settings/components/Inputs.vue?e1ce"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MascotsInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_WebPush_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Captcha_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_SelectInputWithReducedLabels_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Authentication_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RegInvitesInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Upload_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_PruneInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Esshd_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Relays_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Http_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_AutoLinkerInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Mailer_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MultipleSelect_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MediaProxy_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RateLimiters_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","tabs","activity-pub","label","settings","authentication","auto-linker","esshd","captcha","frontend","gopher","http","instance","job-queue","logger","mailer","media-proxy","metadata","mrf","rate-limiters","relays","web-push","upload","other","inputComponents_AutoLinkerInputvue_type_script_lang_js_","name","props","data","type","Object","Array","default","setting","settingGroup","methods","autoLinkerBooleanValue","key","value","this","autoLinkerIntegerValue","autoLinkerStringValue","processTwoTypeValue","input","updateSetting","group","$store","dispatch","component","componentNormalizer","_vm","_h","$createElement","_c","_self","attrs","data-search","on","change","$event","_v","_e","options","__file","AutoLinkerInput","inputComponents_EditableKeywordInputvue_type_script_lang_js_","computed","editableKeywordWithInteger","isArray","includes","isDesktop","state","app","device","addRowToEditableKeyword","updatedValue","concat","toConsumableArray_default","","id","generateID","deleteEditableKeywordRow","element","deletedId","getId","filteredValues","filter","values","Math","random","toString","getKey","keys","getValue","parseEditableKeyword","inputType","_this","updatedId","map","index","defineProperty_default","objectSpread_default","updatedSettings","wrapUpdatedSettings","reduce","acc","EditableKeywordInput_component","staticClass","_l","placeholder","size","icon","circle","click","min","multiple","filterable","allow-create","EditableKeywordInput","inputComponents_CrontabInputvue_type_script_lang_js_","isMobile","isTablet","labelWidth","workers","suggestions","worker","getSuggestion","find","suggestion","update","currentValue","updatedValueWithType","CrontabInput_component","label-width","label-position","CrontabInput","inputComponents_IconsInputvue_type_script_lang_js_","addIconToIcons","addValueToIcons","i","deleteIcondRow","parseIcons","_ref","IconsInput_component","ref","IconsInput","inputComponents_MascotsInputvue_type_script_lang_js_","addRowToMascots",":url",":mime_type","deleteMascotsRow","mascot","getName","getUrl","_Object$values","slicedToArray_default","getMimeType","_Object$values3","parseMascots","mascotsWithoutIDs","_Object$values$","mascotValue","objectWithoutProperties_default","MascotsInput_component","MascotsInput","inputComponents_MultipleSelectvue_type_script_lang_js_","MultipleSelect_component","MultipleSelect","inputComponents_ProxyUrlInputvue_type_script_lang_js_","parents","required","proxyUrlData","length","socks5","host","port","updateProxyUrl","assembledData","_processNested","normalizers","reverse","valueForState","valueForUpdatedSettings","ProxyUrlInput_component","ProxyUrlInput","inputComponents_PruneInputvue_type_script_lang_js_","prune","get","set","updateRadioInput","updateIntInput","updatedSetting","processedValue","PruneInput_component","model","callback","$$v","expression","PruneInput","inputComponents_RateLimitInputvue_type_script_lang_js_","rateLimitAllUsers","rateLimitAuthUsers","rateLimitUnauthUsers","parseRateLimiter","typeOfInput","typeOfLimit","valueToSend","toggleLimits","tuple","RateLimitInput_component","RateLimitInput","inputComponents_RegInvitesInputvue_type_script_lang_js_","registrationsOpen","invitesEnabled","$confirm","confirmButtonText","cancelButtonText","then","RegInvitesInput_component","RegInvitesInput","inputComponents_SelectInputWithReducedLabelsvue_type_script_lang_js_","inputValue","prefixes",":rewrite_policy","Pleroma.Web.Auth.Authenticator",":method",":adapter",":providers",":parsers",":ttl_setters",":scrub_policy",":federation_publisher_modules",":uploader",":filters","split","renderMultipleSelect","rewritePolicyOptions","SelectInputWithReducedLabels_component","option","clearable","SelectInputWithReducedLabels","components_Inputsvue_type_script_lang_js_","components","customLabelWidth","String","labelClass","margin","Number","nested","Boolean","settingParent","canBeDeleted","_this$settingGroup","lodash_default","a","db","iconsData","substr","keywordData","reducedSelects","editableKeyword","findIndex","el","getFormattedDescription","desc","marked_default","processNestedData","parentKey","removeSetting","_removeSetting","asyncToGenerator_default","regenerator_default","mark","_callee","config","wrap","_context","prev","next","delete","subkeys","t0","abrupt","$message","message","lang","t","stop","apply","arguments","Inputs_component","class","style","slot","_s","content","$t","placement","subSetting","setting-group","setting-parent","custom-label-width","label-class","undefined","description","domProps","innerHTML","components_Settingvue_type_script_lang_js_","Inputs","emailAdapterChildren","adapter","children","child","loading","settingKey","existingKey","compound","divideSetting","_x","tab","Setting_component","staticStyle","margin-left","Setting","components_ActivityPubvue_type_script_lang_js_","vuex_esm","activitypub","activitypubData","isSidebarOpen","sidebar","opened","labelPosition","user","userData","onSubmit","_onSubmit","ActivityPub_component","ActivityPub","components_Authenticationvue_type_script_lang_js_","auth","authData","ldap","ldapData","oauth2","oauth2Data","pleromaAuthenticator","pleromaAuthenticatorData","Authentication_component","Authentication","components_AutoLinkervue_type_script_lang_js_","autoLinker","autoLinkerData","AutoLinker_component","AutoLinker","components_Captchavue_type_script_lang_js_","captchaData","kocaptcha","kocaptchaData","Captcha_component","Captcha","components_Esshdvue_type_script_lang_js_","esshdData","toggleEsshd","Esshd_component","Esshd","components_Frontendvue_type_script_lang_js_","assets","assetsData","chat","chatData","emoji","emojiData","frontendData","markup","markupData","staticFe","staticFeData","Frontend_component","Frontend","components_Gophervue_type_script_lang_js_","gopherData","Gopher_component","Gopher","components_Httpvue_type_script_lang_js_","corsPlug","corsPlugData","httpData","httpSecurity","httpSecurityData","httpSignatures","httpSignaturesData","webCacheTtl","webCacheTtlData","Http_component","Http","components_Instancevue_type_script_lang_js_","adminToken","adminTokenData","feed","feedData","instanceData","manifest","manifestData","pleromaUser","pleromaUserData","scheduledActivity","scheduledActivityData","streamer","streamerData","uriSchemes","uriSchemesData","Instance_component","Instance","components_JobQueuevue_type_script_lang_js_","activityExpiration","activityExpirationData","obanQueues","obanQueuesData","workersData","JobQueue_component","JobQueue","components_Loggervue_type_script_lang_js_","console","consoleData","exsyslogger","exsysloggerData","loggerData","quack","quackData","Logger_component","Logger","components_Mailervue_type_script_lang_js_","emailNotifications","emailNotificationsData","mailerData","newUsersDigestEmail","newUsersDigestEmailData","swoosh","swooshData","userEmail","userEmailData","Mailer_component","Mailer","components_MediaProxyvue_type_script_lang_js_","mediaProxy","mediaProxyData","MediaProxy_component","MediaProxy","components_Metadatavue_type_script_lang_js_","metadataData","richMedia","richMediaData","Metadata_component","Metadata","components_MRFvue_type_script_lang_js_","modules","modulesData","mrfSimple","mrfSimpleData","mrfRejectnonpublic","mrfRejectnonpublicData","mrfHellthread","mrfHellthreadData","mrfKeyword","mrfKeywordData","mrfObjectAge","mrfObjectAgeData","mrfSubchain","mrfSubchainData","mrfMention","mrfMentionData","mrfNormalizeMarkup","mrfNormalizeMarkupData","mrfVocabulary","mrfVocabularyData","MRF_component","MRF","components_Othervue_type_script_lang_js_","mimeTypes","mimeTypesData","remoteIp","remoteIpData","Other_component","Other","components_RateLimitersvue_type_script_lang_js_","rateLimiters","rateLimitersData","RateLimiters_component","RateLimiters","components_Relaysvue_type_script_lang_js_","newRelay","fetchedRelays","relaysTable","relay","mounted","followRelay","deleteRelay","Relays_component","nativeOn","keyup","indexOf","_k","keyCode","prop","fixed","width","scopedSlots","_u","fn","scope","row","Relays","components_Uploadvue_type_script_lang_js_","showUploadersS3","showUploadersLocal","uploadData","uploadersLocal","uploadersLocalData","uploadersS3","uploadersS3Data","uploadFilterMogrify","uploadFilterMogrifyData","uploadAnonymizeFilename","uploadAnonymizeFilenameData","Upload_component","Upload","components_WebPushvue_type_script_lang_js_","vapidDetails","vapidDetailsData","WebPush_component","WebPush","views_settingsvue_type_script_lang_js_","Mrf","RebootButton","searchQuery","activeTab","configDisabled","rebootIsSidebarOpen","searchData","tabs_tabs","handleSearchSelect","_handleSearchSelect","selectedValue","selectedSetting","document","querySelector","scrollIntoView","block","behavior","querySearch","queryString","cb","searchObj","search","toLowerCase","groupKey","groupLabel","settings_component","underline","href","target","fetch-suggestions","trigger-on-focus","prefix-icon","select","tab-position","componentName","disabled","lazy","tag","item","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Metadata_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_AutoLinker_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Instance_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Other_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MRF_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Frontend_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RateLimitInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_JobQueue_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Logger_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ProxyUrlInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_CrontabInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_EditableKeywordInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Setting_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ActivityPub_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","components_RebootButtonvue_type_script_lang_js_","needReboot","restartApp","_restartApp","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_IconsInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Gopher_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_667428a6_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Inputs_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__"],"mappings":"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","file":"static/js/chunk-4011.67fb1692.js","sourcesContent":["import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleSelect.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleSelect.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"settings-container\",class:_vm.rebootIsSidebarOpen},[_c('div',{staticClass:\"reboot-button-container\"},[_c('reboot-button')],1),_vm._v(\" \"),(_vm.isDesktop)?_c('div',[_c('div',{staticClass:\"settings-header-container\",class:_vm.isSidebarOpen},[_c('h1',{staticClass:\"settings-header\"},[_vm._v(_vm._s(_vm.$t('settings.settings')))]),_vm._v(\" \"),_c('div',{staticClass:\"docs-search-container\"},[_c('el-link',{attrs:{\"underline\":false,\"href\":\"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"settings-docs-button\"},[_c('span',[_c('i',{staticClass:\"el-icon-document\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.seeDocs'))+\"\\n \")])])],1),_vm._v(\" \"),_c('el-autocomplete',{staticClass:\"settings-search-input\",attrs:{\"fetch-suggestions\":_vm.querySearch,\"trigger-on-focus\":false,\"clearable\":\"\",\"placeholder\":\"Search\",\"prefix-icon\":\"el-icon-search\"},on:{\"select\":_vm.handleSearchSelect},model:{value:(_vm.searchQuery),callback:function ($$v) {_vm.searchQuery=$$v},expression:\"searchQuery\"}})],1)]),_vm._v(\" \"),_c('el-tabs',{attrs:{\"tab-position\":\"left\"},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},_vm._l((_vm.tabs),function(value,componentName){return _c('el-tab-pane',{key:componentName,attrs:{\"label\":_vm.$t(value.label),\"disabled\":_vm.configDisabled,\"name\":componentName,\"lazy\":\"\"}},[_c(componentName,{tag:\"component\"})],1)}),1)],1):_vm._e(),_vm._v(\" \"),(_vm.isMobile || _vm.isTablet)?_c('div',[_c('div',{staticClass:\"settings-header-container\",class:_vm.isSidebarOpen},[_c('h1',{staticClass:\"settings-header\"},[_vm._v(_vm._s(_vm.$t('settings.settings')))])]),_vm._v(\" \"),_c('div',{staticClass:\"nav-container\"},[_c('el-select',{staticClass:\"settings-menu\",attrs:{\"placeholder\":\"Select\"},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},_vm._l((_vm.options),function(item){return _c('el-option',{key:item.value,attrs:{\"label\":item.label,\"value\":item.value,\"disabled\":_vm.configDisabled}})}),1),_vm._v(\" \"),_c('el-link',{attrs:{\"underline\":false,\"href\":\"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"settings-docs-button\"},[_c('span',[_c('i',{staticClass:\"el-icon-document\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.seeDocs'))+\"\\n \")])])],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"settings-search-input-container\"}),_vm._v(\" \"),(_vm.activeTab === 'activityPub')?_c('activity-pub'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'auth')?_c('authentication'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'autoLinker')?_c('auto-linker'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'esshd')?_c('esshd'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'captcha')?_c('captcha'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'frontend')?_c('frontend'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'gopher')?_c('gopher'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'http')?_c('http'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'instance')?_c('instance'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'jobQueue')?_c('job-queue'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'logger')?_c('logger'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'mailer')?_c('mailer'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'mediaProxy')?_c('media-proxy'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'metadata')?_c('metadata'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'mrf')?_c('mrf'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'rateLimiters')?_c('rate-limiters'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'relays')?_c('relays'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'webPush')?_c('web-push'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'upload')?_c('upload'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'other')?_c('other'):_vm._e()],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export const tabs = {\n 'activity-pub': {\n label: 'settings.activityPub',\n settings: [':activitypub', ':user']\n },\n 'authentication': {\n label: 'settings.auth',\n settings: [':auth', ':ldap', ':oauth2', 'Pleroma.Web.Auth.Authenticator']\n },\n 'auto-linker': {\n label: 'settings.autoLinker',\n settings: [':opts']\n },\n 'esshd': {\n label: 'settings.esshd',\n settings: [':esshd']\n },\n 'captcha': {\n label: 'settings.captcha',\n settings: ['Pleroma.Captcha', 'Pleroma.Captcha.Kocaptcha']\n },\n 'frontend': {\n label: 'settings.frontend',\n settings: [':assets', ':chat', ':emoji', ':frontend_configurations', ':markup', ':static_fe']\n },\n 'gopher': {\n label: 'settings.gopher',\n settings: [':gopher']\n },\n 'http': {\n label: 'settings.http',\n settings: [':cors_plug', ':http', ':http_security', ':http_signatures', ':web_cache_ttl']\n },\n 'instance': {\n label: 'settings.instance',\n settings: [':admin_token', ':instance', ':manifest', 'Pleroma.User', 'Pleroma.ScheduledActivity', ':uri_schemes', ':feed', ':streamer']\n },\n 'job-queue': {\n label: 'settings.jobQueue',\n settings: ['Pleroma.ActivityExpiration', 'Oban', ':workers']\n },\n 'logger': {\n label: 'settings.logger',\n settings: [':console', ':ex_syslogger', ':quack', ':logger']\n },\n 'mailer': {\n label: 'settings.mailer',\n settings: [':email_notifications', 'Pleroma.Emails.Mailer', 'Pleroma.Emails.UserEmail', ':swoosh', 'Pleroma.Emails.NewUsersDigestEmail']\n },\n 'media-proxy': {\n label: 'settings.mediaProxy',\n settings: [':media_proxy']\n },\n 'metadata': {\n label: 'settings.metadata',\n settings: ['Pleroma.Web.Metadata', ':rich_media']\n },\n 'mrf': {\n label: 'settings.mrf',\n settings: [':mrf_simple', ':mrf_rejectnonpublic', ':mrf_hellthread', ':mrf_keyword', ':mrf_subchain', ':mrf_mention', ':mrf_normalize_markup', ':mrf_vocabulary', ':mrf_object_age', ':modules']\n },\n 'rate-limiters': {\n label: 'settings.rateLimiters',\n settings: [':rate_limit']\n },\n 'relays': {\n label: 'settings.relays',\n settings: []\n },\n 'web-push': {\n label: 'settings.webPush',\n settings: [':vapid_details']\n },\n 'upload': {\n label: 'settings.upload',\n settings: ['Pleroma.Upload.Filter.AnonymizeFilename', 'Pleroma.Upload.Filter.Mogrify', 'Pleroma.Uploaders.S3', 'Pleroma.Uploaders.Local', 'Pleroma.Upload']\n },\n 'other': {\n label: 'settings.other',\n settings: [':mime', 'Pleroma.Plugs.RemoteIp']\n }\n}\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./AutoLinkerInput.vue?vue&type=template&id=cea0b11a&\"\nimport script from \"./AutoLinkerInput.vue?vue&type=script&lang=js&\"\nexport * from \"./AutoLinkerInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AutoLinkerInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"AutoLinkerInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.setting.key === ':class' || _vm.setting.key === ':rel')?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-switch',{attrs:{\"value\":_vm.autoLinkerBooleanValue(_vm.setting.key)},on:{\"change\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}),_vm._v(\" \"),(_vm.autoLinkerBooleanValue(_vm.setting.key))?_c('el-input',{attrs:{\"value\":_vm.autoLinkerStringValue(_vm.setting.key)},on:{\"input\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':truncate')?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-switch',{attrs:{\"value\":_vm.autoLinkerBooleanValue(_vm.setting.key)},on:{\"change\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}),_vm._v(\" \"),(_vm.autoLinkerBooleanValue(_vm.setting.key))?_c('el-input-number',{attrs:{\"value\":_vm.autoLinkerIntegerValue(_vm.setting.key)},on:{\"input\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}):_vm._e()],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./EditableKeywordInput.vue?vue&type=template&id=59edcd40&\"\nimport script from \"./EditableKeywordInput.vue?vue&type=script&lang=js&\"\nexport * from \"./EditableKeywordInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditableKeywordInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"EditableKeywordInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"editable-keyword-container\"},[(_vm.setting.key === ':replace')?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(element){return _c('div',{key:_vm.getId(element),staticClass:\"setting-input\"},[_c('el-input',{staticClass:\"name-input\",attrs:{\"value\":_vm.getKey(element),\"placeholder\":\"pattern\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'key', element)}}}),_vm._v(\" :\\n \"),_c('el-input',{staticClass:\"value-input\",attrs:{\"value\":_vm.getValue(element),\"placeholder\":\"replacement\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'value', element)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteEditableKeywordRow(element)}}})],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToEditableKeyword}})],2):(_vm.editableKeywordWithInteger)?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(element){return _c('div',{key:_vm.getId(element),staticClass:\"setting-input\"},[_c('el-input',{staticClass:\"name-input\",attrs:{\"value\":_vm.getKey(element),\"placeholder\":\"key\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'key', element)}}}),_vm._v(\" :\\n \"),_c('el-input-number',{staticClass:\"value-input\",attrs:{\"value\":_vm.getValue(element),\"min\":0,\"size\":\"large\"},on:{\"change\":function($event){return _vm.parseEditableKeyword($event, 'value', element)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteEditableKeywordRow(element)}}})],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToEditableKeyword}})],2):_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(element){return _c('div',{key:_vm.getId(element),staticClass:\"setting-input\"},[_c('el-input',{staticClass:\"name-input\",attrs:{\"value\":_vm.getKey(element),\"placeholder\":\"key\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'key', element)}}}),_vm._v(\" :\\n \"),_c('el-select',{staticClass:\"value-input\",attrs:{\"value\":_vm.getValue(element),\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.parseEditableKeyword($event, 'value', element)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteEditableKeywordRow(element)}}})],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToEditableKeyword}})],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./CrontabInput.vue?vue&type=template&id=55e14917&\"\nimport script from \"./CrontabInput.vue?vue&type=script&lang=js&\"\nexport * from \"./CrontabInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CrontabInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"CrontabInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-form',{staticClass:\"crontab\",attrs:{\"label-width\":_vm.labelWidth,\"label-position\":_vm.isMobile ? 'top' : 'right'}},_vm._l((_vm.workers),function(worker){return _c('el-form-item',{key:worker,staticClass:\"crontab-container\",attrs:{\"label\":worker,\"data-search\":_vm.setting.key}},[_c('el-input',{staticClass:\"input setting-input\",attrs:{\"value\":_vm.data[worker],\"placeholder\":_vm.getSuggestion(worker) || null},on:{\"input\":function($event){return _vm.update($event, worker)}}})],1)}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./IconsInput.vue?vue&type=template&id=0e981ae9&\"\nimport script from \"./IconsInput.vue?vue&type=script&lang=js&\"\nexport * from \"./IconsInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./IconsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"IconsInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mascot-container\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(icon,index){return _c('div',{key:index,staticClass:\"mascot\"},[_c('div',{staticClass:\"icons-container\"},[_c('div',{staticClass:\"icon-container\"},_vm._l((icon),function(ref){\nvar key = ref.key;\nvar value = ref.value;\nvar id = ref.id;\nreturn _c('div',{key:id,staticClass:\"icon-values-container\"},[_c('el-input',{staticClass:\"icon-key-input\",attrs:{\"value\":key,\"placeholder\":\"key\"},on:{\"input\":function($event){return _vm.parseIcons($event, 'key', index, id)}}}),_vm._v(\" :\\n \"),_c('el-input',{staticClass:\"icon-value-input\",attrs:{\"value\":value,\"placeholder\":\"value\"},on:{\"input\":function($event){return _vm.parseIcons($event, 'value', index, id)}}})],1)}),0),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteIcondRow(index)}}})],1),_vm._v(\" \"),_c('div',{staticClass:\"icons-button-container\"},[_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.addValueToIcons(index)}}}),_vm._v(\" \"),_c('span',{staticClass:\"icons-button-desc\"},[_vm._v(\"Add another `key - value` pair to this icon\")])],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"})],1)}),_vm._v(\" \"),_c('div',{staticClass:\"icons-button-container\"},[_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addIconToIcons}}),_vm._v(\" \"),_c('span',{staticClass:\"icons-button-desc\"},[_vm._v(\"Add another icon configuration\")])],1)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MascotsInput.vue?vue&type=template&id=0015a0e3&\"\nimport script from \"./MascotsInput.vue?vue&type=script&lang=js&\"\nexport * from \"./MascotsInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MascotsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"MascotsInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mascot-container\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(mascot){return _c('div',{key:_vm.getId(mascot),staticClass:\"mascot\"},[_c('el-form-item',{staticClass:\"mascot-form-item\",attrs:{\"label\":\"Name\",\"label-width\":\"85px\"}},[_c('div',{staticClass:\"mascot-name-container\"},[_c('el-input',{staticClass:\"mascot-name-input\",attrs:{\"value\":_vm.getName(mascot),\"placeholder\":\"Name\"},on:{\"input\":function($event){return _vm.parseMascots($event, 'name', mascot)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteMascotsRow(mascot)}}})],1)]),_vm._v(\" \"),_c('el-form-item',{staticClass:\"mascot-form-item\",attrs:{\"label\":\"URL\",\"label-width\":\"85px\"}},[_c('el-input',{staticClass:\"mascot-input\",attrs:{\"value\":_vm.getUrl(mascot),\"placeholder\":\"URL\"},on:{\"input\":function($event){return _vm.parseMascots($event, 'url', mascot)}}})],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"mascot-form-item\",attrs:{\"label\":\"Mime type\",\"label-width\":\"85px\"}},[_c('el-input',{staticClass:\"mascot-input\",attrs:{\"value\":_vm.getMimeType(mascot),\"placeholder\":\"Mime type\"},on:{\"input\":function($event){return _vm.parseMascots($event, 'mimeType', mascot)}}})],1)],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToMascots}})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleSelect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleSelect.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MultipleSelect.vue?vue&type=template&id=3a978e24&\"\nimport script from \"./MultipleSelect.vue?vue&type=script&lang=js&\"\nexport * from \"./MultipleSelect.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MultipleSelect.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"MultipleSelect.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"multiple-select-container\"},[(_vm.setting.key === ':backends')?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.data.value,\"data-search\":_vm.setting.key || _vm.setting.group,\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},[_c('el-option',{attrs:{\"value\":\":console\",\"label\":\"console\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\":ex_syslogger\",\"label\":\"ExSyslogger\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"Quack.Logger\",\"label\":\"Quack.Logger\"}})],1):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':args')?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.data[_vm.setting.key],\"data-search\":_vm.setting.key || _vm.setting.group,\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},[_c('el-option',{attrs:{\"value\":\"strip\",\"label\":\"strip\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"auto-orient\",\"label\":\"auto-orient\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"implode\",\"label\":\"implode\"}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ProxyUrlInput.vue?vue&type=template&id=9a053e1c&\"\nimport script from \"./ProxyUrlInput.vue?vue&type=script&lang=js&\"\nexport * from \"./ProxyUrlInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ProxyUrlInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ProxyUrlInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"proxy-url-input\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-input',{staticClass:\"proxy-url-host-input\",attrs:{\"value\":_vm.proxyUrlData.host,\"placeholder\":\"host (e.g. localhost or 127.0.0.1)\"},on:{\"input\":function($event){return _vm.updateProxyUrl($event, 'host')}}}),_vm._v(\" \"),(_vm.isDesktop)?_c('span',[_vm._v(\":\")]):_vm._e(),_vm._v(\" \"),_c('el-input',{staticClass:\"proxy-url-value-input\",attrs:{\"value\":_vm.proxyUrlData.port,\"placeholder\":\"port (e.g 9020 or 3090)\"},on:{\"input\":function($event){return _vm.updateProxyUrl($event, 'port')}}}),_vm._v(\" \"),_c('div',{staticClass:\"socks5-checkbox-container\"},[_c('el-checkbox',{attrs:{\"value\":_vm.proxyUrlData.socks5},on:{\"change\":function($event){return _vm.updateProxyUrl($event, 'socks5')}}}),_vm._v(\" \"),_c('span',{staticClass:\"socks5-checkbox\"},[_vm._v(\"Socks5\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./PruneInput.vue?vue&type=template&id=172a9876&\"\nimport script from \"./PruneInput.vue?vue&type=script&lang=js&\"\nexport * from \"./PruneInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PruneInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"PruneInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-radio-group',{staticClass:\"prune-options\",model:{value:(_vm.prune),callback:function ($$v) {_vm.prune=$$v},expression:\"prune\"}},[_c('el-radio',{attrs:{\"label\":\":disabled\"}},[_vm._v(\"Disabled\")]),_vm._v(\" \"),_c('el-radio',{attrs:{\"label\":\":maxlen\"}},[_vm._v(\"Limit-based\")]),_vm._v(\" \"),_c('el-radio',{attrs:{\"label\":\":maxage\"}},[_vm._v(\"Time-based\")])],1),_vm._v(\" \"),(_vm.prune === ':maxlen')?_c('el-form-item',{attrs:{\"label\":\"max length\",\"label-width\":\"100\",\"label-position\":\"left\"}},[_c('el-input-number',{staticClass:\"top-margin\",attrs:{\"value\":_vm.data[1],\"min\":0,\"placeholder\":\"1500\",\"size\":\"large\"},on:{\"change\":function($event){return _vm.updateIntInput($event, ':maxlen')}}})],1):_vm._e(),_vm._v(\" \"),(_vm.prune === ':maxage')?_c('el-form-item',{attrs:{\"label\":\"max age\",\"label-width\":\"100\",\"label-position\":\"left\"}},[_c('el-input-number',{staticClass:\"top-margin\",attrs:{\"value\":_vm.data[1],\"min\":0,\"placeholder\":\"3600\",\"size\":\"large\"},on:{\"change\":function($event){return _vm.updateIntInput($event, ':maxage')}}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RateLimitInput.vue?vue&type=template&id=7eaf4b58&\"\nimport script from \"./RateLimitInput.vue?vue&type=script&lang=js&\"\nexport * from \"./RateLimitInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RateLimitInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RateLimitInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"rate-limit-container\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[(!_vm.rateLimitAuthUsers)?_c('div',[_c('el-input',{staticClass:\"scale-input\",attrs:{\"value\":_vm.rateLimitAllUsers[0],\"placeholder\":\"scale\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'scale', 'oneLimit', _vm.rateLimitAllUsers)}}}),_vm._v(\" \"),_c('span',[_vm._v(\":\")]),_vm._v(\" \"),_c('el-input',{staticClass:\"limit-input\",attrs:{\"value\":_vm.rateLimitAllUsers[1],\"placeholder\":\"limit\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'limit', 'oneLimit', _vm.rateLimitAllUsers)}}}),_vm._v(\" \"),_c('div',{staticClass:\"limit-button-container\"},[_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.toggleLimits([['', ''], ['', '']], _vm.setting.key)}}}),_vm._v(\" \"),_c('p',{staticClass:\"expl limit-expl\"},[_vm._v(\"Set different limits for unauthenticated and authenticated users\")])],1)],1):_vm._e(),_vm._v(\" \"),(_vm.rateLimitAuthUsers)?_c('div',[_c('el-form-item',{staticClass:\"rate-limit\"},[_c('div',{staticClass:\"rate-limit-label-container\"},[_c('span',{staticClass:\"rate-limit-label\"},[_vm._v(\"\\n Unauthenticated users:\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"rate-limit-content\"},[_c('el-input',{staticClass:\"scale-input\",attrs:{\"value\":_vm.rateLimitUnauthUsers[0],\"placeholder\":\"scale\"},on:{\"input\":function($event){return _vm.parseRateLimiter(\n $event, _vm.setting.key, 'scale', 'unauthUsersLimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers]\n )}}}),_vm._v(\" \"),_c('span',[_vm._v(\":\")]),_vm._v(\" \"),_c('el-input',{staticClass:\"limit-input\",attrs:{\"value\":_vm.rateLimitUnauthUsers[1],\"placeholder\":\"limit\"},on:{\"input\":function($event){return _vm.parseRateLimiter(\n $event, _vm.setting.key, 'limit', 'unauthUsersLimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers]\n )}}})],1)]),_vm._v(\" \"),_c('el-form-item',{staticClass:\"rate-limit\"},[_c('div',{staticClass:\"rate-limit-label-container\"},[_c('span',{staticClass:\"rate-limit-label\"},[_vm._v(\"\\n Authenticated users:\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"rate-limit-content\"},[_c('el-input',{staticClass:\"scale-input\",attrs:{\"value\":_vm.rateLimitAuthUsers[0],\"placeholder\":\"scale\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'scale', 'authUserslimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers])}}}),_vm._v(\" \"),_c('span',[_vm._v(\":\")]),_vm._v(\" \"),_c('el-input',{staticClass:\"limit-input\",attrs:{\"value\":_vm.rateLimitAuthUsers[1],\"placeholder\":\"limit\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'limit', 'authUserslimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers])}}})],1)]),_vm._v(\" \"),_c('div',{staticClass:\"limit-button-container\"},[_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.toggleLimits(['', ''], _vm.setting.key)}}}),_vm._v(\" \"),_c('p',{staticClass:\"expl limit-expl\"},[_vm._v(\"Set limit for all users\")])],1)],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RegInvitesInput.vue?vue&type=template&id=55c7fa7c&\"\nimport script from \"./RegInvitesInput.vue?vue&type=script&lang=js&\"\nexport * from \"./RegInvitesInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RegInvitesInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RegInvitesInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-switch',{staticClass:\"switch-input\",attrs:{\"value\":_vm.data[_vm.setting.key],\"data-search\":_vm.setting.key},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./SelectInputWithReducedLabels.vue?vue&type=template&id=0cb0ee62&\"\nimport script from \"./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"\nexport * from \"./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SelectInputWithReducedLabels.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SelectInputWithReducedLabels.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"input\"},[(_vm.renderMultipleSelect(_vm.setting.type))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key,\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},_vm._l((_vm.options(_vm.setting.suggestions)),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option.value,\"label\":option.label}})}),1):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'module' || (_vm.setting.type.includes('atom') && _vm.setting.type.includes('dropdown')))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"clearable\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},_vm._l((_vm.options(_vm.setting.suggestions)),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option.value,\"label\":option.label}})}),1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Inputs.vue?vue&type=template&id=7d6d777c&\"\nimport script from \"./Inputs.vue?vue&type=script&lang=js&\"\nexport * from \"./Inputs.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Inputs.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Inputs.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"input-container\"},[(_vm.setting.type === 'keyword')?_c('div',{staticClass:\"keyword-container\"},[_c('el-form-item',{class:_vm.labelClass,style:((\"margin-left:\" + _vm.margin + \"px;margin-bottom:0\")),attrs:{\"label-width\":_vm.customLabelWidth,\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('span',{attrs:{\"slot\":\"label\"},slot:\"label\"},[_vm._v(\"\\n \"+_vm._s(_vm.setting.label)+\"\\n \"),(_vm.canBeDeleted && _vm.isDesktop)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"delete-setting-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":_vm.removeSetting}})],1):_vm._e()],1)]),_vm._v(\" \"),_vm._l((_vm.setting.children),function(subSetting){return _c('el-form-item',{key:subSetting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting-parent\":_vm.settingParent.concat( [subSetting]),\"setting\":subSetting,\"data\":_vm.data[_vm.setting.key],\"custom-label-width\":_vm.isMobile ? '100px' : '120px',\"label-class\":subSetting.type === 'keyword' ? 'center-label' : '',\"margin\":_vm.isDesktop ? _vm.margin + 15 : _vm.margin + 8,\"nested\":true}})],1)})],2):_vm._e(),_vm._v(\" \"),(_vm.setting.type !== 'keyword')?_c('el-form-item',{class:_vm.labelClass,style:(_vm.isDesktop ? '' : (\"margin-left:\" + _vm.margin + \"px\")),attrs:{\"label-width\":_vm.customLabelWidth}},[_c('span',{attrs:{\"slot\":\"label\"},slot:\"label\"},[_vm._v(\"\\n \"+_vm._s(_vm.setting.label)+\"\\n \"),(_vm.canBeDeleted && (_vm.isDesktop || _vm.isMobile))?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"delete-setting-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":_vm.removeSetting}})],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"input-row\"},[(_vm.setting.type === 'string' || (_vm.setting.type.includes('string') && _vm.setting.type.includes('atom')))?_c('el-input',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"placeholder\":_vm.setting.suggestions ? _vm.setting.suggestions[0] : null,\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"input\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'boolean' && ![':registrations_open', ':invites_enabled'].includes(_vm.setting.key))?_c('el-switch',{staticClass:\"switch-input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'integer')?_c('el-input-number',{attrs:{\"value\":_vm.inputValue === null ? undefined : _vm.inputValue,\"placeholder\":_vm.setting.suggestions ? _vm.setting.suggestions[0].toString() : null,\"min\":0,\"size\":_vm.isDesktop ? 'large' : 'medium',\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(!_vm.reducedSelects && (_vm.setting.type === 'module' || (_vm.setting.type.includes('atom') && _vm.setting.type.includes('dropdown'))))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue === false ? 'false' : _vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"clearable\":\"\"},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}},_vm._l((_vm.setting.suggestions),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option}})}),1):_vm._e(),_vm._v(\" \"),(!_vm.reducedSelects && _vm.renderMultipleSelect(_vm.setting.type))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}},_vm._l((_vm.setting.suggestions),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option}})}),1):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':ip')?_c('el-input',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"placeholder\":\"xxx.xxx.xxx.xx\"},on:{\"input\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'atom')?_c('el-input',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"placeholder\":_vm.setting.suggestions[0] ? _vm.setting.suggestions[0].substr(1) : '',\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"input\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}},[_c('template',{slot:\"prepend\"},[_vm._v(\":\")])],2):_vm._e(),_vm._v(\" \"),(_vm.settingGroup.group === ':auto_linker')?_c('auto-linker-input',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':crontab')?_c('crontab-input',{attrs:{\"data\":_vm.data[_vm.setting.key],\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.editableKeyword(_vm.setting.key, _vm.setting.type))?_c('editable-keyword-input',{attrs:{\"data\":_vm.keywordData,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':icons')?_c('icons-input',{attrs:{\"data\":_vm.iconsData,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':mascots')?_c('mascots-input',{attrs:{\"data\":_vm.keywordData,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':backends' || _vm.setting.key === ':args')?_c('multiple-select',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':proxy_url')?_c('proxy-url-input',{attrs:{\"data\":_vm.data[_vm.setting.key],\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting,\"parents\":_vm.settingParent}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':prune')?_c('prune-input',{attrs:{\"data\":_vm.data[_vm.setting.key],\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.settingGroup.key === ':rate_limit')?_c('rate-limit-input',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),([':registrations_open', ':invites_enabled'].includes(_vm.setting.key))?_c('reg-invites-input',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.reducedSelects)?_c('select-input-with-reduced-labels',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.canBeDeleted && _vm.isTablet)?_c('el-tooltip',{staticClass:\"delete-setting-button-container\",attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"delete-setting-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":_vm.removeSetting}})],1):_vm._e()],1),_vm._v(\" \"),(_vm.setting.description && _vm.setting.type !== 'keyword')?_c('div',{staticClass:\"expl\",domProps:{\"innerHTML\":_vm._s(_vm.getFormattedDescription(_vm.setting.description))}}):_vm._e()]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Setting.vue?vue&type=template&id=57a1e8aa&\"\nimport script from \"./Setting.vue?vue&type=script&lang=js&\"\nexport * from \"./Setting.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Setting.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Setting.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',[(_vm.settingGroup.description)?_c('el-form-item',{staticClass:\"description-container\",attrs:{\"data-search\":_vm.settingGroup.key || _vm.settingGroup.group}},[_c('span',{staticClass:\"description\",domProps:{\"innerHTML\":_vm._s(_vm.getFormattedDescription(_vm.settingGroup.description))}})]):_vm._e(),_vm._v(\" \"),(_vm.settingGroup.key === 'Pleroma.Emails.Mailer')?_c('div',[_vm._l((_vm.settingGroup.children.filter(function (setting) { return !setting.group; })),function(setting){return _c('div',{key:setting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data}})],1)}),_vm._v(\" \"),_vm._l((_vm.emailAdapterChildren),function(setting){return _c('div',{key:setting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data}})],1)})],2):_c('div',_vm._l((_vm.settingGroup.children),function(setting){return _c('div',{key:setting.key},[(!_vm.compound(setting))?_c('div',[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data,\"nested\":false}})],1):_vm._e(),_vm._v(\" \"),(_vm.compound(setting))?_c('div',[(_vm.divideSetting(setting.key))?_c('el-divider',{staticClass:\"divider\"}):_vm._e(),_vm._v(\" \"),(!setting.children)?_c('div',[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data[setting.key],\"nested\":true}})],1):_c('div',[_c('div',{staticClass:\"input-container\"},[_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":setting.key || setting.group}},[_c('span',{attrs:{\"slot\":\"label\"},slot:\"label\"},[(_vm.isDesktop && _vm.canBeDeleted(setting.key))?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticStyle:{\"margin-left\":\"5px\"},attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":function($event){return _vm.removeSetting(setting.key)}}})],1):_vm._e()],1),_vm._v(\" \"),_c('span',{staticClass:\"label-font\"},[_vm._v(_vm._s(setting.label))]),_vm._v(\" \"),(_vm.canBeDeleted(setting.key) && (_vm.isMobile || _vm.isTablet))?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"settings-delete-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":function($event){return _vm.removeSetting(setting.key)}}})],1):_vm._e()],1)],1),_vm._v(\" \"),_vm._l((setting.children),function(subSetting){return _c('div',{key:subSetting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting-parent\":[setting, subSetting],\"setting\":subSetting,\"data\":_vm.data[setting.key],\"nested\":true}})],1)})],2),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"})],1):_vm._e()])}),0)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ActivityPub.vue?vue&type=template&id=5017259b&\"\nimport script from \"./ActivityPub.vue?vue&type=script&lang=js&\"\nexport * from \"./ActivityPub.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ActivityPub.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ActivityPub.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"activitypubData\",attrs:{\"model\":_vm.activitypubData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth,\"data-search\":\":activitypub\"}},[_c('setting',{attrs:{\"setting-group\":_vm.activitypub,\"data\":_vm.activitypubData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"userData\",attrs:{\"model\":_vm.userData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth,\"data-search\":\":user\"}},[_c('setting',{attrs:{\"setting-group\":_vm.user,\"data\":_vm.userData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Authentication.vue?vue&type=template&id=87d4fd88&\"\nimport script from \"./Authentication.vue?vue&type=script&lang=js&\"\nexport * from \"./Authentication.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Authentication.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Authentication.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"pleromaAuthenticatorData\",attrs:{\"model\":_vm.pleromaAuthenticatorData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.pleromaAuthenticator,\"data\":_vm.pleromaAuthenticatorData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"authData\",attrs:{\"model\":_vm.authData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.auth,\"data\":_vm.authData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"ldapData\",attrs:{\"model\":_vm.ldapData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.ldap,\"data\":_vm.ldapData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"oauth2\",attrs:{\"model\":_vm.oauth2Data,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.oauth2,\"data\":_vm.oauth2Data}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./AutoLinker.vue?vue&type=template&id=11b09d35&\"\nimport script from \"./AutoLinker.vue?vue&type=script&lang=js&\"\nexport * from \"./AutoLinker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AutoLinker.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"AutoLinker.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"autoLinker\",attrs:{\"model\":_vm.autoLinkerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.autoLinker,\"data\":_vm.autoLinkerData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Captcha.vue?vue&type=template&id=2ff28998&\"\nimport script from \"./Captcha.vue?vue&type=script&lang=js&\"\nexport * from \"./Captcha.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Captcha.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Captcha.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"captchaData\",attrs:{\"model\":_vm.captchaData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.captcha,\"data\":_vm.captchaData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"kocaptchaData\",attrs:{\"model\":_vm.kocaptchaData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.kocaptcha,\"data\":_vm.kocaptchaData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Esshd.vue?vue&type=template&id=12ea7477&\"\nimport script from \"./Esshd.vue?vue&type=script&lang=js&\"\nexport * from \"./Esshd.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Esshd.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Esshd.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"esshdData\",attrs:{\"model\":_vm.esshdData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.esshd,\"data\":_vm.esshdData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Frontend.vue?vue&type=template&id=6c7c2bf3&\"\nimport script from \"./Frontend.vue?vue&type=script&lang=js&\"\nexport * from \"./Frontend.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Frontend.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Frontend.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"frontendData\",attrs:{\"model\":_vm.frontendData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.frontend,\"data\":_vm.frontendData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"staticFeData\",attrs:{\"model\":_vm.staticFeData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.staticFe,\"data\":_vm.staticFeData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"assetsData\",attrs:{\"model\":_vm.assetsData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('el-form-item',{staticClass:\"grouped-settings-header\"},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.assets')))])]),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.assets,\"data\":_vm.assetsData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"emojiData\",attrs:{\"model\":_vm.emojiData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":\":emoji\"}},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.emoji')))])]),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.emoji,\"data\":_vm.emojiData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"chatData\",attrs:{\"model\":_vm.chatData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.chat,\"data\":_vm.chatData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"markupData\",attrs:{\"model\":_vm.markupData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":\":markup\"}},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.markup')))])]),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.markup,\"data\":_vm.markupData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Gopher.vue?vue&type=template&id=15ee83b0&\"\nimport script from \"./Gopher.vue?vue&type=script&lang=js&\"\nexport * from \"./Gopher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Gopher.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Gopher.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"gopher\",attrs:{\"model\":_vm.gopherData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.gopher,\"data\":_vm.gopherData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Http.vue?vue&type=template&id=1f9a1ea2&\"\nimport script from \"./Http.vue?vue&type=script&lang=js&\"\nexport * from \"./Http.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Http.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Http.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"httpData\",attrs:{\"model\":_vm.httpData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.http,\"data\":_vm.httpData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"corsPlugData\",attrs:{\"model\":_vm.corsPlugData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":\":cors_plug\"}},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.corsPlug')))])]),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.corsPlug,\"data\":_vm.corsPlugData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"httpSignatures\",attrs:{\"model\":_vm.httpSignaturesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.httpSignatures,\"data\":_vm.httpSignaturesData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"httpSecurityData\",attrs:{\"model\":_vm.httpSecurityData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.httpSecurity,\"data\":_vm.httpSecurityData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"webCacheTtl\",attrs:{\"model\":_vm.webCacheTtlData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.webCacheTtl,\"data\":_vm.webCacheTtlData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Instance.vue?vue&type=template&id=4fae3562&\"\nimport script from \"./Instance.vue?vue&type=script&lang=js&\"\nexport * from \"./Instance.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Instance.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Instance.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"instanceData\",attrs:{\"model\":_vm.instanceData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.instance,\"data\":_vm.instanceData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"adminToken\",attrs:{\"model\":_vm.adminTokenData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.adminToken,\"data\":_vm.adminTokenData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"scheduledActivity\",attrs:{\"model\":_vm.scheduledActivityData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.scheduledActivity,\"data\":_vm.scheduledActivityData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"manifest\",attrs:{\"model\":_vm.manifestData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.manifest,\"data\":_vm.manifestData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"pleromaUser\",attrs:{\"model\":_vm.pleromaUserData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth,\"data-search\":\"Pleroma.User\"}},[_c('setting',{attrs:{\"setting-group\":_vm.pleromaUser,\"data\":_vm.pleromaUserData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"uriSchemes\",attrs:{\"model\":_vm.uriSchemesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uriSchemes,\"data\":_vm.uriSchemesData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"feed\",attrs:{\"model\":_vm.feedData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.feed,\"data\":_vm.feedData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"streamer\",attrs:{\"model\":_vm.streamerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.streamer,\"data\":_vm.streamerData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./JobQueue.vue?vue&type=template&id=363820de&\"\nimport script from \"./JobQueue.vue?vue&type=script&lang=js&\"\nexport * from \"./JobQueue.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JobQueue.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"JobQueue.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"obanQueuesData\",attrs:{\"model\":_vm.obanQueuesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.obanQueues,\"data\":_vm.obanQueuesData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"workersData\",attrs:{\"model\":_vm.workersData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.workers,\"data\":_vm.workersData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"activityExpiration\",attrs:{\"model\":_vm.activityExpirationData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.activityExpiration,\"data\":_vm.activityExpirationData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Logger.vue?vue&type=template&id=772cfe89&\"\nimport script from \"./Logger.vue?vue&type=script&lang=js&\"\nexport * from \"./Logger.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Logger.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Logger.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"loggerData\",attrs:{\"model\":_vm.loggerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.logger,\"data\":_vm.loggerData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"consoleData\",attrs:{\"model\":_vm.consoleData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.console,\"data\":_vm.consoleData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"exsysloggerData\",attrs:{\"model\":_vm.exsysloggerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.exsyslogger,\"data\":_vm.exsysloggerData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"quackData\",attrs:{\"model\":_vm.quackData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.quack,\"data\":_vm.quackData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Mailer.vue?vue&type=template&id=296c8d38&\"\nimport script from \"./Mailer.vue?vue&type=script&lang=js&\"\nexport * from \"./Mailer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Mailer.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Mailer.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"mailer\",attrs:{\"model\":_vm.mailerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mailer,\"data\":_vm.mailerData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"swoosh\",attrs:{\"model\":_vm.swooshData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.swoosh,\"data\":_vm.swooshData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"emailNotifications\",attrs:{\"model\":_vm.emailNotificationsData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.emailNotifications,\"data\":_vm.emailNotificationsData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"userEmail\",attrs:{\"model\":_vm.userEmailData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.userEmail,\"data\":_vm.userEmailData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"newUsersDigestEmail\",attrs:{\"model\":_vm.newUsersDigestEmailData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.newUsersDigestEmail,\"data\":_vm.newUsersDigestEmailData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MediaProxy.vue?vue&type=template&id=1f81eb24&\"\nimport script from \"./MediaProxy.vue?vue&type=script&lang=js&\"\nexport * from \"./MediaProxy.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MediaProxy.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"MediaProxy.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"mediaProxy\",attrs:{\"model\":_vm.mediaProxyData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mediaProxy,\"data\":_vm.mediaProxyData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Metadata.vue?vue&type=template&id=626ea4e0&\"\nimport script from \"./Metadata.vue?vue&type=script&lang=js&\"\nexport * from \"./Metadata.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Metadata.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Metadata.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"metadata\",attrs:{\"model\":_vm.metadataData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.metadata,\"data\":_vm.metadataData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"richMedia\",attrs:{\"model\":_vm.richMediaData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.richMedia,\"data\":_vm.richMediaData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MRF.vue?vue&type=template&id=93b94dbc&\"\nimport script from \"./MRF.vue?vue&type=script&lang=js&\"\nexport * from \"./MRF.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MRF.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"MRF.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"mrfSimple\",attrs:{\"model\":_vm.mrfSimpleData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfSimple,\"data\":_vm.mrfSimpleData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"mrfRejectnonpublic\",attrs:{\"model\":_vm.mrfRejectnonpublicData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfRejectnonpublic,\"data\":_vm.mrfRejectnonpublicData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"mrfHellthread\",attrs:{\"model\":_vm.mrfHellthreadData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfHellthread,\"data\":_vm.mrfHellthreadData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"mrfKeyword\",attrs:{\"model\":_vm.mrfKeywordData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfKeyword,\"data\":_vm.mrfKeywordData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"mrfSubchain\",attrs:{\"model\":_vm.mrfSubchainData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfSubchain,\"data\":_vm.mrfSubchainData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"mrfMention\",attrs:{\"model\":_vm.mrfMentionData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfMention,\"data\":_vm.mrfMentionData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"mrfNormalizeMarkup\",attrs:{\"model\":_vm.mrfNormalizeMarkupData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfNormalizeMarkup,\"data\":_vm.mrfNormalizeMarkupData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"mrfVocabulary\",attrs:{\"model\":_vm.mrfVocabularyData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfVocabulary,\"data\":_vm.mrfVocabularyData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"mrfObjectAge\",attrs:{\"model\":_vm.mrfObjectAgeData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfObjectAge,\"data\":_vm.mrfObjectAgeData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"modules\",attrs:{\"model\":_vm.modulesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.modules,\"data\":_vm.modulesData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Other.vue?vue&type=template&id=529a22f4&\"\nimport script from \"./Other.vue?vue&type=script&lang=js&\"\nexport * from \"./Other.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Other.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Other.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"mimeTypes\",attrs:{\"model\":_vm.mimeTypesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mimeTypes,\"data\":_vm.mimeTypesData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"remoteIp\",attrs:{\"model\":_vm.remoteIpData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.remoteIp,\"data\":_vm.remoteIpData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RateLimiters.vue?vue&type=template&id=342424ac&\"\nimport script from \"./RateLimiters.vue?vue&type=script&lang=js&\"\nexport * from \"./RateLimiters.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RateLimiters.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RateLimiters.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"rateLimiters\",attrs:{\"model\":_vm.rateLimitersData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.rateLimiters,\"data\":_vm.rateLimitersData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Relays.vue?vue&type=template&id=74b90396&\"\nimport script from \"./Relays.vue?vue&type=script&lang=js&\"\nexport * from \"./Relays.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Relays.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Relays.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"relays-container\"},[_c('div',{staticClass:\"follow-relay-container\"},[_c('el-input',{staticClass:\"follow-relay\",attrs:{\"placeholder\":_vm.$t('settings.followRelay')},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.followRelay($event)}},model:{value:(_vm.newRelay),callback:function ($$v) {_vm.newRelay=$$v},expression:\"newRelay\"}}),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},nativeOn:{\"click\":function($event){return _vm.followRelay($event)}}},[_vm._v(_vm._s(_vm.$t('settings.follow')))])],1),_vm._v(\" \"),_c('el-table',{attrs:{\"data\":_vm.relaysTable}},[_c('el-table-column',{attrs:{\"label\":_vm.$t('settings.instanceUrl'),\"prop\":\"instance\"}}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"fixed\":\"right\",\"width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},nativeOn:{\"click\":function($event){return _vm.deleteRelay(scope.row.instance)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('table.delete'))+\"\\n \")])]}}],null,false,2132974932)})],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Upload.vue?vue&type=template&id=ce2aee72&\"\nimport script from \"./Upload.vue?vue&type=script&lang=js&\"\nexport * from \"./Upload.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Upload.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Upload.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"uploadData\",attrs:{\"model\":_vm.uploadData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.upload,\"data\":_vm.uploadData}})],1),_vm._v(\" \"),(_vm.showUploadersLocal)?_c('el-form',{ref:\"uploadersLocal\",attrs:{\"model\":_vm.uploadersLocalData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('el-form-item',{staticClass:\"grouped-settings-header\"},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(\"Pleroma.Uploaders.Local\")])]),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.uploadersLocal,\"data\":_vm.uploadersLocalData}}),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"})],1):_vm._e(),_vm._v(\" \"),(_vm.showUploadersS3)?_c('el-form',{ref:\"uploadersS3\",attrs:{\"model\":_vm.uploadersS3Data,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uploadersS3,\"data\":_vm.uploadersS3Data}}),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"})],1):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"uploadFilterMogrify\",attrs:{\"model\":_vm.uploadFilterMogrifyData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uploadFilterMogrify,\"data\":_vm.uploadFilterMogrifyData}})],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider thick-line\"}),_vm._v(\" \"),_c('el-form',{ref:\"uploadAnonymizeFilename\",attrs:{\"model\":_vm.uploadAnonymizeFilenameData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uploadAnonymizeFilename,\"data\":_vm.uploadAnonymizeFilenameData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./WebPush.vue?vue&type=template&id=126c753f&\"\nimport script from \"./WebPush.vue?vue&type=script&lang=js&\"\nexport * from \"./WebPush.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WebPush.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"WebPush.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"vapidDetailsData\",attrs:{\"model\":_vm.vapidDetailsData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.vapidDetails,\"data\":_vm.vapidDetailsData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=667428a6&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=667428a6&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"667428a6\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=667428a6&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=667428a6&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\""],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-43ca.3debeff7.js b/priv/static/adminfe/static/js/chunk-43ca.3debeff7.js new file mode 100644 index 000000000..6d653cf62 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-43ca.3debeff7.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-43ca"],{"+2nY":function(t,e,i){"use strict";var s=i("ld6V");i.n(s).a},"+qaP":function(t,e,i){"use strict";var s=i("60OA");i.n(s).a},"0ods":function(t,e,i){},"2q6O":function(t,e,i){"use strict";var s=i("Scsy");i.n(s).a},"3IoU":function(t,e,i){"use strict";var s=i("6V7o");i.n(s).a},"4NUT":function(t,e,i){},"4b9x":function(t,e,i){"use strict";var s=i("wgcy");i.n(s).a},"60OA":function(t,e,i){},"6V7o":function(t,e,i){},"77pt":function(t,e,i){},"9Hof":function(t,e,i){"use strict";var s=i("ncj/");i.n(s).a},"9p49":function(t,e,i){},DPt0:function(t,e,i){"use strict";var s=i("x6RV");i.n(s).a},Ezi3:function(t,e,i){"use strict";var s=i("MNl6");i.n(s).a},FCne:function(t,e,i){"use strict";var s=i("OCuP");i.n(s).a},"J7+w":function(t,e,i){"use strict";var s=i("fyIw");i.n(s).a},JqY8:function(t,e,i){},KFE3:function(t,e,i){"use strict";var s=i("mSK5");i.n(s).a},LHUV:function(t,e,i){"use strict";var s=i("0ods");i.n(s).a},MNl6:function(t,e,i){},NiUD:function(t,e,i){},OCuP:function(t,e,i){},PYLh:function(t,e,i){},PjrB:function(t,e,i){},Px65:function(t,e,i){},PygS:function(t,e,i){"use strict";var s=i("TtMh");i.n(s).a},RSJF:function(t,e,i){},SFMd:function(t,e,i){"use strict";var s=i("PjrB");i.n(s).a},Scsy:function(t,e,i){},TOIk:function(t,e,i){},TRR9:function(t,e,i){},TtMh:function(t,e,i){},TudB:function(t,e,i){},"UbP/":function(t,e,i){},UdS4:function(t,e,i){"use strict";var s=i("WwJU");i.n(s).a},UqcT:function(t,e,i){"use strict";var s=i("RSJF");i.n(s).a},UtFC:function(t,e,i){},"WvM+":function(t,e,i){"use strict";var s=i("TRR9");i.n(s).a},WwJU:function(t,e,i){},YKHE:function(t,e,i){},YcIK:function(t,e,i){"use strict";i.r(e);var s=i("o0o1"),n=i.n(s),a=i("yXPU"),r=i.n(a),o=i("mSNy"),l={"activity-pub":{label:"settings.activityPub",settings:[":activitypub",":user"]},authentication:{label:"settings.auth",settings:[":auth",":ldap",":oauth2","Pleroma.Web.Auth.Authenticator"]},"auto-linker":{label:"settings.autoLinker",settings:[":opts"]},esshd:{label:"settings.esshd",settings:[":esshd"]},captcha:{label:"settings.captcha",settings:["Pleroma.Captcha","Pleroma.Captcha.Kocaptcha"]},frontend:{label:"settings.frontend",settings:[":assets",":chat",":emoji",":frontend_configurations",":markup",":static_fe"]},gopher:{label:"settings.gopher",settings:[":gopher"]},http:{label:"settings.http",settings:[":cors_plug",":http",":http_security",":web_cache_ttl"]},instance:{label:"settings.instance",settings:[":admin_token",":instance",":manifest","Pleroma.User","Pleroma.ScheduledActivity",":uri_schemes",":feed",":streamer"]},"job-queue":{label:"settings.jobQueue",settings:["Pleroma.ActivityExpiration","Oban",":workers"]},logger:{label:"settings.logger",settings:[":console",":ex_syslogger",":quack",":logger"]},mailer:{label:"settings.mailer",settings:[":email_notifications","Pleroma.Emails.Mailer","Pleroma.Emails.UserEmail",":swoosh","Pleroma.Emails.NewUsersDigestEmail"]},"media-proxy":{label:"settings.mediaProxy",settings:[":media_proxy"]},metadata:{label:"settings.metadata",settings:["Pleroma.Web.Metadata",":rich_media"]},mrf:{label:"settings.mrf",settings:[":mrf_simple",":mrf_rejectnonpublic",":mrf_hellthread",":mrf_keyword",":mrf_subchain",":mrf_mention",":mrf_normalize_markup",":mrf_vocabulary",":mrf_object_age",":modules"]},"rate-limiters":{label:"settings.rateLimiters",settings:[":rate_limit"]},relays:{label:"settings.relays",settings:["relays"]},"web-push":{label:"settings.webPush",settings:[":vapid_details"]},upload:{label:"settings.upload",settings:["Pleroma.Upload.Filter.AnonymizeFilename","Pleroma.Upload.Filter.Mogrify","Pleroma.Uploaders.S3","Pleroma.Uploaders.Local","Pleroma.Upload"]},other:{label:"settings.other",settings:[":mime","Pleroma.Plugs.RemoteIp"]}},u=i("MVZn"),c=i.n(u),p=i("L2JU"),d=i("lSNA"),g=i.n(d),h={name:"AutoLinkerInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},methods:{autoLinkerBooleanValue:function(t){var e=this.data[this.setting.key];return"string"==typeof e||"number"==typeof e},autoLinkerIntegerValue:function(t){return this.data[this.setting.key]||0},autoLinkerStringValue:function(t){return this.data[this.setting.key]||""},processTwoTypeValue:function(t,e){if(!0===t){var i=":truncate"===e?0:"";this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,e,this.setting.type)}else this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,e,this.setting.type)},updateSetting:function(t,e,i,s,n){this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},m=(i("LHUV"),i("KHd+")),f=Object(m.a)(h,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[":class"===t.setting.key||":rel"===t.setting.key?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-switch",{attrs:{value:t.autoLinkerBooleanValue(t.setting.key)},on:{change:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}),t._v(" "),t.autoLinkerBooleanValue(t.setting.key)?i("el-input",{attrs:{value:t.autoLinkerStringValue(t.setting.key)},on:{input:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}):t._e()],1):t._e(),t._v(" "),":truncate"===t.setting.key?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-switch",{attrs:{value:t.autoLinkerBooleanValue(t.setting.key)},on:{change:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}),t._v(" "),t.autoLinkerBooleanValue(t.setting.key)?i("el-input-number",{attrs:{value:t.autoLinkerIntegerValue(t.setting.key)},on:{input:function(e){return t.processTwoTypeValue(e,t.setting.key)}}}):t._e()],1):t._e()])},[],!1,null,null,null);f.options.__file="AutoLinkerInput.vue";var b=f.exports,v=i("RIqP"),y=i.n(v),_={name:"EditableKeywordInput",props:{data:{type:Array,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{editableKeywordWithInteger:function(){return Array.isArray(this.setting.type)&&this.setting.type.includes("keyword")&&this.setting.type.includes("integer")},isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{addRowToEditableKeyword:function(){var t=[].concat(y()(this.data),[{"":{value:"",id:this.generateID()}}]);this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},deleteEditableKeywordRow:function(t){var e=this.getId(t),i=this.data.filter(function(t){return Object.values(t)[0].id!==e});this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},generateID:function(){return"f".concat((~~(1e8*Math.random())).toString(16))},getKey:function(t){return Object.keys(t)[0]},getId:function(t){return Object.values(t)[0].id},getValue:function(t){return Object.values(t)[0].value},parseEditableKeyword:function(t,e,i){var s=this,n=this.getId(i),a=this.data.map(function(i,a){return Object.values(i)[0].id===n?"key"===e?g()({},t,Object.values(s.data[a])[0]):g()({},Object.keys(i)[0],c()({},Object.values(s.data[a])[0],{value:t})):i});this.updateSetting(a,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=this.wrapUpdatedSettings(t,s,n);this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})},wrapUpdatedSettings:function(t,e,i){return"map"===i?t.reduce(function(t,e){return c()({},t,g()({},Object.keys(e)[0],Object.values(e)[0].value))},{}):t.reduce(function(t,e){return c()({},t,g()({},Object.keys(e)[0],["list",Object.values(e)[0].value]))},{})}}},k=(i("nKzF"),Object(m.a)(_,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"editable-keyword-container"},[":replace"===t.setting.key?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"setting-input"},[i("el-input",{staticClass:"name-input",attrs:{value:t.getKey(e),placeholder:"pattern"},on:{input:function(i){return t.parseEditableKeyword(i,"key",e)}}}),t._v(" :\n "),i("el-input",{staticClass:"value-input",attrs:{value:t.getValue(e),placeholder:"replacement"},on:{input:function(i){return t.parseEditableKeyword(i,"value",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteEditableKeywordRow(e)}}})],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToEditableKeyword}})],2):t.editableKeywordWithInteger?i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"setting-input"},[i("el-input",{staticClass:"name-input",attrs:{value:t.getKey(e),placeholder:"key"},on:{input:function(i){return t.parseEditableKeyword(i,"key",e)}}}),t._v(" :\n "),i("el-input-number",{staticClass:"value-input",attrs:{value:t.getValue(e),min:0,size:"large"},on:{change:function(i){return t.parseEditableKeyword(i,"value",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteEditableKeywordRow(e)}}})],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToEditableKeyword}})],2):i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"setting-input"},[i("el-input",{staticClass:"name-input",attrs:{value:t.getKey(e),placeholder:"key"},on:{input:function(i){return t.parseEditableKeyword(i,"key",e)}}}),t._v(" :\n "),i("el-select",{staticClass:"value-input",attrs:{value:t.getValue(e),multiple:"",filterable:"","allow-create":""},on:{change:function(i){return t.parseEditableKeyword(i,"value",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteEditableKeywordRow(e)}}})],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToEditableKeyword}})],2)])},[],!1,null,null,null));k.options.__file="EditableKeywordInput.vue";var S=k.exports,D={name:"CrontabInput",props:{data:{type:Object,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"100%":"380px"},workers:function(){return this.setting.suggestions.map(function(t){return t[1]})}},methods:{getSuggestion:function(t){return this.setting.suggestions.find(function(e){return e[1]===t})[0]},update:function(t,e){var i=this.$store.state.settings.settings[this.settingGroup.group][this.settingGroup.key][this.setting.key],s=c()({},i,g()({},e,t)),n=Object.keys(i).reduce(function(s,n){return n===e?c()({},s,g()({},n,["reversed_tuple",t])):c()({},s,g()({},n,["reversed_tuple",i[n]]))},{});this.$store.dispatch("UpdateSettings",{group:this.settingGroup.group,key:this.settingGroup.key,input:this.setting.key,value:n,type:this.setting.type}),this.$store.dispatch("UpdateState",{group:this.settingGroup.group,key:this.settingGroup.key,input:this.setting.key,value:s})}}},w=(i("mstB"),Object(m.a)(D,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("el-form",{staticClass:"crontab",attrs:{"label-width":t.labelWidth,"label-position":t.isMobile?"top":"right"}},t._l(t.workers,function(e){return i("el-form-item",{key:e,staticClass:"crontab-container",attrs:{label:e,"data-search":t.setting.key}},[i("el-input",{staticClass:"input setting-input",attrs:{value:t.data[e],placeholder:t.getSuggestion(e)||null},on:{input:function(i){return t.update(i,e)}}})],1)}),1)},[],!1,null,null,null));w.options.__file="CrontabInput.vue";var x=w.exports,C={name:"EditableKeywordInput",props:{data:{type:Array,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{addIconToIcons:function(){var t=[].concat(y()(this.data),[[{key:"",value:"",id:this.generateID()}]]);this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},addValueToIcons:function(t){var e=this,i=this.data.map(function(i,s){return s===t?[].concat(y()(i),[{key:"",value:"",id:e.generateID()}]):i});this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},deleteIcondRow:function(t){var e=this.data.filter(function(e,i){return i!==t});this.updateSetting(e,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},generateID:function(){return"f".concat((~~(1e8*Math.random())).toString(16))},parseIcons:function(t,e,i,s){var n=this.data.map(function(n,a){return a===i?n.map(function(i){return i.id===s?"key"===e?c()({},i,{key:t}):c()({},i,{value:t}):i}):n});this.updateSetting(n,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.map(function(t){return t.reduce(function(t,e){var i=e.key,s=e.value;return c()({},t,g()({},i,s))},{})},{});this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},$=(i("rdar"),Object(m.a)(C,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"mascot-container",attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e,s){return i("div",{key:s,staticClass:"mascot"},[i("div",{staticClass:"icons-container"},[i("div",{staticClass:"icon-container"},t._l(e,function(e){var n=e.key,a=e.value,r=e.id;return i("div",{key:r,staticClass:"icon-values-container"},[i("el-input",{staticClass:"icon-key-input",attrs:{value:n,placeholder:"key"},on:{input:function(e){return t.parseIcons(e,"key",s,r)}}}),t._v(" :\n "),i("el-input",{staticClass:"icon-value-input",attrs:{value:a,placeholder:"value"},on:{input:function(e){return t.parseIcons(e,"value",s,r)}}})],1)}),0),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(e){return t.deleteIcondRow(s)}}})],1),t._v(" "),i("div",{staticClass:"icons-button-container"},[i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:function(e){return t.addValueToIcons(s)}}}),t._v(" "),i("span",{staticClass:"icons-button-desc"},[t._v("Add another `key - value` pair to this icon")])],1),t._v(" "),i("el-divider",{staticClass:"divider"})],1)}),t._v(" "),i("div",{staticClass:"icons-button-container"},[i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addIconToIcons}}),t._v(" "),i("span",{staticClass:"icons-button-desc"},[t._v("Add another icon configuration")])],1)],2)},[],!1,null,null,null));$.options.__file="IconsInput.vue";var P=$.exports,O=i("QILm"),U=i.n(O),M=i("J4zp"),j=i.n(M),T={name:"MascotsInput",props:{data:{type:Array,default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{addRowToMascots:function(){var t=[].concat(y()(this.data),[{"":{":url":"",":mime_type":"",id:this.generateID()}}]);this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},deleteMascotsRow:function(t){var e=this.getId(t),i=this.data.filter(function(t){return Object.values(t)[0].id!==e});this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},generateID:function(){return"f".concat((~~(1e8*Math.random())).toString(16))},getId:function(t){return Object.values(t)[0].id},getName:function(t){return Object.keys(t)[0]},getUrl:function(t){var e=Object.values(t);return j()(e,1)[0][":url"]},getMimeType:function(t){var e=Object.values(t);return j()(e,1)[0][":mime_type"]},parseMascots:function(t,e,i){var s=this,n=this.getId(i),a=this.data.map(function(i,a){return Object.values(i)[0].id===n?"name"===e?g()({},t,Object.values(s.data[a])[0]):"url"===e?g()({},Object.keys(i)[0],c()({},Object.values(s.data[a])[0],{":url":t})):g()({},Object.keys(i)[0],c()({},Object.values(s.data[a])[0],{":mime_type":t})):i});this.updateSetting(a,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.reduce(function(t,e){var i=Object.values(e)[0],s=(i.id,U()(i,["id"]));return c()({},t,g()({},Object.keys(e)[0],["",s]))},{});this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},A=(i("+2nY"),Object(m.a)(T,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"mascot-container",attrs:{"data-search":t.setting.key||t.setting.group}},[t._l(t.data,function(e){return i("div",{key:t.getId(e),staticClass:"mascot"},[i("el-form-item",{staticClass:"mascot-form-item",attrs:{label:"Name","label-width":"85px"}},[i("div",{staticClass:"mascot-name-container"},[i("el-input",{staticClass:"mascot-name-input",attrs:{value:t.getName(e),placeholder:"Name"},on:{input:function(i){return t.parseMascots(i,"name",e)}}}),t._v(" "),i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(i){return t.deleteMascotsRow(e)}}})],1)]),t._v(" "),i("el-form-item",{staticClass:"mascot-form-item",attrs:{label:"URL","label-width":"85px"}},[i("el-input",{staticClass:"mascot-input",attrs:{value:t.getUrl(e),placeholder:"URL"},on:{input:function(i){return t.parseMascots(i,"url",e)}}})],1),t._v(" "),i("el-form-item",{staticClass:"mascot-form-item",attrs:{label:"Mime type","label-width":"85px"}},[i("el-input",{staticClass:"mascot-input",attrs:{value:t.getMimeType(e),placeholder:"Mime type"},on:{input:function(i){return t.parseMascots(i,"mimeType",e)}}})],1)],1)}),t._v(" "),i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:t.addRowToMascots}})],2)},[],!1,null,null,null));A.options.__file="MascotsInput.vue";var G=A.exports,W=i("h74u"),L={name:"ProxyUrlInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}},parents:{type:Array,default:function(){return[]},required:!1}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},settings:function(){return this.$store.state.settings.settings},updatedSettings:function(){return this.$store.state.settings.updatedSettings},proxyUrlData:function(){return 0===Object.keys(this.data).length?{socks5:!1,host:null,port:null}:this.data}},methods:{updateProxyUrl:function(t,e){var i;i="socks5"===e?c()({},this.proxyUrlData,{socks5:t}):"host"===e?c()({},this.proxyUrlData,{host:t}):c()({},this.proxyUrlData,{port:t}),this.updateSetting(i,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.socks5?[":socks5",t.host,t.port]:"".concat(t.host,":").concat(t.port);if(this.parents.length>0){var r=Object(W.f)(t,a,e,i,this.parents.reverse(),this.settings,this.updatedSettings),o=r.valueForState,l=r.valueForUpdatedSettings,u=r.setting;this.$store.dispatch("UpdateSettings",{group:e,key:i,input:u.key,value:l,type:u.type}),this.$store.dispatch("UpdateState",{group:e,key:i,input:u.key,value:o})}else this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},E=(i("mGnP"),Object(m.a)(L,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"proxy-url-input",attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-input",{staticClass:"proxy-url-host-input",attrs:{value:t.proxyUrlData.host,placeholder:"host (e.g. localhost or 127.0.0.1)"},on:{input:function(e){return t.updateProxyUrl(e,"host")}}}),t._v(" "),t.isDesktop?i("span",[t._v(":")]):t._e(),t._v(" "),i("el-input",{staticClass:"proxy-url-value-input",attrs:{value:t.proxyUrlData.port,placeholder:"port (e.g 9020 or 3090)"},on:{input:function(e){return t.updateProxyUrl(e,"port")}}}),t._v(" "),i("div",{staticClass:"socks5-checkbox-container"},[i("el-checkbox",{attrs:{value:t.proxyUrlData.socks5},on:{change:function(e){return t.updateProxyUrl(e,"socks5")}}}),t._v(" "),i("span",{staticClass:"socks5-checkbox"},[t._v("Socks5")])],1)],1)},[],!1,null,null,null));E.options.__file="ProxyUrlInput.vue";var I=E.exports,R={name:"PruneInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{prune:{get:function(){return this.data[0]},set:function(t){this.updateRadioInput(t)}}},methods:{updateIntInput:function(t,e){this.updateSetting([e,t],this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)},updateSetting:function(t,e,i,s,n){var a=t.includes(":disabled")?":disabled":t;this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})},updateRadioInput:function(t){var e=":disabled"===t?[t]:[t,0];this.updateSetting(e,this.settingGroup.group,this.settingGroup.key,this.setting.key,this.setting.type)}}},F=(i("Ezi3"),Object(m.a)(R,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{attrs:{"data-search":t.setting.key||t.setting.group}},[i("el-radio-group",{staticClass:"prune-options",model:{value:t.prune,callback:function(e){t.prune=e},expression:"prune"}},[i("el-radio",{attrs:{label:":disabled"}},[t._v("Disabled")]),t._v(" "),i("el-radio",{attrs:{label:":maxlen"}},[t._v("Limit-based")]),t._v(" "),i("el-radio",{attrs:{label:":maxage"}},[t._v("Time-based")])],1),t._v(" "),":maxlen"===t.prune?i("el-form-item",{attrs:{label:"max length","label-width":"100","label-position":"left"}},[i("el-input-number",{staticClass:"top-margin",attrs:{value:t.data[1],min:0,placeholder:"1500",size:"large"},on:{change:function(e){return t.updateIntInput(e,":maxlen")}}})],1):t._e(),t._v(" "),":maxage"===t.prune?i("el-form-item",{attrs:{label:"max age","label-width":"100","label-position":"left"}},[i("el-input-number",{staticClass:"top-margin",attrs:{value:t.data[1],min:0,placeholder:"3600",size:"large"},on:{change:function(e){return t.updateIntInput(e,":maxage")}}})],1):t._e()],1)},[],!1,null,null,null));F.options.__file="PruneInput.vue";var K=F.exports,V={name:"RateLimitInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},rateLimitAllUsers:function(){return this.data[this.setting.key]?this.data[this.setting.key]:["",""]},rateLimitAuthUsers:function(){return!(!this.data[this.setting.key]||!Array.isArray(this.data[this.setting.key][0]))&&this.data[this.setting.key][1]},rateLimitUnauthUsers:function(){return!(!this.data[this.setting.key]||!Array.isArray(this.data[this.setting.key][1]))&&this.data[this.setting.key][0]}},methods:{parseRateLimiter:function(t,e,i,s,n){var a;"oneLimit"===s?a="scale"===i?[t,n[1]]:[n[0],t]:"unauthUsersLimit"===s?a="scale"===i?[[t,n[0][1]],[n[1][0],n[1][1]]]:[[n[0][0],t],[n[1][0],n[1][1]]]:"authUserslimit"===s&&(a="scale"===i?[[n[0][0],n[0][1]],[t,n[1][1]]]:[[n[0][0],n[0][1]],[n[1][0],t]]),this.updateSetting(a,this.settingGroup.group,this.settingGroup.key,e,this.setting.type)},toggleLimits:function(t,e){this.updateSetting(t,this.settingGroup.group,this.settingGroup.key,e)},updateSetting:function(t,e,i,s,n){var a=Array.isArray(t[0])?t.map(function(t){return{tuple:t}}):{tuple:t};this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},z=(i("irif"),Object(m.a)(V,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"rate-limit-container",attrs:{"data-search":t.setting.key||t.setting.group}},[t.rateLimitAuthUsers?t._e():i("div",[i("el-input",{staticClass:"scale-input",attrs:{value:t.rateLimitAllUsers[0],placeholder:"scale"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"scale","oneLimit",t.rateLimitAllUsers)}}}),t._v(" "),i("span",[t._v(":")]),t._v(" "),i("el-input",{staticClass:"limit-input",attrs:{value:t.rateLimitAllUsers[1],placeholder:"limit"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"limit","oneLimit",t.rateLimitAllUsers)}}}),t._v(" "),i("div",{staticClass:"limit-button-container"},[i("el-button",{attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-plus",circle:""},on:{click:function(e){return t.toggleLimits([["",""],["",""]],t.setting.key)}}}),t._v(" "),i("p",{staticClass:"expl limit-expl"},[t._v("Set different limits for unauthenticated and authenticated users")])],1)],1),t._v(" "),t.rateLimitAuthUsers?i("div",[i("el-form-item",{staticClass:"rate-limit"},[i("div",{staticClass:"rate-limit-label-container"},[i("span",{staticClass:"rate-limit-label"},[t._v("\n Unauthenticated users:\n ")])]),t._v(" "),i("div",{staticClass:"rate-limit-content"},[i("el-input",{staticClass:"scale-input",attrs:{value:t.rateLimitUnauthUsers[0],placeholder:"scale"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"scale","unauthUsersLimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}}),t._v(" "),i("span",[t._v(":")]),t._v(" "),i("el-input",{staticClass:"limit-input",attrs:{value:t.rateLimitUnauthUsers[1],placeholder:"limit"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"limit","unauthUsersLimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}})],1)]),t._v(" "),i("el-form-item",{staticClass:"rate-limit"},[i("div",{staticClass:"rate-limit-label-container"},[i("span",{staticClass:"rate-limit-label"},[t._v("\n Authenticated users:\n ")])]),t._v(" "),i("div",{staticClass:"rate-limit-content"},[i("el-input",{staticClass:"scale-input",attrs:{value:t.rateLimitAuthUsers[0],placeholder:"scale"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"scale","authUserslimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}}),t._v(" "),i("span",[t._v(":")]),t._v(" "),i("el-input",{staticClass:"limit-input",attrs:{value:t.rateLimitAuthUsers[1],placeholder:"limit"},on:{input:function(e){return t.parseRateLimiter(e,t.setting.key,"limit","authUserslimit",[t.rateLimitUnauthUsers,t.rateLimitAuthUsers])}}})],1)]),t._v(" "),i("div",{staticClass:"limit-button-container"},[i("el-button",{staticClass:"icon-minus-button",attrs:{size:t.isDesktop?"medium":"mini",icon:"el-icon-minus",circle:""},on:{click:function(e){return t.toggleLimits(["",""],t.setting.key)}}}),t._v(" "),i("p",{staticClass:"expl limit-expl"},[t._v("Set limit for all users")])],1)],1):t._e()])},[],!1,null,null,null));z.options.__file="RateLimitInput.vue";var q=z.exports,N={name:"RegInvitesInput",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},methods:{updateSetting:function(t,e,i,s,n){var a=this,r=this.$store.state.settings.settings[e][i][":registrations_open"],o=this.$store.state.settings.settings[e][i][":invites_enabled"];":registrations_open"===s&&t&&o?this.$confirm("Enabling this setting requires invites to be disabled. Are you sure you want to open registrations?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){a.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),a.$store.dispatch("UpdateSettings",{group:e,key:i,input:":invites_enabled",value:!1,type:n}),a.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t}),a.$store.dispatch("UpdateState",{group:e,key:i,input:":invites_enabled",value:!1})}):":invites_enabled"===s&&t&&r?this.$confirm("Enabling this setting requires registrations to be disabled. Are you sure you want to enable invitations?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){a.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),a.$store.dispatch("UpdateSettings",{group:e,key:i,input:":registrations_open",value:!1,type:n}),a.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t}),a.$store.dispatch("UpdateState",{group:e,key:i,input:":registrations_open",value:!1})}):(this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t}))}}},B=(i("9Hof"),Object(m.a)(N,function(){var t=this,e=t.$createElement;return(t._self._c||e)("el-switch",{staticClass:"switch-input",attrs:{value:t.data[t.setting.key],"data-search":t.setting.key},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}})},[],!1,null,null,null));B.options.__file="RegInvitesInput.vue";var H=B.exports,Q={name:"SelectInputWithReducedLabels",props:{data:{type:[Array,Object],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},computed:{inputValue:function(){return"Pleroma.Web.Auth.Authenticator"===this.setting.key?this.data.value:":rewrite_policy"===this.setting.key&&"string"==typeof this.data[this.setting.key]?[this.data[this.setting.key]]:this.data[this.setting.key]},isMobile:function(){return"mobile"===this.$store.state.app.device}},methods:{options:function(t){var e=this,i={":rewrite_policy":"Pleroma.Web.ActivityPub.MRF.","Pleroma.Web.Auth.Authenticator":"Pleroma.Web.Auth.",":method":"Pleroma.Captcha.",":adapter":"Swoosh.Adapters.",":providers":"Pleroma.Web.Metadata.Providers.",":parsers":"Pleroma.Web.RichMedia.Parsers.",":ttl_setters":"Pleroma.Web.RichMedia.Parser.",":scrub_policy":"Pleroma.HTML.",":federation_publisher_modules":"Pleroma.Web.",":uploader":"Pleroma.Uploaders.",":filters":"Pleroma.Upload.Filter."};return t.map(function(t){return{value:t,label:t.split(i[e.setting.key])[1]?t.split(i[e.setting.key])[1]:t}})},renderMultipleSelect:function(t){return Array.isArray(t)&&":backends"!==this.setting.key&&":args"!==this.setting.key&&(t.includes("module")||t.includes("list")&&t.includes("string")||t.includes("list")&&t.includes("atom")||t.includes("regex")&&t.includes("string")||":args"===this.setting.key)},rewritePolicyOptions:function(t){return t.map(function(t){return{value:t,label:t.split("Pleroma.Web.ActivityPub.MRF.")[1]?t.split("Pleroma.Web.ActivityPub.MRF.")[1]:t}})},updateSetting:function(t,e,i,s,n){var a=Object(W.c)(t);this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:a,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:a})}}},J=(i("3IoU"),Object(m.a)(Q,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"input"},[t.renderMultipleSelect(t.setting.type)?i("el-select",{staticClass:"input",attrs:{value:t.inputValue,"data-search":t.setting.key,multiple:"",filterable:"","allow-create":""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},t._l(t.options(t.setting.suggestions),function(t,e){return i("el-option",{key:e,attrs:{value:t.value,label:t.label}})}),1):t._e(),t._v(" "),"module"===t.setting.type||t.setting.type.includes("atom")&&t.setting.type.includes("dropdown")?i("el-select",{staticClass:"input",attrs:{value:!1===t.inputValue?"false":t.inputValue,"data-search":t.setting.key||t.setting.group,clearable:""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},t._l(t.options(t.setting.suggestions),function(t,e){return i("el-option",{key:e,attrs:{value:t.value,label:t.label}})}),1):t._e()],1)},[],!1,null,null,null));J.options.__file="SelectInputWithReducedLabels.vue";var Y=J.exports,X={name:"SpecificMultipleSelect",props:{data:{type:[Object,Array],default:function(){return{}}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}}},methods:{updateSetting:function(t,e,i,s,n){this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},Z=(i("UqcT"),Object(m.a)(X,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"multiple-select-container"},[":backends"===t.setting.key?i("el-select",{staticClass:"input",attrs:{value:t.data.value,"data-search":t.setting.key||t.setting.group,multiple:""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},[i("el-option",{attrs:{value:":console",label:"console"}}),t._v(" "),i("el-option",{attrs:{value:":ex_syslogger",label:"ExSyslogger"}}),t._v(" "),i("el-option",{attrs:{value:"Quack.Logger",label:"Quack.Logger"}})],1):t._e(),t._v(" "),":args"===t.setting.key?i("el-select",{staticClass:"input",attrs:{value:t.data[t.setting.key],"data-search":t.setting.key||t.setting.group,multiple:"",filterable:"","allow-create":""},on:{change:function(e){return t.updateSetting(e,t.settingGroup.group,t.settingGroup.key,t.setting.key,t.setting.type)}}},[i("el-option",{attrs:{value:"strip",label:"strip"}}),t._v(" "),i("el-option",{attrs:{value:"auto-orient",label:"auto-orient"}}),t._v(" "),i("el-option",{attrs:{value:"implode",label:"implode"}})],1):t._e()],1)},[],!1,null,null,null));Z.options.__file="SpecificMultipleSelect.vue";var tt=Z.exports,et=i("LvDl"),it=i.n(et),st=i("4MG8"),nt=i.n(st),at={name:"Inputs",components:{AutoLinkerInput:b,CrontabInput:x,EditableKeywordInput:S,IconsInput:P,MascotsInput:G,ProxyUrlInput:I,PruneInput:K,RateLimitInput:q,RegInvitesInput:H,SelectInputWithReducedLabels:Y,SpecificMultipleSelect:tt},props:{customLabelWidth:{type:String,default:function(){return this.labelWidth},required:!1},data:{type:[Object,Array],default:function(){return{}}},labelClass:{type:String,default:function(){return"label"},required:!1},margin:{type:Number,default:function(){return 0},required:!1},nested:{type:Boolean,default:function(){return!1}},setting:{type:Object,default:function(){return{}}},settingGroup:{type:Object,default:function(){return{}}},settingParent:{type:Array,default:function(){return[]},required:!1}},computed:{canBeDeleted:function(){var t=this.settingGroup,e=t.group,i=t.key;return it.a.get(this.$store.state.settings.db,[e,i])&&this.$store.state.settings.db[e][i].includes(this.setting.key)},iconsData:function(){return Array.isArray(this.data[":icons"])?this.data[":icons"]:[]},inputValue:function(){return[":esshd",":cors_plug",":quack",":tesla",":swoosh"].includes(this.settingGroup.group)&&this.data[this.setting.key]?"atom"===this.setting.type&&":"===this.data[this.setting.key].value[0]?this.data[this.setting.key].value.substr(1):this.data[this.setting.key].value:":logger"===this.settingGroup.group&&":backends"===this.setting.key||"Pleroma.Web.Auth.Authenticator"===this.setting.key||":admin_token"===this.setting.key?this.data.value:":mime"===this.settingGroup.group&&":types"===this.settingParent[0].key?this.data.value?this.data.value[this.setting.key]:[]:"atom"===this.setting.type&&this.data[this.setting.key]&&":"===this.data[this.setting.key][0]?this.data[this.setting.key].substr(1):this.data[this.setting.key]},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},keywordData:function(){return Array.isArray(this.data)?this.data:[]},reducedSelects:function(){return[":filters",":uploader",":federation_publisher_modules",":scrub_policy",":ttl_setters",":parsers",":providers",":method",":rewrite_policy","Pleroma.Web.Auth.Authenticator"].includes(this.setting.key)||"Pleroma.Emails.Mailer"===this.settingGroup.key&&":adapter"===this.setting.key},settings:function(){return this.$store.state.settings.settings},updatedSettings:function(){return this.$store.state.settings.updatedSettings}},methods:{editableKeyword:function(t,e){return":replace"===t||"map"===e||Array.isArray(e)&&e.includes("keyword")&&e.includes("integer")||Array.isArray(e)&&e.includes("keyword")&&-1!==e.findIndex(function(t){return t.includes("list")&&t.includes("string")})},getFormattedDescription:function(t){return nt()(t)},processNestedData:function(t,e,i,s){var n=Object(W.f)(t,t,e,i,s.reverse(),this.settings,this.updatedSettings),a=n.valueForState,r=n.valueForUpdatedSettings,o=n.setting;this.$store.dispatch("UpdateSettings",{group:e,key:i,input:o.key,value:r,type:o.type}),this.$store.dispatch("UpdateState",{group:e,key:i,input:o.key,value:a})},removeSetting:function(){var t=r()(n.a.mark(function t(){var e=this;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:this.$confirm(this.$t("settings.removeSettingConfirmation"),{confirmButtonText:this.$t("users.ok"),cancelButtonText:this.$t("users.cancel"),type:"warning"}).then(r()(n.a.mark(function t(){var i;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return i=e.settingGroup.key?[{group:e.settingGroup.group,key:e.settingGroup.key,delete:!0,subkeys:[e.setting.key]}]:[{group:e.settingGroup.group,key:e.setting.key,delete:!0}],t.prev=1,t.next=4,e.$store.dispatch("RemoveSetting",i);case 4:t.next=9;break;case 6:return t.prev=6,t.t0=t.catch(1),t.abrupt("return");case 9:e.$message({type:"success",message:o.a.t("settings.successfullyRemoved")});case 10:case"end":return t.stop()}},t,null,[[1,6]])}))).catch(function(){e.$message({type:"info",message:e.$t("users.canceled")})});case 1:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}(),renderMultipleSelect:function(t){return!this.reducedSelects&&Array.isArray(t)&&":backends"!==this.setting.key&&":args"!==this.setting.key&&(t.includes("module")||t.includes("list")&&t.includes("string")||t.includes("list")&&t.includes("atom")||t.includes("regex")&&t.includes("string"))},renderSingleSelect:function(t){return!this.reducedSelects&&("module"===t||t.includes("atom")&&t.includes("dropdown"))},update:function(t,e,i,s,n,a,r){var o=this.renderSingleSelect(a)?Object(W.c)(t):t;r?this.processNestedData(o,e,i,s):this.updateSetting(o,e,i,n,a)},updateSetting:function(t,e,i,s,n){this.$store.dispatch("UpdateSettings",{group:e,key:i,input:s,value:t,type:n}),this.$store.dispatch("UpdateState",{group:e,key:i,input:s,value:t})}}},rt=(i("y7KD"),Object(m.a)(at,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"input-container"},["keyword"===t.setting.type?i("div",{staticClass:"keyword-container"},[i("el-form-item",{class:t.labelClass,style:"margin-left:"+t.margin+"px;margin-bottom:0",attrs:{"label-width":t.customLabelWidth,"data-search":t.setting.key||t.setting.group}},[i("span",{attrs:{slot:"label"},slot:"label"},[t._v("\n "+t._s(t.setting.label)+"\n "),t.canBeDeleted&&t.isDesktop?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"delete-setting-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:t.removeSetting}})],1):t._e()],1)]),t._v(" "),t._l(t.setting.children,function(e){return i("el-form-item",{key:e.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,"setting-parent":t.settingParent.concat([e]),setting:e,data:t.data[t.setting.key],"custom-label-width":t.isMobile?"100px":"120px","label-class":"keyword"===e.type?"center-label":"",margin:t.isDesktop?t.margin+15:t.margin+8,nested:!0}})],1)})],2):t._e(),t._v(" "),"keyword"!==t.setting.type?i("el-form-item",{class:t.labelClass,style:t.isDesktop?"":"margin-left:"+t.margin+"px",attrs:{"label-width":t.customLabelWidth}},[i("span",{attrs:{slot:"label"},slot:"label"},[t._v("\n "+t._s(t.setting.label)+"\n "),t.canBeDeleted&&(t.isDesktop||t.isMobile)?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"delete-setting-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:t.removeSetting}})],1):t._e()],1),t._v(" "),i("div",{staticClass:"input-row"},["string"===t.setting.type||t.setting.type.includes("string")&&t.setting.type.includes("atom")?i("el-input",{staticClass:"input",attrs:{value:t.inputValue,placeholder:t.setting.suggestions?t.setting.suggestions[0]:null,"data-search":t.setting.key||t.setting.group},on:{input:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}):t._e(),t._v(" "),"boolean"!==t.setting.type||[":registrations_open",":invites_enabled"].includes(t.setting.key)?t._e():i("el-switch",{staticClass:"switch-input",attrs:{value:t.inputValue,"data-search":t.setting.key||t.setting.group},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}),t._v(" "),"integer"===t.setting.type?i("el-input-number",{attrs:{value:null===t.inputValue?void 0:t.inputValue,placeholder:t.setting.suggestions?t.setting.suggestions[0].toString():null,min:0,size:t.isDesktop?"large":"medium","data-search":t.setting.key||t.setting.group},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}):t._e(),t._v(" "),t.renderSingleSelect(t.setting.type)?i("el-select",{staticClass:"input",attrs:{value:!1===t.inputValue?"false":t.inputValue,"data-search":t.setting.key||t.setting.group,clearable:""},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}},t._l(t.setting.suggestions,function(t,e){return i("el-option",{key:e,attrs:{value:t}})}),1):t._e(),t._v(" "),t.renderMultipleSelect(t.setting.type)?i("el-select",{staticClass:"input",attrs:{value:t.inputValue,"data-search":t.setting.key||t.setting.group,multiple:"",filterable:"","allow-create":""},on:{change:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}},t._l(t.setting.suggestions,function(t,e){return i("el-option",{key:e,attrs:{value:t}})}),1):t._e(),t._v(" "),":ip"===t.setting.key?i("el-input",{staticClass:"input",attrs:{value:t.inputValue,"data-search":t.setting.key||t.setting.group,placeholder:"xxx.xxx.xxx.xx"},on:{input:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}}):t._e(),t._v(" "),"atom"===t.setting.type?i("el-input",{staticClass:"input",attrs:{value:t.inputValue,placeholder:t.setting.suggestions[0]?t.setting.suggestions[0].substr(1):"","data-search":t.setting.key||t.setting.group},on:{input:function(e){return t.update(e,t.settingGroup.group,t.settingGroup.key,t.settingParent,t.setting.key,t.setting.type,t.nested)}}},[i("template",{slot:"prepend"},[t._v(":")])],2):t._e(),t._v(" "),":auto_linker"===t.settingGroup.group?i("auto-linker-input",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":crontab"===t.setting.key?i("crontab-input",{attrs:{data:t.data[t.setting.key],"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),t.editableKeyword(t.setting.key,t.setting.type)?i("editable-keyword-input",{attrs:{data:t.keywordData,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":icons"===t.setting.key?i("icons-input",{attrs:{data:t.iconsData,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":mascots"===t.setting.key?i("mascots-input",{attrs:{data:t.keywordData,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":proxy_url"===t.setting.key?i("proxy-url-input",{attrs:{data:t.data[t.setting.key],"setting-group":t.settingGroup,setting:t.setting,parents:t.settingParent}}):t._e(),t._v(" "),":prune"===t.setting.key?i("prune-input",{attrs:{data:t.data[t.setting.key],"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":rate_limit"===t.settingGroup.key?i("rate-limit-input",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),[":registrations_open",":invites_enabled"].includes(t.setting.key)?i("reg-invites-input",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),t.reducedSelects?i("select-input-with-reduced-labels",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),":backends"===t.setting.key||":args"===t.setting.key?i("specific-multiple-select",{attrs:{data:t.data,"setting-group":t.settingGroup,setting:t.setting}}):t._e(),t._v(" "),t.canBeDeleted&&t.isTablet?i("el-tooltip",{staticClass:"delete-setting-button-container",attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"delete-setting-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:t.removeSetting}})],1):t._e()],1),t._v(" "),t.setting.description&&"keyword"!==t.setting.type?i("div",{staticClass:"expl",domProps:{innerHTML:t._s(t.getFormattedDescription(t.setting.description))}}):t._e()]):t._e()],1)},[],!1,null,null,null));rt.options.__file="Inputs.vue";var ot={name:"Setting",components:{Inputs:rt.exports},props:{settingGroup:{type:Object,default:function(){return{}}},data:{type:Object,default:function(){return{}}}},computed:{emailAdapterChildren:function(){var t=this.$store.state.settings.settings[":pleroma"]["Pleroma.Emails.Mailer"][":adapter"];return this.settingGroup.children.filter(function(e){return e.group&&e.group.includes(t)})},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},loading:function(){return this.$store.state.settings.loading}},methods:{canBeDeleted:function(t){var e=this.settingGroup,i=e.group,s=e.key||t;return it.a.get(this.$store.state.settings.db,[i,s])&&this.$store.state.settings.db[i][s].includes(t)},compound:function(t){var e=t.type,i=t.key;t.children;return"keyword"===e||"map"===e||e.includes("keyword")||":replace"===i},divideSetting:function(t){return[":sslopts",":tlsopts",":adapter",":poll_limits",":queues",":styling",":proxy_opts"].includes(t)},getFormattedDescription:function(t){return nt()(t)},removeSetting:function(){var t=r()(n.a.mark(function t(e){var i=this;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:this.$confirm(this.$t("settings.removeSettingConfirmation"),{confirmButtonText:this.$t("users.ok"),cancelButtonText:this.$t("users.cancel"),type:"warning"}).then(r()(n.a.mark(function t(){var s;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return s=i.settingGroup.key?[{group:i.settingGroup.group,key:i.settingGroup.key,delete:!0,subkeys:[e]}]:[{group:i.settingGroup.group,key:e,delete:!0}],t.prev=1,t.next=4,i.$store.dispatch("RemoveSetting",s);case 4:t.next=9;break;case 6:return t.prev=6,t.t0=t.catch(1),t.abrupt("return");case 9:i.$message({type:"success",message:o.a.t("settings.successfullyRemoved")});case 10:case"end":return t.stop()}},t,null,[[1,6]])}))).catch(function(){i.$message({type:"info",message:i.$t("users.canceled")})});case 1:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}(),updateSetting:function(t,e,i){this.$store.dispatch("UpdateSettings",{tab:e,data:g()({},i,t)})}}},lt=(i("pnah"),Object(m.a)(ot,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",[t.settingGroup.label||t.settingGroup.description?i("el-form-item",{staticClass:"description-container",attrs:{"data-search":t.settingGroup.key||t.settingGroup.group}},[t.settingGroup.label?i("span",{staticClass:"setting-label"},[t._v(t._s(t.settingGroup.label))]):t._e(),t._v(" "),t.settingGroup.description?i("span",{staticClass:"expl no-top-margin",domProps:{innerHTML:t._s(t.getFormattedDescription(t.settingGroup.description))}}):t._e()]):t._e(),t._v(" "),"Pleroma.Emails.Mailer"===t.settingGroup.key?i("div",[t._l(t.settingGroup.children.filter(function(t){return!t.group}),function(e){return i("div",{key:e.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data}})],1)}),t._v(" "),t._l(t.emailAdapterChildren,function(e){return i("div",{key:e.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data}})],1)})],2):i("div",t._l(t.settingGroup.children,function(e){return i("div",{key:e.key},[t.compound(e)?t._e():i("div",[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data,nested:!1}})],1),t._v(" "),t.compound(e)?i("div",[t.divideSetting(e.key)?i("el-divider",{staticClass:"divider"}):t._e(),t._v(" "),e.children?i("div",[i("div",{staticClass:"input-container"},[i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":e.key||e.group}},[i("span",{attrs:{slot:"label"},slot:"label"},[t.isDesktop&&t.canBeDeleted(e.key)?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticStyle:{"margin-left":"5px"},attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:function(i){return t.removeSetting(e.key)}}})],1):t._e()],1),t._v(" "),i("span",{staticClass:"label-font"},[t._v(t._s(e.label))]),t._v(" "),t.canBeDeleted(e.key)&&(t.isMobile||t.isTablet)?i("el-tooltip",{attrs:{content:t.$t("settings.removeFromDB"),placement:"bottom-end"}},[i("el-button",{staticClass:"settings-delete-button",attrs:{icon:"el-icon-delete",circle:"",size:"mini"},on:{click:function(i){return t.removeSetting(e.key)}}})],1):t._e()],1)],1),t._v(" "),t._l(e.children,function(s){return i("div",{key:s.key},[i("inputs",{attrs:{"setting-group":t.settingGroup,"setting-parent":[e,s],setting:s,data:t.data[e.key],nested:!0}})],1)})],2):i("div",[i("inputs",{attrs:{"setting-group":t.settingGroup,setting:e,data:t.data[e.key],nested:!0}})],1),t._v(" "),i("el-divider",{staticClass:"divider"})],1):t._e()])}),0)],1)},[],!1,null,null,null));lt.options.__file="Setting.vue";var ut=lt.exports,ct={name:"ActivityPub",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{activitypub:function(){return this.settings.description.find(function(t){return":activitypub"===t.key})},activitypubData:function(){return it.a.get(this.settings.settings,[":pleroma",":activitypub"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.$store.state.settings.loading},user:function(){return this.settings.description.find(function(t){return":user"===t.key})},userData:function(){return it.a.get(this.settings.settings,[":pleroma",":user"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},pt=(i("qEST"),Object(m.a)(ct,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"activitypubData",attrs:{model:t.activitypubData,"label-position":t.labelPosition,"label-width":t.labelWidth,"data-search":":activitypub"}},[i("setting",{attrs:{"setting-group":t.activitypub,data:t.activitypubData}})],1),t._v(" "),t.activitypub?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"userData",attrs:{model:t.userData,"label-position":t.labelPosition,"label-width":t.labelWidth,"data-search":":user"}},[i("setting",{attrs:{"setting-group":t.user,data:t.userData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));pt.options.__file="ActivityPub.vue";var dt=pt.exports,gt={name:"Authentication",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{auth:function(){return this.settings.description.find(function(t){return":auth"===t.key})},authData:function(){return it.a.get(this.settings.settings,[":pleroma",":auth"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},ldap:function(){return this.settings.description.find(function(t){return":ldap"===t.key})},ldapData:function(){return it.a.get(this.settings.settings,[":pleroma",":ldap"])||{}},loading:function(){return this.settings.loading},oauth2:function(){return this.settings.description.find(function(t){return":oauth2"===t.key})},oauth2Data:function(){return it.a.get(this.settings.settings,[":pleroma",":oauth2"])||{}},pleromaAuthenticator:function(){return this.settings.description.find(function(t){return t.children&&"Pleroma.Web.Auth.Authenticator"===t.children[0].key})},pleromaAuthenticatorData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Web.Auth.Authenticator"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},ht=(i("4b9x"),Object(m.a)(gt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"pleromaAuthenticatorData",attrs:{model:t.pleromaAuthenticatorData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.pleromaAuthenticator,data:t.pleromaAuthenticatorData}})],1),t._v(" "),t.pleromaAuthenticator?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"authData",attrs:{model:t.authData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.auth,data:t.authData}})],1),t._v(" "),t.auth?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"ldapData",attrs:{model:t.ldapData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.ldap,data:t.ldapData}})],1),t._v(" "),t.oauth2?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"oauth2",attrs:{model:t.oauth2Data,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.oauth2,data:t.oauth2Data}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));ht.options.__file="Authentication.vue";var mt=ht.exports,ft={name:"AutoLinker",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{autoLinker:function(){return this.settings.description.find(function(t){return":opts"===t.key})},autoLinkerData:function(){return it.a.get(this.settings.settings,[":auto_linker",":opts"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},bt=(i("cyzs"),Object(m.a)(ft,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"autoLinker",attrs:{model:t.autoLinkerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.autoLinker,data:t.autoLinkerData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));bt.options.__file="AutoLinker.vue";var vt=bt.exports,yt={name:"Captcha",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{captcha:function(){return this.settings.description.find(function(t){return"Pleroma.Captcha"===t.key})},captchaData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Captcha"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},kocaptcha:function(){return this.settings.description.find(function(t){return"Pleroma.Captcha.Kocaptcha"===t.key})},kocaptchaData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Captcha.Kocaptcha"])||{}},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},_t=(i("2q6O"),Object(m.a)(yt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"captchaData",attrs:{model:t.captchaData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.captcha,data:t.captchaData}})],1),t._v(" "),t.captcha?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"kocaptchaData",attrs:{model:t.kocaptchaData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.kocaptcha,data:t.kocaptchaData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));_t.options.__file="Captcha.vue";var kt=_t.exports,St={name:"Esshd",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{esshd:function(){return this.settings.description.find(function(t){return":esshd"===t.group})},esshdData:function(){return it.a.get(this.settings.settings,[":esshd"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{toggleEsshd:function(t){this.$store.dispatch("ToggleEsshd",t)},updateSetting:function(t,e,i){this.$store.dispatch("UpdateSettings",{tab:e,data:g()({},i,t)})},onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Dt=(i("FCne"),Object(m.a)(St,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"esshdData",attrs:{model:t.esshdData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.esshd,data:t.esshdData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Dt.options.__file="Esshd.vue";var wt=Dt.exports,xt={name:"Frontend",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{assets:function(){return this.settings.description.find(function(t){return":assets"===t.key})},assetsData:function(){return it.a.get(this.settings.settings,[":pleroma",":assets"])||{}},chat:function(){return this.settings.description.find(function(t){return":chat"===t.key})},chatData:function(){return it.a.get(this.settings.settings,[":pleroma",":chat"])||{}},emoji:function(){return this.settings.description.find(function(t){return":emoji"===t.key})},emojiData:function(){return it.a.get(this.settings.settings,[":pleroma",":emoji"])||{}},frontend:function(){return this.settings.description.find(function(t){return":frontend_configurations"===t.key})},frontendData:function(){return it.a.get(this.settings.settings,[":pleroma",":frontend_configurations"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},markup:function(){return this.settings.description.find(function(t){return":markup"===t.key})},markupData:function(){return it.a.get(this.settings.settings,[":pleroma",":markup"])||{}},staticFe:function(){return this.settings.description.find(function(t){return":static_fe"===t.key})},staticFeData:function(){return it.a.get(this.settings.settings,[":pleroma",":static_fe"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Ct=(i("hVXW"),Object(m.a)(xt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"frontendData",attrs:{model:t.frontendData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.frontend,data:t.frontendData}})],1),t._v(" "),i("el-form",{ref:"staticFeData",attrs:{model:t.staticFeData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.staticFe,data:t.staticFeData}})],1),t._v(" "),t.staticFe?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"assetsData",attrs:{model:t.assetsData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[t.assets?i("el-form-item",{staticClass:"grouped-settings-header"},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.assets")))])]):t._e(),t._v(" "),i("setting",{attrs:{"setting-group":t.assets,data:t.assetsData}})],1),t._v(" "),t.assets?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"emojiData",attrs:{model:t.emojiData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[t.emoji?i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":":emoji"}},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.emoji")))])]):t._e(),t._v(" "),i("setting",{attrs:{"setting-group":t.emoji,data:t.emojiData}})],1),t._v(" "),t.emoji?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"chatData",attrs:{model:t.chatData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.chat,data:t.chatData}})],1),t._v(" "),t.chat?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"markupData",attrs:{model:t.markupData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[t.markup?i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":":markup"}},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.markup")))])]):t._e(),t._v(" "),i("setting",{attrs:{"setting-group":t.markup,data:t.markupData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Ct.options.__file="Frontend.vue";var $t=Ct.exports,Pt={name:"Gopher",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{gopher:function(){return this.settings.description.find(function(t){return":gopher"===t.key})},gopherData:function(){return it.a.get(this.settings.settings,[":pleroma",":gopher"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Ot=(i("w5cJ"),Object(m.a)(Pt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"gopher",attrs:{model:t.gopherData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.gopher,data:t.gopherData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Ot.options.__file="Gopher.vue";var Ut=Ot.exports,Mt={name:"HTTP",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{corsPlug:function(){return this.settings.description.find(function(t){return":cors_plug"===t.group})},corsPlugData:function(){return it.a.get(this.settings.settings,[":cors_plug"])||{}},http:function(){return this.settings.description.find(function(t){return":http"===t.key})},httpData:function(){return it.a.get(this.settings.settings,[":pleroma",":http"])||{}},httpSecurity:function(){return this.settings.description.find(function(t){return":http_security"===t.key})},httpSecurityData:function(){return it.a.get(this.settings.settings,[":pleroma",":http_security"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},webCacheTtl:function(){return this.settings.description.find(function(t){return":web_cache_ttl"===t.key})},webCacheTtlData:function(){return it.a.get(this.settings.settings,[":pleroma",":web_cache_ttl"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},jt=(i("KFE3"),Object(m.a)(Mt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"httpData",attrs:{model:t.httpData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.http,data:t.httpData}})],1),t._v(" "),i("el-form",{ref:"corsPlugData",attrs:{model:t.corsPlugData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[t.corsPlug?i("el-form-item",{staticClass:"grouped-settings-header",attrs:{"data-search":":cors_plug"}},[i("span",{staticClass:"label-font label-with-margin"},[t._v(t._s(t.$t("settings.corsPlug")))])]):t._e(),t._v(" "),i("setting",{attrs:{"setting-group":t.corsPlug,data:t.corsPlugData}})],1),t._v(" "),t.corsPlug?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"httpSignatures",attrs:{model:t.httpSignaturesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.httpSignatures,data:t.httpSignaturesData}})],1),t._v(" "),t.httpSignatures?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"httpSecurityData",attrs:{model:t.httpSecurityData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.httpSecurity,data:t.httpSecurityData}})],1),t._v(" "),t.httpSecurity?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"webCacheTtl",attrs:{model:t.webCacheTtlData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.webCacheTtl,data:t.webCacheTtlData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));jt.options.__file="Http.vue";var Tt=jt.exports,At={name:"Instance",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{adminToken:function(){return this.settings.description.find(function(t){return t.children&&":admin_token"===t.children[0].key})},adminTokenData:function(){return it.a.get(this.settings.settings,[":pleroma",":admin_token"])||{}},feed:function(){return this.settings.description.find(function(t){return":feed"===t.key})},feedData:function(){return it.a.get(this.settings.settings,[":pleroma",":feed"])||{}},instance:function(){return this.settings.description.find(function(t){return":instance"===t.key})},instanceData:function(){return it.a.get(this.settings.settings,[":pleroma",":instance"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},manifest:function(){return this.settings.description.find(function(t){return":manifest"===t.key})},manifestData:function(){return it.a.get(this.settings.settings,[":pleroma",":manifest"])||{}},pleromaUser:function(){return this.settings.description.find(function(t){return"Pleroma.User"===t.key})},pleromaUserData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.User"])||{}},scheduledActivity:function(){return this.$store.state.settings.description.find(function(t){return"Pleroma.ScheduledActivity"===t.key})},scheduledActivityData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.ScheduledActivity"])||{}},streamer:function(){return this.$store.state.settings.description.find(function(t){return":streamer"===t.key})},streamerData:function(){return it.a.get(this.settings.settings,[":pleroma",":streamer"])||{}},uriSchemes:function(){return this.settings.description.find(function(t){return":uri_schemes"===t.key})},uriSchemesData:function(){return it.a.get(this.settings.settings,[":pleroma",":uri_schemes"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Gt=(i("e0P1"),Object(m.a)(At,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"instanceData",attrs:{model:t.instanceData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.instance,data:t.instanceData}})],1),t._v(" "),t.instance?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"adminToken",attrs:{model:t.adminTokenData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.adminToken,data:t.adminTokenData}})],1),t._v(" "),t.adminToken?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"scheduledActivity",attrs:{model:t.scheduledActivityData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.scheduledActivity,data:t.scheduledActivityData}})],1),t._v(" "),t.scheduledActivity?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"manifest",attrs:{model:t.manifestData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.manifest,data:t.manifestData}})],1),t._v(" "),t.manifest?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"pleromaUser",attrs:{model:t.pleromaUserData,"label-position":t.labelPosition,"label-width":t.labelWidth,"data-search":"Pleroma.User"}},[i("setting",{attrs:{"setting-group":t.pleromaUser,data:t.pleromaUserData}})],1),t._v(" "),t.pleromaUser?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"uriSchemes",attrs:{model:t.uriSchemesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uriSchemes,data:t.uriSchemesData}})],1),t._v(" "),t.uriSchemes?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"feed",attrs:{model:t.feedData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.feed,data:t.feedData}})],1),t._v(" "),i("el-form",{ref:"streamer",attrs:{model:t.streamerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.streamer,data:t.streamerData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Gt.options.__file="Instance.vue";var Wt=Gt.exports,Lt={name:"JobQueue",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{activityExpiration:function(){return this.settings.description.find(function(t){return"Pleroma.ActivityExpiration"===t.key})},activityExpirationData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.ActivityExpiration"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},obanQueues:function(){return this.settings.description.find(function(t){return"Oban"===t.key})},obanQueuesData:function(){return it.a.get(this.settings.settings,[":pleroma","Oban"])||{}},workers:function(){return this.settings.description.find(function(t){return":workers"===t.key})},workersData:function(){return it.a.get(this.settings.settings,[":pleroma",":workers"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Et=(i("lNpP"),Object(m.a)(Lt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"obanQueuesData",attrs:{model:t.obanQueuesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.obanQueues,data:t.obanQueuesData}})],1),t._v(" "),i("el-form",{ref:"workersData",attrs:{model:t.workersData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.workers,data:t.workersData}})],1),t._v(" "),i("el-form",{ref:"activityExpiration",attrs:{model:t.activityExpirationData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.activityExpiration,data:t.activityExpirationData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Et.options.__file="JobQueue.vue";var It=Et.exports,Rt={name:"Logger",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{console:function(){return this.settings.description.find(function(t){return":console"===t.key})},consoleData:function(){return it.a.get(this.settings.settings,[":logger",":console"])||{}},exsyslogger:function(){return this.settings.description.find(function(t){return":ex_syslogger"===t.key})},exsysloggerData:function(){return it.a.get(this.settings.settings,[":logger",":ex_syslogger"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},logger:function(){return this.settings.description.find(function(t){return":logger"===t.group})},loggerData:function(){return it.a.get(this.settings.settings,[":logger",":backends"])||{}},quack:function(){return this.settings.description.find(function(t){return":quack"===t.group})},quackData:function(){return it.a.get(this.settings.settings,[":quack"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Ft=(i("mADP"),Object(m.a)(Rt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"loggerData",attrs:{model:t.loggerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.logger,data:t.loggerData}})],1),t._v(" "),t.logger?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"consoleData",attrs:{model:t.consoleData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.console,data:t.consoleData}})],1),t._v(" "),t.console?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"exsysloggerData",attrs:{model:t.exsysloggerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.exsyslogger,data:t.exsysloggerData}})],1),t._v(" "),t.exsyslogger?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"quackData",attrs:{model:t.quackData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.quack,data:t.quackData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Ft.options.__file="Logger.vue";var Kt=Ft.exports,Vt={name:"Mailer",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{emailNotifications:function(){return this.settings.description.find(function(t){return":email_notifications"===t.key})},emailNotificationsData:function(){return it.a.get(this.settings.settings,[":pleroma",":email_notifications"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.$store.state.settings.loading},mailer:function(){return this.settings.description.find(function(t){return"Pleroma.Emails.Mailer"===t.key})},mailerData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Emails.Mailer"])||{}},newUsersDigestEmail:function(){return this.settings.description.find(function(t){return"Pleroma.Emails.NewUsersDigestEmail"===t.key})},newUsersDigestEmailData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Emails.NewUsersDigestEmail"])||{}},swoosh:function(){return this.settings.description.find(function(t){return":swoosh"===t.group})},swooshData:function(){return it.a.get(this.settings.settings,[":swoosh"])||{}},userEmail:function(){return this.settings.description.find(function(t){return"Pleroma.Emails.UserEmail"===t.key})},userEmailData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Emails.UserEmail"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},zt=(i("PygS"),Object(m.a)(Vt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"mailer",attrs:{model:t.mailerData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mailer,data:t.mailerData}})],1),t._v(" "),t.mailer?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"swoosh",attrs:{model:t.swooshData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.swoosh,data:t.swooshData}})],1),t._v(" "),t.swoosh?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"emailNotifications",attrs:{model:t.emailNotificationsData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.emailNotifications,data:t.emailNotificationsData}})],1),t._v(" "),i("el-form",{ref:"userEmail",attrs:{model:t.userEmailData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.userEmail,data:t.userEmailData}})],1),t._v(" "),i("el-form",{ref:"newUsersDigestEmail",attrs:{model:t.newUsersDigestEmailData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.newUsersDigestEmail,data:t.newUsersDigestEmailData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));zt.options.__file="Mailer.vue";var qt=zt.exports,Nt={name:"MediaProxy",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},mediaProxy:function(){return this.settings.description.find(function(t){return":media_proxy"===t.key})},mediaProxyData:function(){return it.a.get(this.settings.settings,[":pleroma",":media_proxy"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Bt=(i("UdS4"),Object(m.a)(Nt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"mediaProxy",attrs:{model:t.mediaProxyData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mediaProxy,data:t.mediaProxyData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Bt.options.__file="MediaProxy.vue";var Ht=Bt.exports,Qt={name:"Metadata",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},metadata:function(){return this.settings.description.find(function(t){return"Pleroma.Web.Metadata"===t.key})},metadataData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Web.Metadata"])||{}},richMedia:function(){return this.settings.description.find(function(t){return":rich_media"===t.key})},richMediaData:function(){return it.a.get(this.settings.settings,[":pleroma",":rich_media"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Jt=(i("apN7"),Object(m.a)(Qt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"metadata",attrs:{model:t.metadataData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.metadata,data:t.metadataData}})],1),t._v(" "),t.metadata?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"richMedia",attrs:{model:t.richMediaData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.richMedia,data:t.richMediaData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Jt.options.__file="Metadata.vue";var Yt=Jt.exports,Xt={name:"MRF",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},modules:function(){return this.settings.description.find(function(t){return":modules"===t.key})},modulesData:function(){return it.a.get(this.settings.settings,[":pleroma",":modules"])||{}},mrfActivityExpiration:function(){return this.settings.description.find(function(t){return":mrf_activity_expiration"===t.key})},mrfActivityExpirationData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_activity_expiration"])||{}},mrfSimple:function(){return this.settings.description.find(function(t){return":mrf_simple"===t.key})},mrfSimpleData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_simple"])||{}},mrfRejectnonpublic:function(){return this.settings.description.find(function(t){return":mrf_rejectnonpublic"===t.key})},mrfRejectnonpublicData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_rejectnonpublic"])||{}},mrfHellthread:function(){return this.settings.description.find(function(t){return":mrf_hellthread"===t.key})},mrfHellthreadData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_hellthread"])||{}},mrfKeyword:function(){return this.settings.description.find(function(t){return":mrf_keyword"===t.key})},mrfKeywordData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_keyword"])||{}},mrfObjectAge:function(){return this.settings.description.find(function(t){return":mrf_object_age"===t.key})},mrfObjectAgeData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_object_age"])||{}},mrfSubchain:function(){return this.settings.description.find(function(t){return":mrf_subchain"===t.key})},mrfSubchainData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_subchain"])||{}},mrfMention:function(){return this.settings.description.find(function(t){return":mrf_mention"===t.key})},mrfMentionData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_mention"])||{}},mrfNormalizeMarkup:function(){return this.settings.description.find(function(t){return":mrf_normalize_markup"===t.key})},mrfNormalizeMarkupData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_normalize_markup"])||{}},mrfVocabulary:function(){return this.settings.description.find(function(t){return":mrf_vocabulary"===t.key})},mrfVocabularyData:function(){return it.a.get(this.settings.settings,[":pleroma",":mrf_vocabulary"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},Zt=(i("h9z7"),Object(m.a)(Xt,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"mrfSimple",attrs:{model:t.mrfSimpleData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfSimple,data:t.mrfSimpleData}})],1),t._v(" "),t.mrfSimple?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"mrfRejectnonpublic",attrs:{model:t.mrfRejectnonpublicData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfRejectnonpublic,data:t.mrfRejectnonpublicData}})],1),t._v(" "),t.mrfRejectnonpublic?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"mrfHellthread",attrs:{model:t.mrfHellthreadData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfHellthread,data:t.mrfHellthreadData}})],1),t._v(" "),t.mrfHellthread?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"mrfKeyword",attrs:{model:t.mrfKeywordData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfKeyword,data:t.mrfKeywordData}})],1),t._v(" "),i("el-form",{ref:"mrfSubchain",attrs:{model:t.mrfSubchainData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfSubchain,data:t.mrfSubchainData}})],1),t._v(" "),i("el-form",{ref:"mrfMention",attrs:{model:t.mrfMentionData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfMention,data:t.mrfMentionData}})],1),t._v(" "),t.mrfMention?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"mrfNormalizeMarkup",attrs:{model:t.mrfNormalizeMarkupData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfNormalizeMarkup,data:t.mrfNormalizeMarkupData}})],1),t._v(" "),t.mrfNormalizeMarkup?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"mrfVocabulary",attrs:{model:t.mrfVocabularyData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfVocabulary,data:t.mrfVocabularyData}})],1),t._v(" "),t.mrfVocabulary?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"mrfObjectAge",attrs:{model:t.mrfObjectAgeData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfObjectAge,data:t.mrfObjectAgeData}})],1),t._v(" "),t.mrfObjectAge?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"mrfActivityExpiration",attrs:{model:t.mrfActivityExpirationData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mrfActivityExpiration,data:t.mrfActivityExpirationData}})],1),t._v(" "),t.mrfActivityExpiration?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"modules",attrs:{model:t.modulesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.modules,data:t.modulesData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));Zt.options.__file="MRF.vue";var te=Zt.exports,ee={name:"Other",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},mimeTypes:function(){return this.settings.description.find(function(t){return":mime"===t.group})},mimeTypesData:function(){return it.a.get(this.settings.settings,[":mime"])||{}},remoteIp:function(){return this.settings.description.find(function(t){return"Pleroma.Plugs.RemoteIp"===t.key})},remoteIpData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Plugs.RemoteIp"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},ie=(i("gFOO"),Object(m.a)(ee,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"mimeTypes",attrs:{model:t.mimeTypesData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.mimeTypes,data:t.mimeTypesData}})],1),t._v(" "),i("el-form",{ref:"remoteIp",attrs:{model:t.remoteIpData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.remoteIp,data:t.remoteIpData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));ie.options.__file="Other.vue";var se=ie.exports,ne={name:"RateLimiters",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{rateLimiters:function(){return this.settings.description.find(function(t){return":rate_limit"===t.key})},rateLimitersData:function(){return it.a.get(this.settings.settings,[":pleroma",":rate_limit"])||{}},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.$store.state.settings.loading}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},ae=(i("WvM+"),Object(m.a)(ne,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"rateLimiters",attrs:{model:t.rateLimitersData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.rateLimiters,data:t.rateLimitersData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));ae.options.__file="RateLimiters.vue";var re=ae.exports,oe={name:"Relays",data:function(){return{newRelay:""}},computed:{relays:function(){return this.$store.state.relays.fetchedRelays},relaysTable:function(){return this.relays.map(function(t){return{instance:t}})},loading:function(){return this.$store.state.relays.loading}},mounted:function(){this.$store.dispatch("FetchRelays")},methods:{followRelay:function(){this.$store.dispatch("AddRelay",this.newRelay)},deleteRelay:function(t){this.$store.dispatch("DeleteRelay",t)}}},le=(i("J7+w"),Object(m.a)(oe,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"relays-container"},[i("div",{staticClass:"follow-relay-container"},[i("el-input",{staticClass:"follow-relay",attrs:{placeholder:t.$t("settings.followRelay")},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.followRelay(e)}},model:{value:t.newRelay,callback:function(e){t.newRelay=e},expression:"newRelay"}}),t._v(" "),i("el-button",{attrs:{type:"primary"},nativeOn:{click:function(e){return t.followRelay(e)}}},[t._v(t._s(t.$t("settings.follow")))])],1),t._v(" "),i("el-table",{attrs:{data:t.relaysTable}},[i("el-table-column",{attrs:{label:t.$t("settings.instanceUrl"),prop:"instance"}}),t._v(" "),i("el-table-column",{attrs:{fixed:"right",width:"120"},scopedSlots:t._u([{key:"default",fn:function(e){return[i("el-button",{attrs:{type:"text",size:"small"},nativeOn:{click:function(i){return t.deleteRelay(e.row.instance)}}},[t._v("\n "+t._s(t.$t("table.delete"))+"\n ")])]}}],null,!1,2132974932)})],1)],1)},[],!1,null,null,null));le.options.__file="Relays.vue";var ue=le.exports,ce={name:"Upload",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},showUploadersS3:function(){return"Pleroma.Uploaders.S3"===it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload",":uploader"])},showUploadersLocal:function(){return"Pleroma.Uploaders.Local"===it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload",":uploader"])},upload:function(){return this.settings.description.find(function(t){return"Pleroma.Upload"===t.key})},uploadData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload"])||{}},uploadersLocal:function(){return this.settings.description.find(function(t){return"Pleroma.Uploaders.Local"===t.key})},uploadersLocalData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Uploaders.Local"])||{}},uploadersS3:function(){return this.settings.description.find(function(t){return"Pleroma.Uploaders.S3"===t.key})},uploadersS3Data:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Uploaders.S3"])||{}},uploadFilterMogrify:function(){return this.settings.description.find(function(t){return"Pleroma.Upload.Filter.Mogrify"===t.key})},uploadFilterMogrifyData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload.Filter.Mogrify"])||{}},uploadAnonymizeFilename:function(){return this.settings.description.find(function(t){return"Pleroma.Upload.Filter.AnonymizeFilename"===t.key})},uploadAnonymizeFilenameData:function(){return it.a.get(this.settings.settings,[":pleroma","Pleroma.Upload.Filter.AnonymizeFilename"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},pe=(i("DPt0"),Object(m.a)(ce,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[i("el-form",{ref:"uploadData",attrs:{model:t.uploadData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.upload,data:t.uploadData}})],1),t._v(" "),t.showUploadersLocal?i("el-form",{ref:"uploadersLocal",attrs:{model:t.uploadersLocalData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[t.uploadersLocal?i("el-form-item",{staticClass:"grouped-settings-header"},[i("span",{staticClass:"label-font label-with-margin"},[t._v("Pleroma.Uploaders.Local")])]):t._e(),t._v(" "),i("setting",{attrs:{"setting-group":t.uploadersLocal,data:t.uploadersLocalData}}),t._v(" "),t.uploadersLocal?i("el-divider",{staticClass:"divider thick-line"}):t._e()],1):t._e(),t._v(" "),t.showUploadersS3?i("el-form",{ref:"uploadersS3",attrs:{model:t.uploadersS3Data,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uploadersS3,data:t.uploadersS3Data}}),t._v(" "),t.uploadersS3?i("el-divider",{staticClass:"divider thick-line"}):t._e()],1):t._e(),t._v(" "),i("el-form",{ref:"uploadFilterMogrify",attrs:{model:t.uploadFilterMogrifyData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uploadFilterMogrify,data:t.uploadFilterMogrifyData}})],1),t._v(" "),t.uploadFilterMogrify?i("el-divider",{staticClass:"divider thick-line"}):t._e(),t._v(" "),i("el-form",{ref:"uploadAnonymizeFilename",attrs:{model:t.uploadAnonymizeFilenameData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.uploadAnonymizeFilename,data:t.uploadAnonymizeFilenameData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));pe.options.__file="Upload.vue";var de=pe.exports,ge={name:"WebPush",components:{Setting:ut},computed:c()({},Object(p.b)(["settings"]),{isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"sidebar-opened":"sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},labelPosition:function(){return this.isMobile?"top":"right"},labelWidth:function(){return this.isMobile?"120px":this.isTablet?"200px":"280px"},loading:function(){return this.settings.loading},vapidDetails:function(){return this.settings.description.find(function(t){return":vapid_details"===t.key})},vapidDetailsData:function(){return it.a.get(this.settings.settings,[":web_push_encryption",":vapid_details"])||{}}}),methods:{onSubmit:function(){var t=r()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("SubmitChanges");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.success")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},he=(i("+qaP"),Object(m.a)(ge,function(){var t=this,e=t.$createElement,i=t._self._c||e;return t.loading?t._e():i("div",{staticClass:"form-container",class:t.isSidebarOpen},[t.loading?t._e():i("el-form",{ref:"vapidDetailsData",attrs:{model:t.vapidDetailsData,"label-position":t.labelPosition,"label-width":t.labelWidth}},[i("setting",{attrs:{"setting-group":t.vapidDetails,data:t.vapidDetailsData}})],1),t._v(" "),i("div",{staticClass:"submit-button-container"},[i("el-button",{staticClass:"submit-button",attrs:{type:"primary"},on:{click:t.onSubmit}},[t._v("Submit")])],1)],1)},[],!1,null,null,null));he.options.__file="WebPush.vue";var me=he.exports,fe={components:{ActivityPub:dt,Authentication:mt,AutoLinker:vt,Captcha:kt,Esshd:wt,Frontend:$t,Gopher:Ut,Http:Tt,Instance:Wt,JobQueue:It,Logger:Kt,Mailer:qt,MediaProxy:Ht,Metadata:Yt,Mrf:te,Other:se,RateLimiters:re,Relays:ue,RebootButton:i("rIUS").a,Upload:de,WebPush:me},data:function(){return{options:[{value:"activityPub",label:o.a.t("settings.activityPub")},{value:"auth",label:o.a.t("settings.auth")},{value:"autoLinker",label:o.a.t("settings.autoLinker")},{value:"esshd",label:o.a.t("settings.esshd")},{value:"captcha",label:o.a.t("settings.captcha")},{value:"frontend",label:o.a.t("settings.frontend")},{value:"gopher",label:o.a.t("settings.gopher")},{value:"http",label:o.a.t("settings.http")},{value:"instance",label:o.a.t("settings.instance")},{value:"jobQueue",label:o.a.t("settings.jobQueue")},{value:"logger",label:o.a.t("settings.logger")},{value:"mailer",label:o.a.t("settings.mailer")},{value:"mediaProxy",label:o.a.t("settings.mediaProxy")},{value:"metadata",label:o.a.t("settings.metadata")},{value:"mrf",label:o.a.t("settings.mrf")},{value:"rateLimiters",label:o.a.t("settings.rateLimiters")},{value:"relays",label:o.a.t("settings.relays")},{value:"webPush",label:o.a.t("settings.webPush")},{value:"upload",label:o.a.t("settings.upload")},{value:"other",label:o.a.t("settings.other")}],searchQuery:""}},computed:{activeTab:{get:function(){return this.$store.state.settings.activeTab},set:function(t){this.$store.dispatch("SetActiveTab",t)}},configDisabled:function(){return this.$store.state.settings.configDisabled},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"header-sidebar-opened":"header-sidebar-closed"},isTablet:function(){return"tablet"===this.$store.state.app.device},rebootIsSidebarOpen:function(){return this.$store.state.app.sidebar.opened?"reboot-sidebar-opened":"reboot-sidebar-closed"},searchData:function(){return this.$store.state.settings.searchData},tabs:function(){return l}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchSettings")},methods:{handleSearchSelect:function(){var t=r()(n.a.mark(function t(e){var i,s,a=this;return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return i=Object.keys(this.tabs).find(function(t){return a.tabs[t].settings.includes(":pleroma"===e.group?e.key:e.group)}),t.next=3,this.$store.dispatch("SetActiveTab",i);case 3:(s=document.querySelector('[data-search="'.concat(e.key,'"]')))&&s.scrollIntoView({block:"start",behavior:"smooth"});case 5:case"end":return t.stop()}},t,this)}));return function(e){return t.apply(this,arguments)}}(),querySearch:function(t,e){e(this.searchData.filter(function(e){return e.search.find(function(e){return e.includes(t.toLowerCase())})}).map(function(t){return":opts"===t.groupKey?{value:"".concat(t.label," in Auto Linker"),group:t.groupKey,key:t.key}:{value:"".concat(t.label," in ").concat(t.groupLabel),group:t.groupKey,key:t.key}}))},settingsCantBeChanged:function(t){var e=this;return 0===t.filter(function(t){return[":esshd",":cors_plug",":quack",":logger",":swoosh",":mime"].includes(t)?-1!==e.$store.state.settings.description.findIndex(function(e){return e.group===t}):"Pleroma.Web.Auth.Authenticator"===t||":admin_token"===t?-1!==e.$store.state.settings.description.findIndex(function(e){return e.children[0].key===t}):"relays"===t?[t]:-1!==e.$store.state.settings.description.findIndex(function(e){return e.key===t})}).length}}},be=(i("SFMd"),Object(m.a)(fe,function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"settings-container",class:t.rebootIsSidebarOpen},[i("div",{staticClass:"reboot-button-container"},[i("reboot-button")],1),t._v(" "),t.isDesktop?i("div",[i("div",{staticClass:"settings-header-container",class:t.isSidebarOpen},[i("h1",{staticClass:"settings-header"},[t._v(t._s(t.$t("settings.settings")))]),t._v(" "),i("div",{staticClass:"docs-search-container"},[i("el-link",{attrs:{underline:!1,href:"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/",target:"_blank"}},[i("el-button",{staticClass:"settings-docs-button"},[i("span",[i("i",{staticClass:"el-icon-document"}),t._v("\n "+t._s(t.$t("settings.seeDocs"))+"\n ")])])],1),t._v(" "),i("el-autocomplete",{staticClass:"settings-search-input",attrs:{"fetch-suggestions":t.querySearch,"trigger-on-focus":!1,clearable:"",placeholder:"Search","prefix-icon":"el-icon-search"},on:{select:t.handleSearchSelect},model:{value:t.searchQuery,callback:function(e){t.searchQuery=e},expression:"searchQuery"}})],1)]),t._v(" "),i("el-tabs",{attrs:{"tab-position":"left"},model:{value:t.activeTab,callback:function(e){t.activeTab=e},expression:"activeTab"}},t._l(t.tabs,function(e,s){return i("el-tab-pane",{key:s,attrs:{label:t.$t(e.label),disabled:t.configDisabled||t.settingsCantBeChanged(e.settings),name:s,lazy:""}},[i(s,{tag:"component"})],1)}),1)],1):t._e(),t._v(" "),t.isMobile||t.isTablet?i("div",[i("div",{staticClass:"settings-header-container",class:t.isSidebarOpen},[i("h1",{staticClass:"settings-header"},[t._v(t._s(t.$t("settings.settings")))])]),t._v(" "),i("div",{staticClass:"nav-container"},[i("el-select",{staticClass:"settings-menu",attrs:{placeholder:"Select"},model:{value:t.activeTab,callback:function(e){t.activeTab=e},expression:"activeTab"}},t._l(t.options,function(e){return i("el-option",{key:e.value,attrs:{label:e.label,value:e.value,disabled:t.configDisabled}})}),1),t._v(" "),i("el-link",{attrs:{underline:!1,href:"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/",target:"_blank"}},[i("el-button",{staticClass:"settings-docs-button"},[i("span",[i("i",{staticClass:"el-icon-document"}),t._v("\n "+t._s(t.$t("settings.seeDocs"))+"\n ")])])],1)],1),t._v(" "),i("div",{staticClass:"settings-search-input-container"}),t._v(" "),"activityPub"===t.activeTab?i("activity-pub"):t._e(),t._v(" "),"auth"===t.activeTab?i("authentication"):t._e(),t._v(" "),"autoLinker"===t.activeTab?i("auto-linker"):t._e(),t._v(" "),"esshd"===t.activeTab?i("esshd"):t._e(),t._v(" "),"captcha"===t.activeTab?i("captcha"):t._e(),t._v(" "),"frontend"===t.activeTab?i("frontend"):t._e(),t._v(" "),"gopher"===t.activeTab?i("gopher"):t._e(),t._v(" "),"http"===t.activeTab?i("http"):t._e(),t._v(" "),"instance"===t.activeTab?i("instance"):t._e(),t._v(" "),"jobQueue"===t.activeTab?i("job-queue"):t._e(),t._v(" "),"logger"===t.activeTab?i("logger"):t._e(),t._v(" "),"mailer"===t.activeTab?i("mailer"):t._e(),t._v(" "),"mediaProxy"===t.activeTab?i("media-proxy"):t._e(),t._v(" "),"metadata"===t.activeTab?i("metadata"):t._e(),t._v(" "),"mrf"===t.activeTab?i("mrf"):t._e(),t._v(" "),"rateLimiters"===t.activeTab?i("rate-limiters"):t._e(),t._v(" "),"relays"===t.activeTab?i("relays"):t._e(),t._v(" "),"webPush"===t.activeTab?i("web-push"):t._e(),t._v(" "),"upload"===t.activeTab?i("upload"):t._e(),t._v(" "),"other"===t.activeTab?i("other"):t._e()],1):t._e()])},[],!1,null,"2b61d370",null));be.options.__file="index.vue";e.default=be.exports},apN7:function(t,e,i){"use strict";var s=i("9p49");i.n(s).a},cyzs:function(t,e,i){"use strict";var s=i("Px65");i.n(s).a},e0P1:function(t,e,i){"use strict";var s=i("TudB");i.n(s).a},fyIw:function(t,e,i){},gFOO:function(t,e,i){"use strict";var s=i("jqM2");i.n(s).a},h9z7:function(t,e,i){"use strict";var s=i("TOIk");i.n(s).a},hVXW:function(t,e,i){"use strict";var s=i("uswN");i.n(s).a},irif:function(t,e,i){"use strict";var s=i("UtFC");i.n(s).a},jqM2:function(t,e,i){},lNpP:function(t,e,i){"use strict";var s=i("UbP/");i.n(s).a},ld6V:function(t,e,i){},mADP:function(t,e,i){"use strict";var s=i("qLeA");i.n(s).a},mGnP:function(t,e,i){"use strict";var s=i("smg2");i.n(s).a},mSK5:function(t,e,i){},mstB:function(t,e,i){"use strict";var s=i("pd4h");i.n(s).a},nKzF:function(t,e,i){"use strict";var s=i("77pt");i.n(s).a},"ncj/":function(t,e,i){},pd4h:function(t,e,i){},pnah:function(t,e,i){"use strict";var s=i("JqY8");i.n(s).a},qEST:function(t,e,i){"use strict";var s=i("4NUT");i.n(s).a},qLeA:function(t,e,i){},rdar:function(t,e,i){"use strict";var s=i("NiUD");i.n(s).a},smg2:function(t,e,i){},uswN:function(t,e,i){},w5cJ:function(t,e,i){"use strict";var s=i("PYLh");i.n(s).a},wgcy:function(t,e,i){},x6RV:function(t,e,i){},y7KD:function(t,e,i){"use strict";var s=i("YKHE");i.n(s).a}}]); +//# sourceMappingURL=chunk-43ca.3debeff7.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-43ca.3debeff7.js.map b/priv/static/adminfe/static/js/chunk-43ca.3debeff7.js.map new file mode 100644 index 000000000..f7976891f --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-43ca.3debeff7.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue?c65c","webpack:///./src/views/settings/components/WebPush.vue?38e3","webpack:///./src/views/settings/components/Captcha.vue?029c","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue?ac92","webpack:///./src/views/settings/components/Authentication.vue?4503","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue?b469","webpack:///./src/views/settings/components/Upload.vue?33cd","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue?cf11","webpack:///./src/views/settings/components/Esshd.vue?eedf","webpack:///./src/views/settings/components/Relays.vue?3141","webpack:///./src/views/settings/components/Http.vue?56b1","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue?7da2","webpack:///./src/views/settings/components/Mailer.vue?cb92","webpack:///./src/views/settings/index.vue?7ecf","webpack:///./src/views/settings/components/MediaProxy.vue?e0fb","webpack:///./src/views/settings/components/inputComponents/SpecificMultipleSelect.vue?6f06","webpack:///./src/views/settings/components/RateLimiters.vue?0aac","webpack:///./src/views/settings/index.vue?8677","webpack:///./src/views/settings/components/tabs.js","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue?f6c5","webpack:///src/views/settings/components/inputComponents/AutoLinkerInput.vue","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue","webpack:///./src/views/settings/components/inputComponents/AutoLinkerInput.vue?2dcf","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue?859c","webpack:///src/views/settings/components/inputComponents/EditableKeywordInput.vue","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue?9a9b","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue?fcd8","webpack:///src/views/settings/components/inputComponents/CrontabInput.vue","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue?3c41","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue?bdb0","webpack:///src/views/settings/components/inputComponents/IconsInput.vue","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue?a391","webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue?9cfe","webpack:///src/views/settings/components/inputComponents/MascotsInput.vue","webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue","webpack:///./src/views/settings/components/inputComponents/MascotsInput.vue?df45","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue?4183","webpack:///src/views/settings/components/inputComponents/ProxyUrlInput.vue","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue?b4d0","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue?663f","webpack:///src/views/settings/components/inputComponents/PruneInput.vue","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue","webpack:///./src/views/settings/components/inputComponents/PruneInput.vue?cf76","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue?2905","webpack:///src/views/settings/components/inputComponents/RateLimitInput.vue","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue?29fc","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue?4de6","webpack:///src/views/settings/components/inputComponents/RegInvitesInput.vue","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue","webpack:///./src/views/settings/components/inputComponents/RegInvitesInput.vue?ce9b","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue?b3f6","webpack:///src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue","webpack:///./src/views/settings/components/inputComponents/SelectInputWithReducedLabels.vue?dd55","webpack:///./src/views/settings/components/inputComponents/SpecificMultipleSelect.vue?8500","webpack:///src/views/settings/components/inputComponents/SpecificMultipleSelect.vue","webpack:///./src/views/settings/components/inputComponents/SpecificMultipleSelect.vue","webpack:///./src/views/settings/components/inputComponents/SpecificMultipleSelect.vue?2aa3","webpack:///./src/views/settings/components/Inputs.vue?5b3f","webpack:///src/views/settings/components/Inputs.vue","webpack:///./src/views/settings/components/Inputs.vue","webpack:///./src/views/settings/components/Inputs.vue?c183","webpack:///./src/views/settings/components/Setting.vue?39a1","webpack:///src/views/settings/components/Setting.vue","webpack:///./src/views/settings/components/Setting.vue","webpack:///./src/views/settings/components/Setting.vue?e819","webpack:///./src/views/settings/components/ActivityPub.vue?9ad8","webpack:///src/views/settings/components/ActivityPub.vue","webpack:///./src/views/settings/components/ActivityPub.vue","webpack:///./src/views/settings/components/ActivityPub.vue?041e","webpack:///./src/views/settings/components/Authentication.vue?1922","webpack:///src/views/settings/components/Authentication.vue","webpack:///./src/views/settings/components/Authentication.vue","webpack:///./src/views/settings/components/Authentication.vue?09e5","webpack:///./src/views/settings/components/AutoLinker.vue?fed2","webpack:///src/views/settings/components/AutoLinker.vue","webpack:///./src/views/settings/components/AutoLinker.vue","webpack:///./src/views/settings/components/AutoLinker.vue?7069","webpack:///./src/views/settings/components/Captcha.vue?b5df","webpack:///src/views/settings/components/Captcha.vue","webpack:///./src/views/settings/components/Captcha.vue","webpack:///./src/views/settings/components/Captcha.vue?1a32","webpack:///./src/views/settings/components/Esshd.vue?b0ed","webpack:///src/views/settings/components/Esshd.vue","webpack:///./src/views/settings/components/Esshd.vue","webpack:///./src/views/settings/components/Esshd.vue?2ce0","webpack:///./src/views/settings/components/Frontend.vue?1622","webpack:///src/views/settings/components/Frontend.vue","webpack:///./src/views/settings/components/Frontend.vue","webpack:///./src/views/settings/components/Frontend.vue?2701","webpack:///./src/views/settings/components/Gopher.vue?cb09","webpack:///src/views/settings/components/Gopher.vue","webpack:///./src/views/settings/components/Gopher.vue","webpack:///./src/views/settings/components/Gopher.vue?290c","webpack:///./src/views/settings/components/Http.vue?0ecb","webpack:///src/views/settings/components/Http.vue","webpack:///./src/views/settings/components/Http.vue","webpack:///./src/views/settings/components/Http.vue?d5d9","webpack:///./src/views/settings/components/Instance.vue?ea1e","webpack:///src/views/settings/components/Instance.vue","webpack:///./src/views/settings/components/Instance.vue","webpack:///./src/views/settings/components/Instance.vue?20a1","webpack:///./src/views/settings/components/JobQueue.vue?e650","webpack:///src/views/settings/components/JobQueue.vue","webpack:///./src/views/settings/components/JobQueue.vue","webpack:///./src/views/settings/components/JobQueue.vue?884a","webpack:///./src/views/settings/components/Logger.vue?aa5f","webpack:///src/views/settings/components/Logger.vue","webpack:///./src/views/settings/components/Logger.vue","webpack:///./src/views/settings/components/Logger.vue?bb1c","webpack:///./src/views/settings/components/Mailer.vue?48d6","webpack:///src/views/settings/components/Mailer.vue","webpack:///./src/views/settings/components/Mailer.vue","webpack:///./src/views/settings/components/Mailer.vue?81f1","webpack:///./src/views/settings/components/MediaProxy.vue?9571","webpack:///src/views/settings/components/MediaProxy.vue","webpack:///./src/views/settings/components/MediaProxy.vue","webpack:///./src/views/settings/components/MediaProxy.vue?b888","webpack:///./src/views/settings/components/Metadata.vue?7f4f","webpack:///src/views/settings/components/Metadata.vue","webpack:///./src/views/settings/components/Metadata.vue","webpack:///./src/views/settings/components/Metadata.vue?9aed","webpack:///./src/views/settings/components/MRF.vue?274b","webpack:///src/views/settings/components/MRF.vue","webpack:///./src/views/settings/components/MRF.vue","webpack:///./src/views/settings/components/MRF.vue?7398","webpack:///./src/views/settings/components/Other.vue?7bf4","webpack:///src/views/settings/components/Other.vue","webpack:///./src/views/settings/components/Other.vue","webpack:///./src/views/settings/components/Other.vue?2b05","webpack:///./src/views/settings/components/RateLimiters.vue?15d2","webpack:///src/views/settings/components/RateLimiters.vue","webpack:///./src/views/settings/components/RateLimiters.vue","webpack:///./src/views/settings/components/RateLimiters.vue?10f8","webpack:///./src/views/settings/components/Relays.vue?72ba","webpack:///src/views/settings/components/Relays.vue","webpack:///./src/views/settings/components/Relays.vue","webpack:///./src/views/settings/components/Relays.vue?c6f8","webpack:///./src/views/settings/components/Upload.vue?304d","webpack:///src/views/settings/components/Upload.vue","webpack:///./src/views/settings/components/Upload.vue","webpack:///./src/views/settings/components/Upload.vue?cc32","webpack:///./src/views/settings/components/WebPush.vue?5451","webpack:///src/views/settings/components/WebPush.vue","webpack:///./src/views/settings/components/WebPush.vue","webpack:///./src/views/settings/components/WebPush.vue?7f8e","webpack:///./src/views/settings/index.vue?3c3a","webpack:///src/views/settings/index.vue","webpack:///./src/views/settings/index.vue","webpack:///./src/views/settings/components/Metadata.vue?0952","webpack:///./src/views/settings/components/AutoLinker.vue?42b3","webpack:///./src/views/settings/components/Instance.vue?2668","webpack:///./src/views/settings/components/Other.vue?8e53","webpack:///./src/views/settings/components/MRF.vue?8c92","webpack:///./src/views/settings/components/Frontend.vue?f18f","webpack:///./src/views/settings/components/inputComponents/RateLimitInput.vue?f3ab","webpack:///./src/views/settings/components/JobQueue.vue?d797","webpack:///./src/views/settings/components/Logger.vue?a62e","webpack:///./src/views/settings/components/inputComponents/ProxyUrlInput.vue?e239","webpack:///./src/views/settings/components/inputComponents/CrontabInput.vue?b209","webpack:///./src/views/settings/components/inputComponents/EditableKeywordInput.vue?5f84","webpack:///./src/views/settings/components/Setting.vue?ebdb","webpack:///./src/views/settings/components/ActivityPub.vue?48d9","webpack:///./src/views/settings/components/inputComponents/IconsInput.vue?5a78","webpack:///./src/views/settings/components/Gopher.vue?5fd9","webpack:///./src/views/settings/components/Inputs.vue?e1ce"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MascotsInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_WebPush_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Captcha_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_SelectInputWithReducedLabels_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Authentication_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RegInvitesInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Upload_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_PruneInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Esshd_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Relays_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Http_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_AutoLinkerInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Mailer_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_2b61d370_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MediaProxy_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_SpecificMultipleSelect_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RateLimiters_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","tabs","activity-pub","label","settings","authentication","auto-linker","esshd","captcha","frontend","gopher","http","instance","job-queue","logger","mailer","media-proxy","metadata","mrf","rate-limiters","relays","web-push","upload","other","inputComponents_AutoLinkerInputvue_type_script_lang_js_","name","props","data","type","Object","Array","default","setting","settingGroup","methods","autoLinkerBooleanValue","key","value","this","autoLinkerIntegerValue","autoLinkerStringValue","processTwoTypeValue","input","updateSetting","group","$store","dispatch","component","componentNormalizer","_vm","_h","$createElement","_c","_self","attrs","data-search","on","change","$event","_v","_e","options","__file","AutoLinkerInput","inputComponents_EditableKeywordInputvue_type_script_lang_js_","computed","editableKeywordWithInteger","isArray","includes","isDesktop","state","app","device","addRowToEditableKeyword","updatedValue","concat","toConsumableArray_default","","id","generateID","deleteEditableKeywordRow","element","deletedId","getId","filteredValues","filter","values","Math","random","toString","getKey","keys","getValue","parseEditableKeyword","inputType","_this","updatedId","map","index","defineProperty_default","objectSpread_default","updatedSettings","wrapUpdatedSettings","reduce","acc","EditableKeywordInput_component","staticClass","_l","placeholder","size","icon","circle","click","min","multiple","filterable","allow-create","EditableKeywordInput","inputComponents_CrontabInputvue_type_script_lang_js_","isMobile","isTablet","labelWidth","workers","suggestions","worker","getSuggestion","find","suggestion","update","currentValue","updatedValueWithType","CrontabInput_component","label-width","label-position","CrontabInput","inputComponents_IconsInputvue_type_script_lang_js_","addIconToIcons","addValueToIcons","i","deleteIcondRow","parseIcons","_ref","IconsInput_component","ref","IconsInput","inputComponents_MascotsInputvue_type_script_lang_js_","addRowToMascots",":url",":mime_type","deleteMascotsRow","mascot","getName","getUrl","_Object$values","slicedToArray_default","getMimeType","_Object$values3","parseMascots","mascotsWithoutIDs","_Object$values$","mascotValue","objectWithoutProperties_default","MascotsInput_component","MascotsInput","inputComponents_ProxyUrlInputvue_type_script_lang_js_","parents","required","proxyUrlData","length","socks5","host","port","updateProxyUrl","assembledData","_processNested","normalizers","reverse","valueForState","valueForUpdatedSettings","ProxyUrlInput_component","ProxyUrlInput","inputComponents_PruneInputvue_type_script_lang_js_","prune","get","set","updateRadioInput","updateIntInput","updatedSetting","processedValue","PruneInput_component","model","callback","$$v","expression","PruneInput","inputComponents_RateLimitInputvue_type_script_lang_js_","rateLimitAllUsers","rateLimitAuthUsers","rateLimitUnauthUsers","parseRateLimiter","typeOfInput","typeOfLimit","valueToSend","toggleLimits","tuple","RateLimitInput_component","RateLimitInput","inputComponents_RegInvitesInputvue_type_script_lang_js_","registrationsOpen","invitesEnabled","$confirm","confirmButtonText","cancelButtonText","then","RegInvitesInput_component","RegInvitesInput","inputComponents_SelectInputWithReducedLabelsvue_type_script_lang_js_","inputValue","prefixes",":rewrite_policy","Pleroma.Web.Auth.Authenticator",":method",":adapter",":providers",":parsers",":ttl_setters",":scrub_policy",":federation_publisher_modules",":uploader",":filters","split","renderMultipleSelect","rewritePolicyOptions","SelectInputWithReducedLabels_component","option","clearable","SelectInputWithReducedLabels","inputComponents_SpecificMultipleSelectvue_type_script_lang_js_","SpecificMultipleSelect_component","SpecificMultipleSelect","components_Inputsvue_type_script_lang_js_","components","customLabelWidth","String","labelClass","margin","Number","nested","Boolean","settingParent","canBeDeleted","_this$settingGroup","lodash_default","a","db","iconsData","substr","keywordData","reducedSelects","editableKeyword","findIndex","el","getFormattedDescription","desc","marked_default","processNestedData","parentKey","removeSetting","_removeSetting","asyncToGenerator_default","regenerator_default","mark","_callee2","wrap","_context2","prev","next","$t","_callee","config","_context","delete","subkeys","t0","abrupt","$message","message","lang","t","stop","catch","apply","arguments","renderSingleSelect","Inputs_component","class","style","slot","_s","content","placement","subSetting","setting-group","setting-parent","custom-label-width","label-class","undefined","description","domProps","innerHTML","components_Settingvue_type_script_lang_js_","Inputs","emailAdapterChildren","adapter","children","child","loading","settingKey","existingKey","compound","divideSetting","_x","tab","Setting_component","staticStyle","margin-left","Setting","components_ActivityPubvue_type_script_lang_js_","vuex_esm","activitypub","activitypubData","isSidebarOpen","sidebar","opened","labelPosition","user","userData","onSubmit","_onSubmit","ActivityPub_component","ActivityPub","components_Authenticationvue_type_script_lang_js_","auth","authData","ldap","ldapData","oauth2","oauth2Data","pleromaAuthenticator","pleromaAuthenticatorData","Authentication_component","Authentication","components_AutoLinkervue_type_script_lang_js_","autoLinker","autoLinkerData","AutoLinker_component","AutoLinker","components_Captchavue_type_script_lang_js_","captchaData","kocaptcha","kocaptchaData","Captcha_component","Captcha","components_Esshdvue_type_script_lang_js_","esshdData","toggleEsshd","Esshd_component","Esshd","components_Frontendvue_type_script_lang_js_","assets","assetsData","chat","chatData","emoji","emojiData","frontendData","markup","markupData","staticFe","staticFeData","Frontend_component","Frontend","components_Gophervue_type_script_lang_js_","gopherData","Gopher_component","Gopher","components_Httpvue_type_script_lang_js_","corsPlug","corsPlugData","httpData","httpSecurity","httpSecurityData","webCacheTtl","webCacheTtlData","Http_component","httpSignaturesData","httpSignatures","Http","components_Instancevue_type_script_lang_js_","adminToken","adminTokenData","feed","feedData","instanceData","manifest","manifestData","pleromaUser","pleromaUserData","scheduledActivity","scheduledActivityData","streamer","streamerData","uriSchemes","uriSchemesData","Instance_component","Instance","components_JobQueuevue_type_script_lang_js_","activityExpiration","activityExpirationData","obanQueues","obanQueuesData","workersData","JobQueue_component","JobQueue","components_Loggervue_type_script_lang_js_","console","consoleData","exsyslogger","exsysloggerData","loggerData","quack","quackData","Logger_component","Logger","components_Mailervue_type_script_lang_js_","emailNotifications","emailNotificationsData","mailerData","newUsersDigestEmail","newUsersDigestEmailData","swoosh","swooshData","userEmail","userEmailData","Mailer_component","Mailer","components_MediaProxyvue_type_script_lang_js_","mediaProxy","mediaProxyData","MediaProxy_component","MediaProxy","components_Metadatavue_type_script_lang_js_","metadataData","richMedia","richMediaData","Metadata_component","Metadata","components_MRFvue_type_script_lang_js_","modules","modulesData","mrfActivityExpiration","mrfActivityExpirationData","mrfSimple","mrfSimpleData","mrfRejectnonpublic","mrfRejectnonpublicData","mrfHellthread","mrfHellthreadData","mrfKeyword","mrfKeywordData","mrfObjectAge","mrfObjectAgeData","mrfSubchain","mrfSubchainData","mrfMention","mrfMentionData","mrfNormalizeMarkup","mrfNormalizeMarkupData","mrfVocabulary","mrfVocabularyData","MRF_component","MRF","components_Othervue_type_script_lang_js_","mimeTypes","mimeTypesData","remoteIp","remoteIpData","Other_component","Other","components_RateLimitersvue_type_script_lang_js_","rateLimiters","rateLimitersData","RateLimiters_component","RateLimiters","components_Relaysvue_type_script_lang_js_","newRelay","fetchedRelays","relaysTable","relay","mounted","followRelay","deleteRelay","Relays_component","nativeOn","keyup","indexOf","_k","keyCode","prop","fixed","width","scopedSlots","_u","fn","scope","row","Relays","components_Uploadvue_type_script_lang_js_","showUploadersS3","showUploadersLocal","uploadData","uploadersLocal","uploadersLocalData","uploadersS3","uploadersS3Data","uploadFilterMogrify","uploadFilterMogrifyData","uploadAnonymizeFilename","uploadAnonymizeFilenameData","Upload_component","Upload","components_WebPushvue_type_script_lang_js_","vapidDetails","vapidDetailsData","WebPush_component","WebPush","views_settingsvue_type_script_lang_js_","Mrf","RebootButton","searchQuery","activeTab","configDisabled","rebootIsSidebarOpen","searchData","tabs_tabs","handleSearchSelect","_handleSearchSelect","selectedValue","selectedSetting","document","querySelector","scrollIntoView","block","behavior","querySearch","queryString","cb","searchObj","search","toLowerCase","groupKey","groupLabel","settingsCantBeChanged","_this2","settings_component","underline","href","target","fetch-suggestions","trigger-on-focus","prefix-icon","select","tab-position","componentName","disabled","lazy","tag","item","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Metadata_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_AutoLinker_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Instance_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Other_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MRF_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Frontend_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RateLimitInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_JobQueue_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Logger_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ProxyUrlInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_CrontabInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_EditableKeywordInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Setting_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ActivityPub_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_IconsInput_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Gopher_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Inputs_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__"],"mappings":"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","file":"static/js/chunk-43ca.3debeff7.js","sourcesContent":["import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=2b61d370&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=2b61d370&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpecificMultipleSelect.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpecificMultipleSelect.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"settings-container\",class:_vm.rebootIsSidebarOpen},[_c('div',{staticClass:\"reboot-button-container\"},[_c('reboot-button')],1),_vm._v(\" \"),(_vm.isDesktop)?_c('div',[_c('div',{staticClass:\"settings-header-container\",class:_vm.isSidebarOpen},[_c('h1',{staticClass:\"settings-header\"},[_vm._v(_vm._s(_vm.$t('settings.settings')))]),_vm._v(\" \"),_c('div',{staticClass:\"docs-search-container\"},[_c('el-link',{attrs:{\"underline\":false,\"href\":\"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"settings-docs-button\"},[_c('span',[_c('i',{staticClass:\"el-icon-document\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.seeDocs'))+\"\\n \")])])],1),_vm._v(\" \"),_c('el-autocomplete',{staticClass:\"settings-search-input\",attrs:{\"fetch-suggestions\":_vm.querySearch,\"trigger-on-focus\":false,\"clearable\":\"\",\"placeholder\":\"Search\",\"prefix-icon\":\"el-icon-search\"},on:{\"select\":_vm.handleSearchSelect},model:{value:(_vm.searchQuery),callback:function ($$v) {_vm.searchQuery=$$v},expression:\"searchQuery\"}})],1)]),_vm._v(\" \"),_c('el-tabs',{attrs:{\"tab-position\":\"left\"},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},_vm._l((_vm.tabs),function(value,componentName){return _c('el-tab-pane',{key:componentName,attrs:{\"label\":_vm.$t(value.label),\"disabled\":_vm.configDisabled || _vm.settingsCantBeChanged(value.settings),\"name\":componentName,\"lazy\":\"\"}},[_c(componentName,{tag:\"component\"})],1)}),1)],1):_vm._e(),_vm._v(\" \"),(_vm.isMobile || _vm.isTablet)?_c('div',[_c('div',{staticClass:\"settings-header-container\",class:_vm.isSidebarOpen},[_c('h1',{staticClass:\"settings-header\"},[_vm._v(_vm._s(_vm.$t('settings.settings')))])]),_vm._v(\" \"),_c('div',{staticClass:\"nav-container\"},[_c('el-select',{staticClass:\"settings-menu\",attrs:{\"placeholder\":\"Select\"},model:{value:(_vm.activeTab),callback:function ($$v) {_vm.activeTab=$$v},expression:\"activeTab\"}},_vm._l((_vm.options),function(item){return _c('el-option',{key:item.value,attrs:{\"label\":item.label,\"value\":item.value,\"disabled\":_vm.configDisabled}})}),1),_vm._v(\" \"),_c('el-link',{attrs:{\"underline\":false,\"href\":\"https://docs-develop.pleroma.social/backend/administration/CLI_tasks/config/\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"settings-docs-button\"},[_c('span',[_c('i',{staticClass:\"el-icon-document\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.seeDocs'))+\"\\n \")])])],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"settings-search-input-container\"}),_vm._v(\" \"),(_vm.activeTab === 'activityPub')?_c('activity-pub'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'auth')?_c('authentication'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'autoLinker')?_c('auto-linker'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'esshd')?_c('esshd'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'captcha')?_c('captcha'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'frontend')?_c('frontend'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'gopher')?_c('gopher'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'http')?_c('http'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'instance')?_c('instance'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'jobQueue')?_c('job-queue'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'logger')?_c('logger'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'mailer')?_c('mailer'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'mediaProxy')?_c('media-proxy'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'metadata')?_c('metadata'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'mrf')?_c('mrf'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'rateLimiters')?_c('rate-limiters'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'relays')?_c('relays'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'webPush')?_c('web-push'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'upload')?_c('upload'):_vm._e(),_vm._v(\" \"),(_vm.activeTab === 'other')?_c('other'):_vm._e()],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export const tabs = {\n 'activity-pub': {\n label: 'settings.activityPub',\n settings: [':activitypub', ':user']\n },\n 'authentication': {\n label: 'settings.auth',\n settings: [':auth', ':ldap', ':oauth2', 'Pleroma.Web.Auth.Authenticator']\n },\n 'auto-linker': {\n label: 'settings.autoLinker',\n settings: [':opts']\n },\n 'esshd': {\n label: 'settings.esshd',\n settings: [':esshd']\n },\n 'captcha': {\n label: 'settings.captcha',\n settings: ['Pleroma.Captcha', 'Pleroma.Captcha.Kocaptcha']\n },\n 'frontend': {\n label: 'settings.frontend',\n settings: [':assets', ':chat', ':emoji', ':frontend_configurations', ':markup', ':static_fe']\n },\n 'gopher': {\n label: 'settings.gopher',\n settings: [':gopher']\n },\n 'http': {\n label: 'settings.http',\n settings: [':cors_plug', ':http', ':http_security', ':web_cache_ttl']\n },\n 'instance': {\n label: 'settings.instance',\n settings: [':admin_token', ':instance', ':manifest', 'Pleroma.User', 'Pleroma.ScheduledActivity', ':uri_schemes', ':feed', ':streamer']\n },\n 'job-queue': {\n label: 'settings.jobQueue',\n settings: ['Pleroma.ActivityExpiration', 'Oban', ':workers']\n },\n 'logger': {\n label: 'settings.logger',\n settings: [':console', ':ex_syslogger', ':quack', ':logger']\n },\n 'mailer': {\n label: 'settings.mailer',\n settings: [':email_notifications', 'Pleroma.Emails.Mailer', 'Pleroma.Emails.UserEmail', ':swoosh', 'Pleroma.Emails.NewUsersDigestEmail']\n },\n 'media-proxy': {\n label: 'settings.mediaProxy',\n settings: [':media_proxy']\n },\n 'metadata': {\n label: 'settings.metadata',\n settings: ['Pleroma.Web.Metadata', ':rich_media']\n },\n 'mrf': {\n label: 'settings.mrf',\n settings: [':mrf_simple', ':mrf_rejectnonpublic', ':mrf_hellthread', ':mrf_keyword', ':mrf_subchain', ':mrf_mention', ':mrf_normalize_markup', ':mrf_vocabulary', ':mrf_object_age', ':modules']\n },\n 'rate-limiters': {\n label: 'settings.rateLimiters',\n settings: [':rate_limit']\n },\n 'relays': {\n label: 'settings.relays',\n settings: ['relays']\n },\n 'web-push': {\n label: 'settings.webPush',\n settings: [':vapid_details']\n },\n 'upload': {\n label: 'settings.upload',\n settings: ['Pleroma.Upload.Filter.AnonymizeFilename', 'Pleroma.Upload.Filter.Mogrify', 'Pleroma.Uploaders.S3', 'Pleroma.Uploaders.Local', 'Pleroma.Upload']\n },\n 'other': {\n label: 'settings.other',\n settings: [':mime', 'Pleroma.Plugs.RemoteIp']\n }\n}\n","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinkerInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./AutoLinkerInput.vue?vue&type=template&id=cea0b11a&\"\nimport script from \"./AutoLinkerInput.vue?vue&type=script&lang=js&\"\nexport * from \"./AutoLinkerInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AutoLinkerInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"AutoLinkerInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.setting.key === ':class' || _vm.setting.key === ':rel')?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-switch',{attrs:{\"value\":_vm.autoLinkerBooleanValue(_vm.setting.key)},on:{\"change\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}),_vm._v(\" \"),(_vm.autoLinkerBooleanValue(_vm.setting.key))?_c('el-input',{attrs:{\"value\":_vm.autoLinkerStringValue(_vm.setting.key)},on:{\"input\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':truncate')?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-switch',{attrs:{\"value\":_vm.autoLinkerBooleanValue(_vm.setting.key)},on:{\"change\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}),_vm._v(\" \"),(_vm.autoLinkerBooleanValue(_vm.setting.key))?_c('el-input-number',{attrs:{\"value\":_vm.autoLinkerIntegerValue(_vm.setting.key)},on:{\"input\":function($event){return _vm.processTwoTypeValue($event, _vm.setting.key)}}}):_vm._e()],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./EditableKeywordInput.vue?vue&type=template&id=59edcd40&\"\nimport script from \"./EditableKeywordInput.vue?vue&type=script&lang=js&\"\nexport * from \"./EditableKeywordInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditableKeywordInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"EditableKeywordInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"editable-keyword-container\"},[(_vm.setting.key === ':replace')?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(element){return _c('div',{key:_vm.getId(element),staticClass:\"setting-input\"},[_c('el-input',{staticClass:\"name-input\",attrs:{\"value\":_vm.getKey(element),\"placeholder\":\"pattern\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'key', element)}}}),_vm._v(\" :\\n \"),_c('el-input',{staticClass:\"value-input\",attrs:{\"value\":_vm.getValue(element),\"placeholder\":\"replacement\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'value', element)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteEditableKeywordRow(element)}}})],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToEditableKeyword}})],2):(_vm.editableKeywordWithInteger)?_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(element){return _c('div',{key:_vm.getId(element),staticClass:\"setting-input\"},[_c('el-input',{staticClass:\"name-input\",attrs:{\"value\":_vm.getKey(element),\"placeholder\":\"key\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'key', element)}}}),_vm._v(\" :\\n \"),_c('el-input-number',{staticClass:\"value-input\",attrs:{\"value\":_vm.getValue(element),\"min\":0,\"size\":\"large\"},on:{\"change\":function($event){return _vm.parseEditableKeyword($event, 'value', element)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteEditableKeywordRow(element)}}})],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToEditableKeyword}})],2):_c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(element){return _c('div',{key:_vm.getId(element),staticClass:\"setting-input\"},[_c('el-input',{staticClass:\"name-input\",attrs:{\"value\":_vm.getKey(element),\"placeholder\":\"key\"},on:{\"input\":function($event){return _vm.parseEditableKeyword($event, 'key', element)}}}),_vm._v(\" :\\n \"),_c('el-select',{staticClass:\"value-input\",attrs:{\"value\":_vm.getValue(element),\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.parseEditableKeyword($event, 'value', element)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteEditableKeywordRow(element)}}})],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToEditableKeyword}})],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./CrontabInput.vue?vue&type=template&id=55e14917&\"\nimport script from \"./CrontabInput.vue?vue&type=script&lang=js&\"\nexport * from \"./CrontabInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CrontabInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"CrontabInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-form',{staticClass:\"crontab\",attrs:{\"label-width\":_vm.labelWidth,\"label-position\":_vm.isMobile ? 'top' : 'right'}},_vm._l((_vm.workers),function(worker){return _c('el-form-item',{key:worker,staticClass:\"crontab-container\",attrs:{\"label\":worker,\"data-search\":_vm.setting.key}},[_c('el-input',{staticClass:\"input setting-input\",attrs:{\"value\":_vm.data[worker],\"placeholder\":_vm.getSuggestion(worker) || null},on:{\"input\":function($event){return _vm.update($event, worker)}}})],1)}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./IconsInput.vue?vue&type=template&id=0e981ae9&\"\nimport script from \"./IconsInput.vue?vue&type=script&lang=js&\"\nexport * from \"./IconsInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./IconsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"IconsInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mascot-container\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(icon,index){return _c('div',{key:index,staticClass:\"mascot\"},[_c('div',{staticClass:\"icons-container\"},[_c('div',{staticClass:\"icon-container\"},_vm._l((icon),function(ref){\nvar key = ref.key;\nvar value = ref.value;\nvar id = ref.id;\nreturn _c('div',{key:id,staticClass:\"icon-values-container\"},[_c('el-input',{staticClass:\"icon-key-input\",attrs:{\"value\":key,\"placeholder\":\"key\"},on:{\"input\":function($event){return _vm.parseIcons($event, 'key', index, id)}}}),_vm._v(\" :\\n \"),_c('el-input',{staticClass:\"icon-value-input\",attrs:{\"value\":value,\"placeholder\":\"value\"},on:{\"input\":function($event){return _vm.parseIcons($event, 'value', index, id)}}})],1)}),0),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteIcondRow(index)}}})],1),_vm._v(\" \"),_c('div',{staticClass:\"icons-button-container\"},[_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.addValueToIcons(index)}}}),_vm._v(\" \"),_c('span',{staticClass:\"icons-button-desc\"},[_vm._v(\"Add another `key - value` pair to this icon\")])],1),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"})],1)}),_vm._v(\" \"),_c('div',{staticClass:\"icons-button-container\"},[_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addIconToIcons}}),_vm._v(\" \"),_c('span',{staticClass:\"icons-button-desc\"},[_vm._v(\"Add another icon configuration\")])],1)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MascotsInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MascotsInput.vue?vue&type=template&id=0015a0e3&\"\nimport script from \"./MascotsInput.vue?vue&type=script&lang=js&\"\nexport * from \"./MascotsInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MascotsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"MascotsInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"mascot-container\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_vm._l((_vm.data),function(mascot){return _c('div',{key:_vm.getId(mascot),staticClass:\"mascot\"},[_c('el-form-item',{staticClass:\"mascot-form-item\",attrs:{\"label\":\"Name\",\"label-width\":\"85px\"}},[_c('div',{staticClass:\"mascot-name-container\"},[_c('el-input',{staticClass:\"mascot-name-input\",attrs:{\"value\":_vm.getName(mascot),\"placeholder\":\"Name\"},on:{\"input\":function($event){return _vm.parseMascots($event, 'name', mascot)}}}),_vm._v(\" \"),_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.deleteMascotsRow(mascot)}}})],1)]),_vm._v(\" \"),_c('el-form-item',{staticClass:\"mascot-form-item\",attrs:{\"label\":\"URL\",\"label-width\":\"85px\"}},[_c('el-input',{staticClass:\"mascot-input\",attrs:{\"value\":_vm.getUrl(mascot),\"placeholder\":\"URL\"},on:{\"input\":function($event){return _vm.parseMascots($event, 'url', mascot)}}})],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"mascot-form-item\",attrs:{\"label\":\"Mime type\",\"label-width\":\"85px\"}},[_c('el-input',{staticClass:\"mascot-input\",attrs:{\"value\":_vm.getMimeType(mascot),\"placeholder\":\"Mime type\"},on:{\"input\":function($event){return _vm.parseMascots($event, 'mimeType', mascot)}}})],1)],1)}),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":_vm.addRowToMascots}})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ProxyUrlInput.vue?vue&type=template&id=9a053e1c&\"\nimport script from \"./ProxyUrlInput.vue?vue&type=script&lang=js&\"\nexport * from \"./ProxyUrlInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ProxyUrlInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ProxyUrlInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"proxy-url-input\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-input',{staticClass:\"proxy-url-host-input\",attrs:{\"value\":_vm.proxyUrlData.host,\"placeholder\":\"host (e.g. localhost or 127.0.0.1)\"},on:{\"input\":function($event){return _vm.updateProxyUrl($event, 'host')}}}),_vm._v(\" \"),(_vm.isDesktop)?_c('span',[_vm._v(\":\")]):_vm._e(),_vm._v(\" \"),_c('el-input',{staticClass:\"proxy-url-value-input\",attrs:{\"value\":_vm.proxyUrlData.port,\"placeholder\":\"port (e.g 9020 or 3090)\"},on:{\"input\":function($event){return _vm.updateProxyUrl($event, 'port')}}}),_vm._v(\" \"),_c('div',{staticClass:\"socks5-checkbox-container\"},[_c('el-checkbox',{attrs:{\"value\":_vm.proxyUrlData.socks5},on:{\"change\":function($event){return _vm.updateProxyUrl($event, 'socks5')}}}),_vm._v(\" \"),_c('span',{staticClass:\"socks5-checkbox\"},[_vm._v(\"Socks5\")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PruneInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./PruneInput.vue?vue&type=template&id=172a9876&\"\nimport script from \"./PruneInput.vue?vue&type=script&lang=js&\"\nexport * from \"./PruneInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PruneInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"PruneInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('el-radio-group',{staticClass:\"prune-options\",model:{value:(_vm.prune),callback:function ($$v) {_vm.prune=$$v},expression:\"prune\"}},[_c('el-radio',{attrs:{\"label\":\":disabled\"}},[_vm._v(\"Disabled\")]),_vm._v(\" \"),_c('el-radio',{attrs:{\"label\":\":maxlen\"}},[_vm._v(\"Limit-based\")]),_vm._v(\" \"),_c('el-radio',{attrs:{\"label\":\":maxage\"}},[_vm._v(\"Time-based\")])],1),_vm._v(\" \"),(_vm.prune === ':maxlen')?_c('el-form-item',{attrs:{\"label\":\"max length\",\"label-width\":\"100\",\"label-position\":\"left\"}},[_c('el-input-number',{staticClass:\"top-margin\",attrs:{\"value\":_vm.data[1],\"min\":0,\"placeholder\":\"1500\",\"size\":\"large\"},on:{\"change\":function($event){return _vm.updateIntInput($event, ':maxlen')}}})],1):_vm._e(),_vm._v(\" \"),(_vm.prune === ':maxage')?_c('el-form-item',{attrs:{\"label\":\"max age\",\"label-width\":\"100\",\"label-position\":\"left\"}},[_c('el-input-number',{staticClass:\"top-margin\",attrs:{\"value\":_vm.data[1],\"min\":0,\"placeholder\":\"3600\",\"size\":\"large\"},on:{\"change\":function($event){return _vm.updateIntInput($event, ':maxage')}}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RateLimitInput.vue?vue&type=template&id=7eaf4b58&\"\nimport script from \"./RateLimitInput.vue?vue&type=script&lang=js&\"\nexport * from \"./RateLimitInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RateLimitInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RateLimitInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"rate-limit-container\",attrs:{\"data-search\":_vm.setting.key || _vm.setting.group}},[(!_vm.rateLimitAuthUsers)?_c('div',[_c('el-input',{staticClass:\"scale-input\",attrs:{\"value\":_vm.rateLimitAllUsers[0],\"placeholder\":\"scale\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'scale', 'oneLimit', _vm.rateLimitAllUsers)}}}),_vm._v(\" \"),_c('span',[_vm._v(\":\")]),_vm._v(\" \"),_c('el-input',{staticClass:\"limit-input\",attrs:{\"value\":_vm.rateLimitAllUsers[1],\"placeholder\":\"limit\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'limit', 'oneLimit', _vm.rateLimitAllUsers)}}}),_vm._v(\" \"),_c('div',{staticClass:\"limit-button-container\"},[_c('el-button',{attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-plus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.toggleLimits([['', ''], ['', '']], _vm.setting.key)}}}),_vm._v(\" \"),_c('p',{staticClass:\"expl limit-expl\"},[_vm._v(\"Set different limits for unauthenticated and authenticated users\")])],1)],1):_vm._e(),_vm._v(\" \"),(_vm.rateLimitAuthUsers)?_c('div',[_c('el-form-item',{staticClass:\"rate-limit\"},[_c('div',{staticClass:\"rate-limit-label-container\"},[_c('span',{staticClass:\"rate-limit-label\"},[_vm._v(\"\\n Unauthenticated users:\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"rate-limit-content\"},[_c('el-input',{staticClass:\"scale-input\",attrs:{\"value\":_vm.rateLimitUnauthUsers[0],\"placeholder\":\"scale\"},on:{\"input\":function($event){return _vm.parseRateLimiter(\n $event, _vm.setting.key, 'scale', 'unauthUsersLimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers]\n )}}}),_vm._v(\" \"),_c('span',[_vm._v(\":\")]),_vm._v(\" \"),_c('el-input',{staticClass:\"limit-input\",attrs:{\"value\":_vm.rateLimitUnauthUsers[1],\"placeholder\":\"limit\"},on:{\"input\":function($event){return _vm.parseRateLimiter(\n $event, _vm.setting.key, 'limit', 'unauthUsersLimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers]\n )}}})],1)]),_vm._v(\" \"),_c('el-form-item',{staticClass:\"rate-limit\"},[_c('div',{staticClass:\"rate-limit-label-container\"},[_c('span',{staticClass:\"rate-limit-label\"},[_vm._v(\"\\n Authenticated users:\\n \")])]),_vm._v(\" \"),_c('div',{staticClass:\"rate-limit-content\"},[_c('el-input',{staticClass:\"scale-input\",attrs:{\"value\":_vm.rateLimitAuthUsers[0],\"placeholder\":\"scale\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'scale', 'authUserslimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers])}}}),_vm._v(\" \"),_c('span',[_vm._v(\":\")]),_vm._v(\" \"),_c('el-input',{staticClass:\"limit-input\",attrs:{\"value\":_vm.rateLimitAuthUsers[1],\"placeholder\":\"limit\"},on:{\"input\":function($event){return _vm.parseRateLimiter($event, _vm.setting.key, 'limit', 'authUserslimit', [_vm.rateLimitUnauthUsers, _vm.rateLimitAuthUsers])}}})],1)]),_vm._v(\" \"),_c('div',{staticClass:\"limit-button-container\"},[_c('el-button',{staticClass:\"icon-minus-button\",attrs:{\"size\":_vm.isDesktop ? 'medium' : 'mini',\"icon\":\"el-icon-minus\",\"circle\":\"\"},on:{\"click\":function($event){return _vm.toggleLimits(['', ''], _vm.setting.key)}}}),_vm._v(\" \"),_c('p',{staticClass:\"expl limit-expl\"},[_vm._v(\"Set limit for all users\")])],1)],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RegInvitesInput.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RegInvitesInput.vue?vue&type=template&id=55c7fa7c&\"\nimport script from \"./RegInvitesInput.vue?vue&type=script&lang=js&\"\nexport * from \"./RegInvitesInput.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RegInvitesInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RegInvitesInput.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-switch',{staticClass:\"switch-input\",attrs:{\"value\":_vm.data[_vm.setting.key],\"data-search\":_vm.setting.key},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./SelectInputWithReducedLabels.vue?vue&type=template&id=240dfbe9&\"\nimport script from \"./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"\nexport * from \"./SelectInputWithReducedLabels.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SelectInputWithReducedLabels.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SelectInputWithReducedLabels.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"input\"},[(_vm.renderMultipleSelect(_vm.setting.type))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key,\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},_vm._l((_vm.options(_vm.setting.suggestions)),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option.value,\"label\":option.label}})}),1):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'module' || (_vm.setting.type.includes('atom') && _vm.setting.type.includes('dropdown')))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue === false ? 'false' : _vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"clearable\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},_vm._l((_vm.options(_vm.setting.suggestions)),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option.value,\"label\":option.label}})}),1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpecificMultipleSelect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SpecificMultipleSelect.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./SpecificMultipleSelect.vue?vue&type=template&id=01ef7cc8&\"\nimport script from \"./SpecificMultipleSelect.vue?vue&type=script&lang=js&\"\nexport * from \"./SpecificMultipleSelect.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SpecificMultipleSelect.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SpecificMultipleSelect.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"multiple-select-container\"},[(_vm.setting.key === ':backends')?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.data.value,\"data-search\":_vm.setting.key || _vm.setting.group,\"multiple\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},[_c('el-option',{attrs:{\"value\":\":console\",\"label\":\"console\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\":ex_syslogger\",\"label\":\"ExSyslogger\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"Quack.Logger\",\"label\":\"Quack.Logger\"}})],1):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':args')?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.data[_vm.setting.key],\"data-search\":_vm.setting.key || _vm.setting.group,\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.updateSetting($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.setting.key, _vm.setting.type)}}},[_c('el-option',{attrs:{\"value\":\"strip\",\"label\":\"strip\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"auto-orient\",\"label\":\"auto-orient\"}}),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"implode\",\"label\":\"implode\"}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Inputs.vue?vue&type=template&id=985a7090&\"\nimport script from \"./Inputs.vue?vue&type=script&lang=js&\"\nexport * from \"./Inputs.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Inputs.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Inputs.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"input-container\"},[(_vm.setting.type === 'keyword')?_c('div',{staticClass:\"keyword-container\"},[_c('el-form-item',{class:_vm.labelClass,style:((\"margin-left:\" + _vm.margin + \"px;margin-bottom:0\")),attrs:{\"label-width\":_vm.customLabelWidth,\"data-search\":_vm.setting.key || _vm.setting.group}},[_c('span',{attrs:{\"slot\":\"label\"},slot:\"label\"},[_vm._v(\"\\n \"+_vm._s(_vm.setting.label)+\"\\n \"),(_vm.canBeDeleted && _vm.isDesktop)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"delete-setting-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":_vm.removeSetting}})],1):_vm._e()],1)]),_vm._v(\" \"),_vm._l((_vm.setting.children),function(subSetting){return _c('el-form-item',{key:subSetting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting-parent\":_vm.settingParent.concat( [subSetting]),\"setting\":subSetting,\"data\":_vm.data[_vm.setting.key],\"custom-label-width\":_vm.isMobile ? '100px' : '120px',\"label-class\":subSetting.type === 'keyword' ? 'center-label' : '',\"margin\":_vm.isDesktop ? _vm.margin + 15 : _vm.margin + 8,\"nested\":true}})],1)})],2):_vm._e(),_vm._v(\" \"),(_vm.setting.type !== 'keyword')?_c('el-form-item',{class:_vm.labelClass,style:(_vm.isDesktop ? '' : (\"margin-left:\" + _vm.margin + \"px\")),attrs:{\"label-width\":_vm.customLabelWidth}},[_c('span',{attrs:{\"slot\":\"label\"},slot:\"label\"},[_vm._v(\"\\n \"+_vm._s(_vm.setting.label)+\"\\n \"),(_vm.canBeDeleted && (_vm.isDesktop || _vm.isMobile))?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"delete-setting-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":_vm.removeSetting}})],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"input-row\"},[(_vm.setting.type === 'string' || (_vm.setting.type.includes('string') && _vm.setting.type.includes('atom')))?_c('el-input',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"placeholder\":_vm.setting.suggestions ? _vm.setting.suggestions[0] : null,\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"input\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'boolean' && ![':registrations_open', ':invites_enabled'].includes(_vm.setting.key))?_c('el-switch',{staticClass:\"switch-input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'integer')?_c('el-input-number',{attrs:{\"value\":_vm.inputValue === null ? undefined : _vm.inputValue,\"placeholder\":_vm.setting.suggestions ? _vm.setting.suggestions[0].toString() : null,\"min\":0,\"size\":_vm.isDesktop ? 'large' : 'medium',\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(_vm.renderSingleSelect(_vm.setting.type))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue === false ? 'false' : _vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"clearable\":\"\"},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}},_vm._l((_vm.setting.suggestions),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option}})}),1):_vm._e(),_vm._v(\" \"),(_vm.renderMultipleSelect(_vm.setting.type))?_c('el-select',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"multiple\":\"\",\"filterable\":\"\",\"allow-create\":\"\"},on:{\"change\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}},_vm._l((_vm.setting.suggestions),function(option,index){return _c('el-option',{key:index,attrs:{\"value\":option}})}),1):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':ip')?_c('el-input',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"data-search\":_vm.setting.key || _vm.setting.group,\"placeholder\":\"xxx.xxx.xxx.xx\"},on:{\"input\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}}):_vm._e(),_vm._v(\" \"),(_vm.setting.type === 'atom')?_c('el-input',{staticClass:\"input\",attrs:{\"value\":_vm.inputValue,\"placeholder\":_vm.setting.suggestions[0] ? _vm.setting.suggestions[0].substr(1) : '',\"data-search\":_vm.setting.key || _vm.setting.group},on:{\"input\":function($event){return _vm.update($event, _vm.settingGroup.group, _vm.settingGroup.key, _vm.settingParent, _vm.setting.key, _vm.setting.type, _vm.nested)}}},[_c('template',{slot:\"prepend\"},[_vm._v(\":\")])],2):_vm._e(),_vm._v(\" \"),(_vm.settingGroup.group === ':auto_linker')?_c('auto-linker-input',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':crontab')?_c('crontab-input',{attrs:{\"data\":_vm.data[_vm.setting.key],\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.editableKeyword(_vm.setting.key, _vm.setting.type))?_c('editable-keyword-input',{attrs:{\"data\":_vm.keywordData,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':icons')?_c('icons-input',{attrs:{\"data\":_vm.iconsData,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':mascots')?_c('mascots-input',{attrs:{\"data\":_vm.keywordData,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':proxy_url')?_c('proxy-url-input',{attrs:{\"data\":_vm.data[_vm.setting.key],\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting,\"parents\":_vm.settingParent}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':prune')?_c('prune-input',{attrs:{\"data\":_vm.data[_vm.setting.key],\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.settingGroup.key === ':rate_limit')?_c('rate-limit-input',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),([':registrations_open', ':invites_enabled'].includes(_vm.setting.key))?_c('reg-invites-input',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.reducedSelects)?_c('select-input-with-reduced-labels',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.setting.key === ':backends' || _vm.setting.key === ':args')?_c('specific-multiple-select',{attrs:{\"data\":_vm.data,\"setting-group\":_vm.settingGroup,\"setting\":_vm.setting}}):_vm._e(),_vm._v(\" \"),(_vm.canBeDeleted && _vm.isTablet)?_c('el-tooltip',{staticClass:\"delete-setting-button-container\",attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"delete-setting-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":_vm.removeSetting}})],1):_vm._e()],1),_vm._v(\" \"),(_vm.setting.description && _vm.setting.type !== 'keyword')?_c('div',{staticClass:\"expl\",domProps:{\"innerHTML\":_vm._s(_vm.getFormattedDescription(_vm.setting.description))}}):_vm._e()]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Setting.vue?vue&type=template&id=812c4b58&\"\nimport script from \"./Setting.vue?vue&type=script&lang=js&\"\nexport * from \"./Setting.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Setting.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Setting.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',[(_vm.settingGroup.label || _vm.settingGroup.description)?_c('el-form-item',{staticClass:\"description-container\",attrs:{\"data-search\":_vm.settingGroup.key || _vm.settingGroup.group}},[(_vm.settingGroup.label)?_c('span',{staticClass:\"setting-label\"},[_vm._v(_vm._s(_vm.settingGroup.label))]):_vm._e(),_vm._v(\" \"),(_vm.settingGroup.description)?_c('span',{staticClass:\"expl no-top-margin\",domProps:{\"innerHTML\":_vm._s(_vm.getFormattedDescription(_vm.settingGroup.description))}}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.settingGroup.key === 'Pleroma.Emails.Mailer')?_c('div',[_vm._l((_vm.settingGroup.children.filter(function (setting) { return !setting.group; })),function(setting){return _c('div',{key:setting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data}})],1)}),_vm._v(\" \"),_vm._l((_vm.emailAdapterChildren),function(setting){return _c('div',{key:setting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data}})],1)})],2):_c('div',_vm._l((_vm.settingGroup.children),function(setting){return _c('div',{key:setting.key},[(!_vm.compound(setting))?_c('div',[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data,\"nested\":false}})],1):_vm._e(),_vm._v(\" \"),(_vm.compound(setting))?_c('div',[(_vm.divideSetting(setting.key))?_c('el-divider',{staticClass:\"divider\"}):_vm._e(),_vm._v(\" \"),(!setting.children)?_c('div',[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting\":setting,\"data\":_vm.data[setting.key],\"nested\":true}})],1):_c('div',[_c('div',{staticClass:\"input-container\"},[_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":setting.key || setting.group}},[_c('span',{attrs:{\"slot\":\"label\"},slot:\"label\"},[(_vm.isDesktop && _vm.canBeDeleted(setting.key))?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticStyle:{\"margin-left\":\"5px\"},attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":function($event){return _vm.removeSetting(setting.key)}}})],1):_vm._e()],1),_vm._v(\" \"),_c('span',{staticClass:\"label-font\"},[_vm._v(_vm._s(setting.label))]),_vm._v(\" \"),(_vm.canBeDeleted(setting.key) && (_vm.isMobile || _vm.isTablet))?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.removeFromDB'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"settings-delete-button\",attrs:{\"icon\":\"el-icon-delete\",\"circle\":\"\",\"size\":\"mini\"},on:{\"click\":function($event){return _vm.removeSetting(setting.key)}}})],1):_vm._e()],1)],1),_vm._v(\" \"),_vm._l((setting.children),function(subSetting){return _c('div',{key:subSetting.key},[_c('inputs',{attrs:{\"setting-group\":_vm.settingGroup,\"setting-parent\":[setting, subSetting],\"setting\":subSetting,\"data\":_vm.data[setting.key],\"nested\":true}})],1)})],2),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"})],1):_vm._e()])}),0)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ActivityPub.vue?vue&type=template&id=61d2885c&\"\nimport script from \"./ActivityPub.vue?vue&type=script&lang=js&\"\nexport * from \"./ActivityPub.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ActivityPub.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ActivityPub.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"activitypubData\",attrs:{\"model\":_vm.activitypubData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth,\"data-search\":\":activitypub\"}},[_c('setting',{attrs:{\"setting-group\":_vm.activitypub,\"data\":_vm.activitypubData}})],1),_vm._v(\" \"),(_vm.activitypub)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"userData\",attrs:{\"model\":_vm.userData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth,\"data-search\":\":user\"}},[_c('setting',{attrs:{\"setting-group\":_vm.user,\"data\":_vm.userData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Authentication.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Authentication.vue?vue&type=template&id=fc990042&\"\nimport script from \"./Authentication.vue?vue&type=script&lang=js&\"\nexport * from \"./Authentication.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Authentication.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Authentication.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"pleromaAuthenticatorData\",attrs:{\"model\":_vm.pleromaAuthenticatorData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.pleromaAuthenticator,\"data\":_vm.pleromaAuthenticatorData}})],1),_vm._v(\" \"),(_vm.pleromaAuthenticator)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"authData\",attrs:{\"model\":_vm.authData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.auth,\"data\":_vm.authData}})],1),_vm._v(\" \"),(_vm.auth)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"ldapData\",attrs:{\"model\":_vm.ldapData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.ldap,\"data\":_vm.ldapData}})],1),_vm._v(\" \"),(_vm.oauth2)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"oauth2\",attrs:{\"model\":_vm.oauth2Data,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.oauth2,\"data\":_vm.oauth2Data}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./AutoLinker.vue?vue&type=template&id=11b09d35&\"\nimport script from \"./AutoLinker.vue?vue&type=script&lang=js&\"\nexport * from \"./AutoLinker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AutoLinker.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"AutoLinker.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"autoLinker\",attrs:{\"model\":_vm.autoLinkerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.autoLinker,\"data\":_vm.autoLinkerData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Captcha.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Captcha.vue?vue&type=template&id=a0aa4d3a&\"\nimport script from \"./Captcha.vue?vue&type=script&lang=js&\"\nexport * from \"./Captcha.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Captcha.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Captcha.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"captchaData\",attrs:{\"model\":_vm.captchaData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.captcha,\"data\":_vm.captchaData}})],1),_vm._v(\" \"),(_vm.captcha)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"kocaptchaData\",attrs:{\"model\":_vm.kocaptchaData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.kocaptcha,\"data\":_vm.kocaptchaData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Esshd.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Esshd.vue?vue&type=template&id=12ea7477&\"\nimport script from \"./Esshd.vue?vue&type=script&lang=js&\"\nexport * from \"./Esshd.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Esshd.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Esshd.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"esshdData\",attrs:{\"model\":_vm.esshdData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.esshd,\"data\":_vm.esshdData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Frontend.vue?vue&type=template&id=44a493e3&\"\nimport script from \"./Frontend.vue?vue&type=script&lang=js&\"\nexport * from \"./Frontend.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Frontend.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Frontend.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"frontendData\",attrs:{\"model\":_vm.frontendData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.frontend,\"data\":_vm.frontendData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"staticFeData\",attrs:{\"model\":_vm.staticFeData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.staticFe,\"data\":_vm.staticFeData}})],1),_vm._v(\" \"),(_vm.staticFe)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"assetsData\",attrs:{\"model\":_vm.assetsData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[(_vm.assets)?_c('el-form-item',{staticClass:\"grouped-settings-header\"},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.assets')))])]):_vm._e(),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.assets,\"data\":_vm.assetsData}})],1),_vm._v(\" \"),(_vm.assets)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"emojiData\",attrs:{\"model\":_vm.emojiData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[(_vm.emoji)?_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":\":emoji\"}},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.emoji')))])]):_vm._e(),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.emoji,\"data\":_vm.emojiData}})],1),_vm._v(\" \"),(_vm.emoji)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"chatData\",attrs:{\"model\":_vm.chatData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.chat,\"data\":_vm.chatData}})],1),_vm._v(\" \"),(_vm.chat)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"markupData\",attrs:{\"model\":_vm.markupData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[(_vm.markup)?_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":\":markup\"}},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.markup')))])]):_vm._e(),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.markup,\"data\":_vm.markupData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Gopher.vue?vue&type=template&id=15ee83b0&\"\nimport script from \"./Gopher.vue?vue&type=script&lang=js&\"\nexport * from \"./Gopher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Gopher.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Gopher.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"gopher\",attrs:{\"model\":_vm.gopherData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.gopher,\"data\":_vm.gopherData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Http.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Http.vue?vue&type=template&id=1ff5d7b6&\"\nimport script from \"./Http.vue?vue&type=script&lang=js&\"\nexport * from \"./Http.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Http.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Http.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"httpData\",attrs:{\"model\":_vm.httpData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.http,\"data\":_vm.httpData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"corsPlugData\",attrs:{\"model\":_vm.corsPlugData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[(_vm.corsPlug)?_c('el-form-item',{staticClass:\"grouped-settings-header\",attrs:{\"data-search\":\":cors_plug\"}},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(_vm._s(_vm.$t('settings.corsPlug')))])]):_vm._e(),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.corsPlug,\"data\":_vm.corsPlugData}})],1),_vm._v(\" \"),(_vm.corsPlug)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"httpSignatures\",attrs:{\"model\":_vm.httpSignaturesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.httpSignatures,\"data\":_vm.httpSignaturesData}})],1),_vm._v(\" \"),(_vm.httpSignatures)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"httpSecurityData\",attrs:{\"model\":_vm.httpSecurityData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.httpSecurity,\"data\":_vm.httpSecurityData}})],1),_vm._v(\" \"),(_vm.httpSecurity)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"webCacheTtl\",attrs:{\"model\":_vm.webCacheTtlData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.webCacheTtl,\"data\":_vm.webCacheTtlData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Instance.vue?vue&type=template&id=235800e0&\"\nimport script from \"./Instance.vue?vue&type=script&lang=js&\"\nexport * from \"./Instance.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Instance.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Instance.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"instanceData\",attrs:{\"model\":_vm.instanceData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.instance,\"data\":_vm.instanceData}})],1),_vm._v(\" \"),(_vm.instance)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"adminToken\",attrs:{\"model\":_vm.adminTokenData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.adminToken,\"data\":_vm.adminTokenData}})],1),_vm._v(\" \"),(_vm.adminToken)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"scheduledActivity\",attrs:{\"model\":_vm.scheduledActivityData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.scheduledActivity,\"data\":_vm.scheduledActivityData}})],1),_vm._v(\" \"),(_vm.scheduledActivity)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"manifest\",attrs:{\"model\":_vm.manifestData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.manifest,\"data\":_vm.manifestData}})],1),_vm._v(\" \"),(_vm.manifest)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"pleromaUser\",attrs:{\"model\":_vm.pleromaUserData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth,\"data-search\":\"Pleroma.User\"}},[_c('setting',{attrs:{\"setting-group\":_vm.pleromaUser,\"data\":_vm.pleromaUserData}})],1),_vm._v(\" \"),(_vm.pleromaUser)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"uriSchemes\",attrs:{\"model\":_vm.uriSchemesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uriSchemes,\"data\":_vm.uriSchemesData}})],1),_vm._v(\" \"),(_vm.uriSchemes)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"feed\",attrs:{\"model\":_vm.feedData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.feed,\"data\":_vm.feedData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"streamer\",attrs:{\"model\":_vm.streamerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.streamer,\"data\":_vm.streamerData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./JobQueue.vue?vue&type=template&id=363820de&\"\nimport script from \"./JobQueue.vue?vue&type=script&lang=js&\"\nexport * from \"./JobQueue.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JobQueue.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"JobQueue.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"obanQueuesData\",attrs:{\"model\":_vm.obanQueuesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.obanQueues,\"data\":_vm.obanQueuesData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"workersData\",attrs:{\"model\":_vm.workersData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.workers,\"data\":_vm.workersData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"activityExpiration\",attrs:{\"model\":_vm.activityExpirationData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.activityExpiration,\"data\":_vm.activityExpirationData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Logger.vue?vue&type=template&id=0fac35cb&\"\nimport script from \"./Logger.vue?vue&type=script&lang=js&\"\nexport * from \"./Logger.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Logger.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Logger.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"loggerData\",attrs:{\"model\":_vm.loggerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.logger,\"data\":_vm.loggerData}})],1),_vm._v(\" \"),(_vm.logger)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"consoleData\",attrs:{\"model\":_vm.consoleData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.console,\"data\":_vm.consoleData}})],1),_vm._v(\" \"),(_vm.console)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"exsysloggerData\",attrs:{\"model\":_vm.exsysloggerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.exsyslogger,\"data\":_vm.exsysloggerData}})],1),_vm._v(\" \"),(_vm.exsyslogger)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"quackData\",attrs:{\"model\":_vm.quackData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.quack,\"data\":_vm.quackData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mailer.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Mailer.vue?vue&type=template&id=5331edef&\"\nimport script from \"./Mailer.vue?vue&type=script&lang=js&\"\nexport * from \"./Mailer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Mailer.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Mailer.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"mailer\",attrs:{\"model\":_vm.mailerData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mailer,\"data\":_vm.mailerData}})],1),_vm._v(\" \"),(_vm.mailer)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"swoosh\",attrs:{\"model\":_vm.swooshData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.swoosh,\"data\":_vm.swooshData}})],1),_vm._v(\" \"),(_vm.swoosh)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"emailNotifications\",attrs:{\"model\":_vm.emailNotificationsData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.emailNotifications,\"data\":_vm.emailNotificationsData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"userEmail\",attrs:{\"model\":_vm.userEmailData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.userEmail,\"data\":_vm.userEmailData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"newUsersDigestEmail\",attrs:{\"model\":_vm.newUsersDigestEmailData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.newUsersDigestEmail,\"data\":_vm.newUsersDigestEmailData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MediaProxy.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MediaProxy.vue?vue&type=template&id=1f81eb24&\"\nimport script from \"./MediaProxy.vue?vue&type=script&lang=js&\"\nexport * from \"./MediaProxy.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MediaProxy.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"MediaProxy.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"mediaProxy\",attrs:{\"model\":_vm.mediaProxyData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mediaProxy,\"data\":_vm.mediaProxyData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Metadata.vue?vue&type=template&id=1733a5b4&\"\nimport script from \"./Metadata.vue?vue&type=script&lang=js&\"\nexport * from \"./Metadata.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Metadata.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Metadata.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"metadata\",attrs:{\"model\":_vm.metadataData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.metadata,\"data\":_vm.metadataData}})],1),_vm._v(\" \"),(_vm.metadata)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"richMedia\",attrs:{\"model\":_vm.richMediaData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.richMedia,\"data\":_vm.richMediaData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MRF.vue?vue&type=template&id=1f16e1ee&\"\nimport script from \"./MRF.vue?vue&type=script&lang=js&\"\nexport * from \"./MRF.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MRF.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"MRF.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"mrfSimple\",attrs:{\"model\":_vm.mrfSimpleData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfSimple,\"data\":_vm.mrfSimpleData}})],1),_vm._v(\" \"),(_vm.mrfSimple)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"mrfRejectnonpublic\",attrs:{\"model\":_vm.mrfRejectnonpublicData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfRejectnonpublic,\"data\":_vm.mrfRejectnonpublicData}})],1),_vm._v(\" \"),(_vm.mrfRejectnonpublic)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"mrfHellthread\",attrs:{\"model\":_vm.mrfHellthreadData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfHellthread,\"data\":_vm.mrfHellthreadData}})],1),_vm._v(\" \"),(_vm.mrfHellthread)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"mrfKeyword\",attrs:{\"model\":_vm.mrfKeywordData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfKeyword,\"data\":_vm.mrfKeywordData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"mrfSubchain\",attrs:{\"model\":_vm.mrfSubchainData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfSubchain,\"data\":_vm.mrfSubchainData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"mrfMention\",attrs:{\"model\":_vm.mrfMentionData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfMention,\"data\":_vm.mrfMentionData}})],1),_vm._v(\" \"),(_vm.mrfMention)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"mrfNormalizeMarkup\",attrs:{\"model\":_vm.mrfNormalizeMarkupData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfNormalizeMarkup,\"data\":_vm.mrfNormalizeMarkupData}})],1),_vm._v(\" \"),(_vm.mrfNormalizeMarkup)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"mrfVocabulary\",attrs:{\"model\":_vm.mrfVocabularyData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfVocabulary,\"data\":_vm.mrfVocabularyData}})],1),_vm._v(\" \"),(_vm.mrfVocabulary)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"mrfObjectAge\",attrs:{\"model\":_vm.mrfObjectAgeData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfObjectAge,\"data\":_vm.mrfObjectAgeData}})],1),_vm._v(\" \"),(_vm.mrfObjectAge)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"mrfActivityExpiration\",attrs:{\"model\":_vm.mrfActivityExpirationData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mrfActivityExpiration,\"data\":_vm.mrfActivityExpirationData}})],1),_vm._v(\" \"),(_vm.mrfActivityExpiration)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"modules\",attrs:{\"model\":_vm.modulesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.modules,\"data\":_vm.modulesData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Other.vue?vue&type=template&id=529a22f4&\"\nimport script from \"./Other.vue?vue&type=script&lang=js&\"\nexport * from \"./Other.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Other.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Other.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"mimeTypes\",attrs:{\"model\":_vm.mimeTypesData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.mimeTypes,\"data\":_vm.mimeTypesData}})],1),_vm._v(\" \"),_c('el-form',{ref:\"remoteIp\",attrs:{\"model\":_vm.remoteIpData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.remoteIp,\"data\":_vm.remoteIpData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimiters.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RateLimiters.vue?vue&type=template&id=342424ac&\"\nimport script from \"./RateLimiters.vue?vue&type=script&lang=js&\"\nexport * from \"./RateLimiters.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RateLimiters.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RateLimiters.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"rateLimiters\",attrs:{\"model\":_vm.rateLimitersData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.rateLimiters,\"data\":_vm.rateLimitersData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Relays.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Relays.vue?vue&type=template&id=74b90396&\"\nimport script from \"./Relays.vue?vue&type=script&lang=js&\"\nexport * from \"./Relays.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Relays.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Relays.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"relays-container\"},[_c('div',{staticClass:\"follow-relay-container\"},[_c('el-input',{staticClass:\"follow-relay\",attrs:{\"placeholder\":_vm.$t('settings.followRelay')},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.followRelay($event)}},model:{value:(_vm.newRelay),callback:function ($$v) {_vm.newRelay=$$v},expression:\"newRelay\"}}),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},nativeOn:{\"click\":function($event){return _vm.followRelay($event)}}},[_vm._v(_vm._s(_vm.$t('settings.follow')))])],1),_vm._v(\" \"),_c('el-table',{attrs:{\"data\":_vm.relaysTable}},[_c('el-table-column',{attrs:{\"label\":_vm.$t('settings.instanceUrl'),\"prop\":\"instance\"}}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"fixed\":\"right\",\"width\":\"120\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},nativeOn:{\"click\":function($event){return _vm.deleteRelay(scope.row.instance)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('table.delete'))+\"\\n \")])]}}],null,false,2132974932)})],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Upload.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Upload.vue?vue&type=template&id=c3685204&\"\nimport script from \"./Upload.vue?vue&type=script&lang=js&\"\nexport * from \"./Upload.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Upload.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Upload.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[_c('el-form',{ref:\"uploadData\",attrs:{\"model\":_vm.uploadData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.upload,\"data\":_vm.uploadData}})],1),_vm._v(\" \"),(_vm.showUploadersLocal)?_c('el-form',{ref:\"uploadersLocal\",attrs:{\"model\":_vm.uploadersLocalData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[(_vm.uploadersLocal)?_c('el-form-item',{staticClass:\"grouped-settings-header\"},[_c('span',{staticClass:\"label-font label-with-margin\"},[_vm._v(\"Pleroma.Uploaders.Local\")])]):_vm._e(),_vm._v(\" \"),_c('setting',{attrs:{\"setting-group\":_vm.uploadersLocal,\"data\":_vm.uploadersLocalData}}),_vm._v(\" \"),(_vm.uploadersLocal)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e()],1):_vm._e(),_vm._v(\" \"),(_vm.showUploadersS3)?_c('el-form',{ref:\"uploadersS3\",attrs:{\"model\":_vm.uploadersS3Data,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uploadersS3,\"data\":_vm.uploadersS3Data}}),_vm._v(\" \"),(_vm.uploadersS3)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"uploadFilterMogrify\",attrs:{\"model\":_vm.uploadFilterMogrifyData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uploadFilterMogrify,\"data\":_vm.uploadFilterMogrifyData}})],1),_vm._v(\" \"),(_vm.uploadFilterMogrify)?_c('el-divider',{staticClass:\"divider thick-line\"}):_vm._e(),_vm._v(\" \"),_c('el-form',{ref:\"uploadAnonymizeFilename\",attrs:{\"model\":_vm.uploadAnonymizeFilenameData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.uploadAnonymizeFilename,\"data\":_vm.uploadAnonymizeFilenameData}})],1),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebPush.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./WebPush.vue?vue&type=template&id=126c753f&\"\nimport script from \"./WebPush.vue?vue&type=script&lang=js&\"\nexport * from \"./WebPush.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WebPush.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"WebPush.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"form-container\",class:_vm.isSidebarOpen},[(!_vm.loading)?_c('el-form',{ref:\"vapidDetailsData\",attrs:{\"model\":_vm.vapidDetailsData,\"label-position\":_vm.labelPosition,\"label-width\":_vm.labelWidth}},[_c('setting',{attrs:{\"setting-group\":_vm.vapidDetails,\"data\":_vm.vapidDetailsData}})],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"submit-button-container\"},[_c('el-button',{staticClass:\"submit-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.onSubmit}},[_vm._v(\"Submit\")])],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=2b61d370&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=2b61d370&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2b61d370\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Metadata.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AutoLinker.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Instance.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Other.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MRF.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Frontend.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RateLimitInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JobQueue.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Logger.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ProxyUrlInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CrontabInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditableKeywordInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Setting.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ActivityPub.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../../node_modules/css-loader/index.js??ref--11-1!../../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IconsInput.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Gopher.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Inputs.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\""],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js b/priv/static/adminfe/static/js/chunk-4e7e.91b5e73a.js similarity index 97% rename from priv/static/adminfe/static/js/chunk-0961.ef33e81b.js rename to priv/static/adminfe/static/js/chunk-4e7e.91b5e73a.js index e090bb93c..0fdf0de50 100644 --- a/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js +++ b/priv/static/adminfe/static/js/chunk-4e7e.91b5e73a.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-0961"],{GFxI:function(t,e,n){},aSQl:function(t,e,n){"use strict";n.d(e,"a",function(){return p});var o=n("o0o1"),a=n.n(o),r=n("yXPU"),s=n.n(r),i=n("oAJy"),l=n.n(i),c=n("LvDl"),u=n.n(c),p=function(){var t=s()(a.a.mark(function t(e){var n,o;return a.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,l.a.getItem("vuex-lz");case 2:if(n=t.sent,void 0!==(o=u.a.get(n,"oauth.userToken"))){t.next=6;break}throw new Error("PleromaFE token not found");case 6:return t.next=8,e.dispatch("LoginByPleromaFE",{token:o});case 8:case"end":return t.stop()}},t)}));return function(e){return t.apply(this,arguments)}}()},abDm:function(t,e,n){"use strict";var o=n("GFxI");n.n(o).a},c11S:function(t,e,n){"use strict";var o=n("gTgX");n.n(o).a},gTgX:function(t,e,n){},ntYl:function(t,e,n){"use strict";n.r(e);var o=n("J4zp"),a=n.n(o),r=n("o0o1"),s=n.n(r),i=n("yXPU"),l=n.n(i),c=n("zT9a"),u=n("oAJy"),p=n.n(u),d=n("LvDl"),m=n.n(d),g=n("mSNy"),h=n("aSQl"),v={name:"Login",components:{"svg-icon":c.a},data:function(){return{loginForm:{username:"",password:""},passwordType:"password",loading:!1,loadingPleromaFE:!1,showDialog:!1,redirect:void 0,pleromaFEToken:!1,pleromaFEStateKey:"vuex-lz",pleromaFEState:{}}},watch:{$route:{handler:function(t){this.redirect=t.query&&t.query.redirect},immediate:!0}},mounted:function(){var t=l()(s.a.mark(function t(){var e;return s.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,p.a.getItem(this.pleromaFEStateKey);case 2:if(e=t.sent,this.pleromaFEState=e,void 0!==m.a.get(e,"oauth.userToken")){t.next=6;break}return t.abrupt("return");case 6:this.pleromaFEToken=!0;case 7:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}(),methods:{showPwd:function(){"password"===this.passwordType?this.passwordType="":this.passwordType="password"},handleLogin:function(){var t=this;this.loading=!0;var e=this.getLoginData();this.$store.dispatch("LoginByUsername",e).then(function(){t.loading=!1,t.$router.push({path:t.redirect||"/users/index"})}).catch(function(){t.loading=!1})},handlePleromaFELogin:function(){var t=l()(s.a.mark(function t(){return s.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return this.loadingPleromaFE=!0,t.prev=1,t.next=4,Object(h.a)(this.$store);case 4:t.next=10;break;case 6:t.prev=6,t.t0=t.catch(1),this.loadingPleromaFE=!1,this.$message.error(g.a.t("login.pleromaFELoginFailed"));case 10:this.loadingPleromaFE=!1,this.$message.success(g.a.t("login.pleromaFELoginSucceed")),this.$router.push({path:this.redirect||"/users/index"});case 13:case"end":return t.stop()}},t,this,[[1,6]])}));return function(){return t.apply(this,arguments)}}(),getLoginData:function(){var t=this.loginForm.username.split("@"),e=a()(t,2),n=e[0],o=e[1];return{username:n.trim(),authHost:o?o.trim():window.location.host,password:this.loginForm.password}}}},f=(n("c11S"),n("abDm"),n("KHd+")),w=Object(f.a)(v,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"login-container"},[n("el-form",{ref:"loginForm",staticClass:"login-form",attrs:{model:t.loginForm,"auto-complete":"on","label-position":"left"}},[n("div",{staticClass:"title-container"},[n("h3",{staticClass:"title"},[t._v("\n "+t._s(t.$t("login.title"))+"\n ")])]),t._v(" "),n("el-form-item",{attrs:{prop:"username"}},[n("span",{staticClass:"svg-container"},[n("svg-icon",{attrs:{"icon-class":"user"}})],1),t._v(" "),n("el-input",{attrs:{placeholder:t.$t("login.username"),name:"username",type:"text","auto-complete":"on"},model:{value:t.loginForm.username,callback:function(e){t.$set(t.loginForm,"username",e)},expression:"loginForm.username"}})],1),t._v(" "),n("div",{staticClass:"omit-host-note"},[t._v(t._s(t.$t("login.omitHostname")))]),t._v(" "),n("el-form-item",{attrs:{prop:"password"}},[n("span",{staticClass:"svg-container"},[n("svg-icon",{attrs:{"icon-class":"password"}})],1),t._v(" "),n("el-input",{attrs:{type:t.passwordType,placeholder:t.$t("login.password"),name:"password","auto-complete":"on"},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.handleLogin(e)}},model:{value:t.loginForm.password,callback:function(e){t.$set(t.loginForm,"password",e)},expression:"loginForm.password"}}),t._v(" "),n("span",{staticClass:"show-pwd",on:{click:t.showPwd}},[n("svg-icon",{attrs:{"icon-class":"password"===t.passwordType?"eye":"eye-open"}})],1)],1),t._v(" "),n("el-button",{staticClass:"login-button",attrs:{loading:t.loading,type:"primary"},nativeOn:{click:function(e){return e.preventDefault(),t.handleLogin(e)}}},[t._v("\n "+t._s(t.$t("login.logIn"))+"\n ")]),t._v(" "),t.pleromaFEToken?n("el-button",{staticClass:"login-button",attrs:{loading:t.loadingPleromaFE,type:"primary"},nativeOn:{click:function(e){return e.preventDefault(),t.handlePleromaFELogin(e)}}},[t._v("\n "+t._s(t.$t("login.logInViaPleromaFE"))+"\n ")]):t._e()],1)],1)},[],!1,null,"5bb13616",null);w.options.__file="index.vue";e.default=w.exports}}]); -//# sourceMappingURL=chunk-0961.ef33e81b.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-4e7e"],{GFxI:function(t,e,n){},aSQl:function(t,e,n){"use strict";n.d(e,"a",function(){return p});var o=n("o0o1"),a=n.n(o),r=n("yXPU"),s=n.n(r),i=n("oAJy"),l=n.n(i),c=n("LvDl"),u=n.n(c),p=function(){var t=s()(a.a.mark(function t(e){var n,o;return a.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,l.a.getItem("vuex-lz");case 2:if(n=t.sent,void 0!==(o=u.a.get(n,"oauth.userToken"))){t.next=6;break}throw new Error("PleromaFE token not found");case 6:return t.next=8,e.dispatch("LoginByPleromaFE",{token:o});case 8:case"end":return t.stop()}},t)}));return function(e){return t.apply(this,arguments)}}()},abDm:function(t,e,n){"use strict";var o=n("GFxI");n.n(o).a},c11S:function(t,e,n){"use strict";var o=n("gTgX");n.n(o).a},gTgX:function(t,e,n){},ntYl:function(t,e,n){"use strict";n.r(e);var o=n("J4zp"),a=n.n(o),r=n("o0o1"),s=n.n(r),i=n("yXPU"),l=n.n(i),c=n("zT9a"),u=n("oAJy"),p=n.n(u),d=n("LvDl"),m=n.n(d),g=n("mSNy"),h=n("aSQl"),v={name:"Login",components:{"svg-icon":c.a},data:function(){return{loginForm:{username:"",password:""},passwordType:"password",loading:!1,loadingPleromaFE:!1,showDialog:!1,redirect:void 0,pleromaFEToken:!1,pleromaFEStateKey:"vuex-lz",pleromaFEState:{}}},watch:{$route:{handler:function(t){this.redirect=t.query&&t.query.redirect},immediate:!0}},mounted:function(){var t=l()(s.a.mark(function t(){var e;return s.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,p.a.getItem(this.pleromaFEStateKey);case 2:if(e=t.sent,this.pleromaFEState=e,void 0!==m.a.get(e,"oauth.userToken")){t.next=6;break}return t.abrupt("return");case 6:this.pleromaFEToken=!0;case 7:case"end":return t.stop()}},t,this)}));return function(){return t.apply(this,arguments)}}(),methods:{showPwd:function(){"password"===this.passwordType?this.passwordType="":this.passwordType="password"},handleLogin:function(){var t=this;this.loading=!0;var e=this.getLoginData();this.$store.dispatch("LoginByUsername",e).then(function(){t.loading=!1,t.$router.push({path:t.redirect||"/users/index"})}).catch(function(){t.loading=!1})},handlePleromaFELogin:function(){var t=l()(s.a.mark(function t(){return s.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return this.loadingPleromaFE=!0,t.prev=1,t.next=4,Object(h.a)(this.$store);case 4:t.next=10;break;case 6:t.prev=6,t.t0=t.catch(1),this.loadingPleromaFE=!1,this.$message.error(g.a.t("login.pleromaFELoginFailed"));case 10:this.loadingPleromaFE=!1,this.$message.success(g.a.t("login.pleromaFELoginSucceed")),this.$router.push({path:this.redirect||"/users/index"});case 13:case"end":return t.stop()}},t,this,[[1,6]])}));return function(){return t.apply(this,arguments)}}(),getLoginData:function(){var t=this.loginForm.username.split("@"),e=a()(t,2),n=e[0],o=e[1];return{username:n.trim(),authHost:o?o.trim():window.location.host,password:this.loginForm.password}}}},f=(n("c11S"),n("abDm"),n("KHd+")),w=Object(f.a)(v,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"login-container"},[n("el-form",{ref:"loginForm",staticClass:"login-form",attrs:{model:t.loginForm,"auto-complete":"on","label-position":"left"}},[n("div",{staticClass:"title-container"},[n("h3",{staticClass:"title"},[t._v("\n "+t._s(t.$t("login.title"))+"\n ")])]),t._v(" "),n("el-form-item",{attrs:{prop:"username"}},[n("span",{staticClass:"svg-container"},[n("svg-icon",{attrs:{"icon-class":"user"}})],1),t._v(" "),n("el-input",{attrs:{placeholder:t.$t("login.username"),name:"username",type:"text","auto-complete":"on"},model:{value:t.loginForm.username,callback:function(e){t.$set(t.loginForm,"username",e)},expression:"loginForm.username"}})],1),t._v(" "),n("div",{staticClass:"omit-host-note"},[t._v(t._s(t.$t("login.omitHostname")))]),t._v(" "),n("el-form-item",{attrs:{prop:"password"}},[n("span",{staticClass:"svg-container"},[n("svg-icon",{attrs:{"icon-class":"password"}})],1),t._v(" "),n("el-input",{attrs:{type:t.passwordType,placeholder:t.$t("login.password"),name:"password","auto-complete":"on"},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.handleLogin(e)}},model:{value:t.loginForm.password,callback:function(e){t.$set(t.loginForm,"password",e)},expression:"loginForm.password"}}),t._v(" "),n("span",{staticClass:"show-pwd",on:{click:t.showPwd}},[n("svg-icon",{attrs:{"icon-class":"password"===t.passwordType?"eye":"eye-open"}})],1)],1),t._v(" "),n("el-button",{staticClass:"login-button",attrs:{loading:t.loading,type:"primary"},nativeOn:{click:function(e){return e.preventDefault(),t.handleLogin(e)}}},[t._v("\n "+t._s(t.$t("login.logIn"))+"\n ")]),t._v(" "),t.pleromaFEToken?n("el-button",{staticClass:"login-button",attrs:{loading:t.loadingPleromaFE,type:"primary"},nativeOn:{click:function(e){return e.preventDefault(),t.handlePleromaFELogin(e)}}},[t._v("\n "+t._s(t.$t("login.logInViaPleromaFE"))+"\n ")]):t._e()],1)],1)},[],!1,null,"5bb13616",null);w.options.__file="index.vue";e.default=w.exports}}]); +//# sourceMappingURL=chunk-4e7e.91b5e73a.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js.map b/priv/static/adminfe/static/js/chunk-4e7e.91b5e73a.js.map similarity index 99% rename from priv/static/adminfe/static/js/chunk-0961.ef33e81b.js.map rename to priv/static/adminfe/static/js/chunk-4e7e.91b5e73a.js.map index 97c6a4b54..7a6751cf8 100644 --- a/priv/static/adminfe/static/js/chunk-0961.ef33e81b.js.map +++ b/priv/static/adminfe/static/js/chunk-4e7e.91b5e73a.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/services/pleromaAuth.js","webpack:///./src/views/login/index.vue?4fb3","webpack:///./src/views/login/index.vue?0399","webpack:///./src/views/login/index.vue?7240","webpack:///./src/views/login/index.vue?95e4","webpack:///src/views/login/index.vue","webpack:///./src/views/login/index.vue"],"names":["authenticateWithPleromaFE","_ref","_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default","_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default","a","mark","_callee","store","pleromaFEState","token","wrap","_context","prev","next","localforage","getItem","sent","undefined","_","get","Error","dispatch","stop","_x","apply","this","arguments","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_1_id_5bb13616_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","views_loginvue_type_script_lang_js_","name","components","svg-icon","SvgIcon","data","loginForm","username","password","passwordType","loading","loadingPleromaFE","showDialog","redirect","pleromaFEToken","pleromaFEStateKey","watch","$route","handler","route","query","immediate","mounted","_mounted","asyncToGenerator_default","regenerator_default","localforage_default","lodash_default","abrupt","methods","showPwd","handleLogin","_this","loginData","getLoginData","$store","then","$router","push","path","catch","handlePleromaFELogin","_handlePleromaFELogin","_callee2","_context2","Object","pleromaAuth","t0","$message","error","lang","t","success","_this$loginForm$usern","split","_this$loginForm$usern2","slicedToArray_default","authHost","trim","window","location","host","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","ref","attrs","model","auto-complete","label-position","_v","_s","$t","prop","icon-class","placeholder","type","value","callback","$$v","$set","expression","nativeOn","keyup","$event","indexOf","_k","keyCode","key","on","click","preventDefault","_e","options","__file","__webpack_exports__"],"mappings":"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","file":"static/js/chunk-0961.ef33e81b.js","sourcesContent":["import localforage from 'localforage'\nimport _ from 'lodash'\n\nconst pleromaFEStateKey = 'vuex-lz'\n\nexport const authenticateWithPleromaFE = async(store) => {\n const pleromaFEState = await localforage.getItem(pleromaFEStateKey)\n const token = _.get(pleromaFEState, 'oauth.userToken')\n\n if (token === undefined) {\n throw new Error('PleromaFE token not found')\n }\n\n await store.dispatch('LoginByPleromaFE', { token })\n}\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=1&id=5bb13616&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=1&id=5bb13616&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"login-container\"},[_c('el-form',{ref:\"loginForm\",staticClass:\"login-form\",attrs:{\"model\":_vm.loginForm,\"auto-complete\":\"on\",\"label-position\":\"left\"}},[_c('div',{staticClass:\"title-container\"},[_c('h3',{staticClass:\"title\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('login.title'))+\"\\n \")])]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"prop\":\"username\"}},[_c('span',{staticClass:\"svg-container\"},[_c('svg-icon',{attrs:{\"icon-class\":\"user\"}})],1),_vm._v(\" \"),_c('el-input',{attrs:{\"placeholder\":_vm.$t('login.username'),\"name\":\"username\",\"type\":\"text\",\"auto-complete\":\"on\"},model:{value:(_vm.loginForm.username),callback:function ($$v) {_vm.$set(_vm.loginForm, \"username\", $$v)},expression:\"loginForm.username\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"omit-host-note\"},[_vm._v(_vm._s(_vm.$t('login.omitHostname')))]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"prop\":\"password\"}},[_c('span',{staticClass:\"svg-container\"},[_c('svg-icon',{attrs:{\"icon-class\":\"password\"}})],1),_vm._v(\" \"),_c('el-input',{attrs:{\"type\":_vm.passwordType,\"placeholder\":_vm.$t('login.password'),\"name\":\"password\",\"auto-complete\":\"on\"},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.handleLogin($event)}},model:{value:(_vm.loginForm.password),callback:function ($$v) {_vm.$set(_vm.loginForm, \"password\", $$v)},expression:\"loginForm.password\"}}),_vm._v(\" \"),_c('span',{staticClass:\"show-pwd\",on:{\"click\":_vm.showPwd}},[_c('svg-icon',{attrs:{\"icon-class\":_vm.passwordType === 'password' ? 'eye' : 'eye-open'}})],1)],1),_vm._v(\" \"),_c('el-button',{staticClass:\"login-button\",attrs:{\"loading\":_vm.loading,\"type\":\"primary\"},nativeOn:{\"click\":function($event){$event.preventDefault();return _vm.handleLogin($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('login.logIn'))+\"\\n \")]),_vm._v(\" \"),(_vm.pleromaFEToken)?_c('el-button',{staticClass:\"login-button\",attrs:{\"loading\":_vm.loadingPleromaFE,\"type\":\"primary\"},nativeOn:{\"click\":function($event){$event.preventDefault();return _vm.handlePleromaFELogin($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('login.logInViaPleromaFE'))+\"\\n \")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=5bb13616&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\nimport style1 from \"./index.vue?vue&type=style&index=1&id=5bb13616&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5bb13616\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/services/pleromaAuth.js","webpack:///./src/views/login/index.vue?4fb3","webpack:///./src/views/login/index.vue?0399","webpack:///./src/views/login/index.vue?7240","webpack:///./src/views/login/index.vue?95e4","webpack:///src/views/login/index.vue","webpack:///./src/views/login/index.vue"],"names":["authenticateWithPleromaFE","_ref","_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default","_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default","a","mark","_callee","store","pleromaFEState","token","wrap","_context","prev","next","localforage","getItem","sent","undefined","_","get","Error","dispatch","stop","_x","apply","this","arguments","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_1_id_5bb13616_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","views_loginvue_type_script_lang_js_","name","components","svg-icon","SvgIcon","data","loginForm","username","password","passwordType","loading","loadingPleromaFE","showDialog","redirect","pleromaFEToken","pleromaFEStateKey","watch","$route","handler","route","query","immediate","mounted","_mounted","asyncToGenerator_default","regenerator_default","localforage_default","lodash_default","abrupt","methods","showPwd","handleLogin","_this","loginData","getLoginData","$store","then","$router","push","path","catch","handlePleromaFELogin","_handlePleromaFELogin","_callee2","_context2","Object","pleromaAuth","t0","$message","error","lang","t","success","_this$loginForm$usern","split","_this$loginForm$usern2","slicedToArray_default","authHost","trim","window","location","host","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","ref","attrs","model","auto-complete","label-position","_v","_s","$t","prop","icon-class","placeholder","type","value","callback","$$v","$set","expression","nativeOn","keyup","$event","indexOf","_k","keyCode","key","on","click","preventDefault","_e","options","__file","__webpack_exports__"],"mappings":"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","file":"static/js/chunk-4e7e.91b5e73a.js","sourcesContent":["import localforage from 'localforage'\nimport _ from 'lodash'\n\nconst pleromaFEStateKey = 'vuex-lz'\n\nexport const authenticateWithPleromaFE = async(store) => {\n const pleromaFEState = await localforage.getItem(pleromaFEStateKey)\n const token = _.get(pleromaFEState, 'oauth.userToken')\n\n if (token === undefined) {\n throw new Error('PleromaFE token not found')\n }\n\n await store.dispatch('LoginByPleromaFE', { token })\n}\n","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=1&id=5bb13616&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=1&id=5bb13616&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"login-container\"},[_c('el-form',{ref:\"loginForm\",staticClass:\"login-form\",attrs:{\"model\":_vm.loginForm,\"auto-complete\":\"on\",\"label-position\":\"left\"}},[_c('div',{staticClass:\"title-container\"},[_c('h3',{staticClass:\"title\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('login.title'))+\"\\n \")])]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"prop\":\"username\"}},[_c('span',{staticClass:\"svg-container\"},[_c('svg-icon',{attrs:{\"icon-class\":\"user\"}})],1),_vm._v(\" \"),_c('el-input',{attrs:{\"placeholder\":_vm.$t('login.username'),\"name\":\"username\",\"type\":\"text\",\"auto-complete\":\"on\"},model:{value:(_vm.loginForm.username),callback:function ($$v) {_vm.$set(_vm.loginForm, \"username\", $$v)},expression:\"loginForm.username\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"omit-host-note\"},[_vm._v(_vm._s(_vm.$t('login.omitHostname')))]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"prop\":\"password\"}},[_c('span',{staticClass:\"svg-container\"},[_c('svg-icon',{attrs:{\"icon-class\":\"password\"}})],1),_vm._v(\" \"),_c('el-input',{attrs:{\"type\":_vm.passwordType,\"placeholder\":_vm.$t('login.password'),\"name\":\"password\",\"auto-complete\":\"on\"},nativeOn:{\"keyup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.handleLogin($event)}},model:{value:(_vm.loginForm.password),callback:function ($$v) {_vm.$set(_vm.loginForm, \"password\", $$v)},expression:\"loginForm.password\"}}),_vm._v(\" \"),_c('span',{staticClass:\"show-pwd\",on:{\"click\":_vm.showPwd}},[_c('svg-icon',{attrs:{\"icon-class\":_vm.passwordType === 'password' ? 'eye' : 'eye-open'}})],1)],1),_vm._v(\" \"),_c('el-button',{staticClass:\"login-button\",attrs:{\"loading\":_vm.loading,\"type\":\"primary\"},nativeOn:{\"click\":function($event){$event.preventDefault();return _vm.handleLogin($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('login.logIn'))+\"\\n \")]),_vm._v(\" \"),(_vm.pleromaFEToken)?_c('el-button',{staticClass:\"login-button\",attrs:{\"loading\":_vm.loadingPleromaFE,\"type\":\"primary\"},nativeOn:{\"click\":function($event){$event.preventDefault();return _vm.handlePleromaFELogin($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('login.logInViaPleromaFE'))+\"\\n \")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=5bb13616&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\nimport style1 from \"./index.vue?vue&type=style&index=1&id=5bb13616&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5bb13616\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7f9e.c49aa694.js b/priv/static/adminfe/static/js/chunk-5118.7c48ad58.js similarity index 99% rename from priv/static/adminfe/static/js/chunk-7f9e.c49aa694.js rename to priv/static/adminfe/static/js/chunk-5118.7c48ad58.js index 9fb60af23..2357e225d 100644 --- a/priv/static/adminfe/static/js/chunk-7f9e.c49aa694.js +++ b/priv/static/adminfe/static/js/chunk-5118.7c48ad58.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-7f9e"],{"+/fp":function(e,t){e.exports=class{strong(e){return e}em(e){return e}codespan(e){return e}del(e){return e}text(e){return e}link(e,t,s){return""+s}image(e,t,s){return""+s}br(){return""}}},"4MG8":function(e,t,s){const n=s("T9Ld"),r=s("66f7"),i=s("SbYC"),l=s("+/fp"),a=s("hyX7"),o=s("J7Ao"),{merge:h,checkSanitizeDeprecation:c,escape:p}=s("rUJ1"),{getDefaults:u,changeDefaults:g,defaults:d}=s("vbtb");function f(e,t,s){if(void 0===e||null===e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if(s||"function"==typeof t){s||(s=t,t=null),t=h({},f.defaults,t||{}),c(t);const i=t.highlight;let l,a,o=0;try{l=n.lex(e,t)}catch(e){return s(e)}a=l.length;const p=function(e){if(e)return t.highlight=i,s(e);let n;try{n=r.parse(l,t)}catch(t){e=t}return t.highlight=i,e?s(e):s(null,n)};if(!i||i.length<3)return p();if(delete t.highlight,!a)return p();for(;oAn error occurred:

"+p(e.message+"",!0)+"
";throw e}}f.options=f.setOptions=function(e){return h(f.defaults,e),g(f.defaults),f},f.getDefaults=u,f.defaults=d,f.Parser=r,f.parser=r.parse,f.Renderer=i,f.TextRenderer=l,f.Lexer=n,f.lexer=n.lex,f.InlineLexer=a,f.inlineLexer=a.output,f.Slugger=o,f.parse=f,e.exports=f},"66f7":function(e,t,s){const n=s("SbYC"),r=s("J7Ao"),i=s("hyX7"),l=s("+/fp"),{defaults:a}=s("vbtb"),{merge:o,unescape:h}=s("rUJ1");e.exports=class e{constructor(e){this.tokens=[],this.token=null,this.options=e||a,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options,this.slugger=new r}static parse(t,s){return new e(s).parse(t)}parse(e){this.inline=new i(e.links,this.options),this.inlineText=new i(e.links,o({},this.options,{renderer:new l})),this.tokens=e.reverse();let t="";for(;this.next();)t+=this.tok();return t}next(){return this.token=this.tokens.pop(),this.token}peek(){return this.tokens[this.tokens.length-1]||0}parseText(){let e=this.token.text;for(;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)}tok(){let e="";switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,h(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":{let t,s,n,r,i="";for(n="",t=0;t?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){const e=t;do{this.seen[e]++,t=e+"-"+this.seen[e]}while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t}}},SbYC:function(e,t,s){const{defaults:n}=s("vbtb"),{cleanUrl:r,escape:i}=s("rUJ1");e.exports=class{constructor(e){this.options=e||n}code(e,t,s){const n=(t||"").match(/\S*/)[0];if(this.options.highlight){const t=this.options.highlight(e,n);null!=t&&t!==e&&(s=!0,e=t)}return n?'
'+(s?e:i(e,!0))+"
\n":"
"+(s?e:i(e,!0))+"
"}blockquote(e){return"
\n"+e+"
\n"}html(e){return e}heading(e,t,s,n){return this.options.headerIds?"'+e+"\n":""+e+"\n"}hr(){return this.options.xhtml?"
\n":"
\n"}list(e,t,s){const n=t?"ol":"ul";return"<"+n+(t&&1!==s?' start="'+s+'"':"")+">\n"+e+"\n"}listitem(e){return"
  • "+e+"
  • \n"}checkbox(e){return" "}paragraph(e){return"

    "+e+"

    \n"}table(e,t){return t&&(t=""+t+""),"\n\n"+e+"\n"+t+"
    \n"}tablerow(e){return"\n"+e+"\n"}tablecell(e,t){const s=t.header?"th":"td";return(t.align?"<"+s+' align="'+t.align+'">':"<"+s+">")+e+"\n"}strong(e){return""+e+""}em(e){return""+e+""}codespan(e){return""+e+""}br(){return this.options.xhtml?"
    ":"
    "}del(e){return""+e+""}link(e,t,s){if(null===(e=r(this.options.sanitize,this.options.baseUrl,e)))return s;let n='"}image(e,t,s){if(null===(e=r(this.options.sanitize,this.options.baseUrl,e)))return s;let n=''+s+'":">"}text(e){return e}}},T9Ld:function(e,t,s){const{defaults:n}=s("vbtb"),{block:r}=s("e56X"),{rtrim:i,splitCells:l,escape:a}=s("rUJ1");e.exports=class e{constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||n,this.rules=r.normal,this.options.pedantic?this.rules=r.pedantic:this.options.gfm&&(this.rules=r.gfm)}static get rules(){return r}static lex(t,s){return new e(s).lex(t)}lex(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),this.token(e,!0)}token(e,t){let s,n,o,h,c,p,u,g,d,f,b,k,m,x,_,w;for(e=e.replace(/^ +$/gm,"");e;)if((o=this.rules.newline.exec(e))&&(e=e.substring(o[0].length),o[0].length>1&&this.tokens.push({type:"space"})),o=this.rules.code.exec(e)){const t=this.tokens[this.tokens.length-1];e=e.substring(o[0].length),t&&"paragraph"===t.type?t.text+="\n"+o[0].trimRight():(o=o[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",codeBlockStyle:"indented",text:this.options.pedantic?o:i(o,"\n")}))}else if(o=this.rules.fences.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"code",lang:o[2]?o[2].trim():o[2],text:o[3]||""});else if(o=this.rules.heading.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"heading",depth:o[1].length,text:o[2]});else if((o=this.rules.nptable.exec(e))&&(p={type:"table",header:l(o[1].replace(/^ *| *\| *$/g,"")),align:o[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:o[3]?o[3].replace(/\n$/,"").split("\n"):[]}).header.length===p.align.length){for(e=e.substring(o[0].length),b=0;b ?/gm,""),this.token(o,t),this.tokens.push({type:"blockquote_end"});else if(o=this.rules.list.exec(e)){for(e=e.substring(o[0].length),u={type:"list_start",ordered:x=(h=o[2]).length>1,start:x?+h:"",loose:!1},this.tokens.push(u),g=[],s=!1,m=(o=o[0].match(this.rules.item)).length,b=0;b1?1===c.length:c.length>1||this.options.smartLists&&c!==h)&&(e=o.slice(b+1).join("\n")+e,b=m-1)),n=s||/\n\n(?!\s*$)/.test(p),b!==m-1&&(s="\n"===p.charAt(p.length-1),n||(n=s)),n&&(u.loose=!0),w=void 0,(_=/^\[[ xX]\] /.test(p))&&(w=" "!==p[1],p=p.replace(/^\[[ xX]\] +/,"")),d={type:"list_item_start",task:_,checked:w,loose:n},g.push(d),this.tokens.push(d),this.token(p,!1),this.tokens.push({type:"list_item_end"});if(u.loose)for(m=g.length,b=0;b ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:n,table:n,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};l.def=r(l.def).replace("label",l._label).replace("title",l._title).getRegex(),l.bullet=/(?:[*+-]|\d{1,9}\.)/,l.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,l.item=r(l.item,"gm").replace(/bull/g,l.bullet).getRegex(),l.list=r(l.list).replace(/bull/g,l.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+l.def.source+")").getRegex(),l._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",l._comment=//,l.html=r(l.html,"i").replace("comment",l._comment).replace("tag",l._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),l.paragraph=r(l._paragraph).replace("hr",l.hr).replace("heading"," {0,3}#{1,6} +").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}|~{3,})[^`\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",l._tag).getRegex(),l.blockquote=r(l.blockquote).replace("paragraph",l.paragraph).getRegex(),l.normal=i({},l),l.gfm=i({},l.normal,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),l.pedantic=i({},l.normal,{html:r("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",l._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,fences:n,paragraph:r(l.normal._paragraph).replace("hr",l.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",l.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});const a={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:n,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:n,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\?@\\[^_{|}~"};a.em=r(a.em).replace(/punctuation/g,a._punctuation).getRegex(),a._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,a._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,a._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,a.autolink=r(a.autolink).replace("scheme",a._scheme).replace("email",a._email).getRegex(),a._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,a.tag=r(a.tag).replace("comment",l._comment).replace("attribute",a._attribute).getRegex(),a._label=/(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,a._href=/<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/,a._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,a.link=r(a.link).replace("label",a._label).replace("href",a._href).replace("title",a._title).getRegex(),a.reflink=r(a.reflink).replace("label",a._label).getRegex(),a.normal=i({},a),a.pedantic=i({},a.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:r(/^!?\[(label)\]\((.*?)\)/).replace("label",a._label).getRegex(),reflink:r(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",a._label).getRegex()}),a.gfm=i({},a.normal,{escape:r(a.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\/i.test(o[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(this.inRawBlock=!1),t=t.substring(o[0].length),c+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):a(o[0]):o[0];else if(o=this.rules.link.exec(t)){const n=l(o[2],"()");if(n>-1){const e=(0===o[0].indexOf("!")?5:4)+o[1].length+n;o[2]=o[2].substring(0,n),o[0]=o[0].substring(0,e).trim(),o[3]=""}t=t.substring(o[0].length),this.inLink=!0,r=o[2],this.options.pedantic?(s=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r))?(r=s[1],i=s[3]):i="":i=o[3]?o[3].slice(1,-1):"",r=r.trim().replace(/^<([\s\S]*)>$/,"$1"),c+=this.outputLink(o,{href:e.escapes(r),title:e.escapes(i)}),this.inLink=!1}else if((o=this.rules.reflink.exec(t))||(o=this.rules.nolink.exec(t))){if(t=t.substring(o[0].length),s=(o[2]||o[1]).replace(/\s+/g," "),!(s=this.links[s.toLowerCase()])||!s.href){c+=o[0].charAt(0),t=o[0].substring(1)+t;continue}this.inLink=!0,c+=this.outputLink(o,s),this.inLink=!1}else if(o=this.rules.strong.exec(t))t=t.substring(o[0].length),c+=this.renderer.strong(this.output(o[4]||o[3]||o[2]||o[1]));else if(o=this.rules.em.exec(t))t=t.substring(o[0].length),c+=this.renderer.em(this.output(o[6]||o[5]||o[4]||o[3]||o[2]||o[1]));else if(o=this.rules.code.exec(t))t=t.substring(o[0].length),c+=this.renderer.codespan(a(o[2].trim(),!0));else if(o=this.rules.br.exec(t))t=t.substring(o[0].length),c+=this.renderer.br();else if(o=this.rules.del.exec(t))t=t.substring(o[0].length),c+=this.renderer.del(this.output(o[1]));else if(o=this.rules.autolink.exec(t))t=t.substring(o[0].length),r="@"===o[2]?"mailto:"+(n=a(this.mangle(o[1]))):n=a(o[1]),c+=this.renderer.link(r,null,n);else if(this.inLink||!(o=this.rules.url.exec(t))){if(o=this.rules.text.exec(t))t=t.substring(o[0].length),this.inRawBlock?c+=this.renderer.text(this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):a(o[0]):o[0]):c+=this.renderer.text(a(this.smartypants(o[0])));else if(t)throw new Error("Infinite loop on byte: "+t.charCodeAt(0))}else{if("@"===o[2])r="mailto:"+(n=a(o[0]));else{do{h=o[0],o[0]=this.rules._backpedal.exec(o[0])[0]}while(h!==o[0]);n=a(o[0]),r="www."===o[1]?"http://"+n:n}t=t.substring(o[0].length),c+=this.renderer.link(r,null,n)}return c}static escapes(t){return t?t.replace(e.rules._escapes,"$1"):t}outputLink(e,t){const s=t.href,n=t.title?a(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(s,n,this.output(e[1])):this.renderer.image(s,n,a(e[1]))}smartypants(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e}mangle(e){if(!this.options.mangle)return e;const t=e.length;let s,n="",r=0;for(;r.5&&(s="x"+s.toString(16)),n+="&#"+s+";";return n}}},rUJ1:function(e,t){const s=/[&<>"']/,n=/[&<>"']/g,r=/[<>"']|&(?!#?\w+;)/,i=/[<>"']|&(?!#?\w+;)/g,l={"&":"&","<":"<",">":">",'"':""","'":"'"},a=e=>l[e];const o=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function h(e){return e.replace(o,(e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):"")}const c=/(^|[^\[])\^/g;const p=/[^\w:]/g,u=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;const g={},d=/^[^:]+:\/*[^/]*$/,f=/^([^:]+:)[\s\S]*$/,b=/^([^:]+:\/*[^/]*)[\s\S]*$/;function k(e,t){g[" "+e]||(d.test(e)?g[" "+e]=e+"/":g[" "+e]=m(e,"/",!0));const s=-1===(e=g[" "+e]).indexOf(":");return"//"===t.substring(0,2)?s?t:e.replace(f,"$1")+t:"/"===t.charAt(0)?s?t:e.replace(b,"$1")+t:e+t}function m(e,t,s){const n=e.length;if(0===n)return"";let r=0;for(;r(n=(n=n.source||n).replace(c,"$1"),e=e.replace(t,n),s),getRegex:()=>new RegExp(e,t)};return s},cleanUrl:function(e,t,s){if(e){let e;try{e=decodeURIComponent(h(s)).replace(p,"").toLowerCase()}catch(e){return null}if(0===e.indexOf("javascript:")||0===e.indexOf("vbscript:")||0===e.indexOf("data:"))return null}t&&!u.test(s)&&(s=k(t,s));try{s=encodeURI(s).replace(/%25/g,"%")}catch(e){return null}return s},resolveUrl:k,noopTest:{exec:function(){}},merge:function(e){let t,s,n=1;for(;n{let n=!1,r=t;for(;--r>=0&&"\\"===s[r];)n=!n;return n?"|":" |"}).split(/ \|/);let n=0;if(s.length>t)s.splice(t);else for(;s.lengthAn error occurred:

    "+p(e.message+"",!0)+"
    ";throw e}}f.options=f.setOptions=function(e){return h(f.defaults,e),g(f.defaults),f},f.getDefaults=u,f.defaults=d,f.Parser=r,f.parser=r.parse,f.Renderer=i,f.TextRenderer=l,f.Lexer=n,f.lexer=n.lex,f.InlineLexer=a,f.inlineLexer=a.output,f.Slugger=o,f.parse=f,e.exports=f},"66f7":function(e,t,s){const n=s("SbYC"),r=s("J7Ao"),i=s("hyX7"),l=s("+/fp"),{defaults:a}=s("vbtb"),{merge:o,unescape:h}=s("rUJ1");e.exports=class e{constructor(e){this.tokens=[],this.token=null,this.options=e||a,this.options.renderer=this.options.renderer||new n,this.renderer=this.options.renderer,this.renderer.options=this.options,this.slugger=new r}static parse(t,s){return new e(s).parse(t)}parse(e){this.inline=new i(e.links,this.options),this.inlineText=new i(e.links,o({},this.options,{renderer:new l})),this.tokens=e.reverse();let t="";for(;this.next();)t+=this.tok();return t}next(){return this.token=this.tokens.pop(),this.token}peek(){return this.tokens[this.tokens.length-1]||0}parseText(){let e=this.token.text;for(;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)}tok(){let e="";switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,h(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":{let t,s,n,r,i="";for(n="",t=0;t?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){const e=t;do{this.seen[e]++,t=e+"-"+this.seen[e]}while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t}}},SbYC:function(e,t,s){const{defaults:n}=s("vbtb"),{cleanUrl:r,escape:i}=s("rUJ1");e.exports=class{constructor(e){this.options=e||n}code(e,t,s){const n=(t||"").match(/\S*/)[0];if(this.options.highlight){const t=this.options.highlight(e,n);null!=t&&t!==e&&(s=!0,e=t)}return n?'
    '+(s?e:i(e,!0))+"
    \n":"
    "+(s?e:i(e,!0))+"
    "}blockquote(e){return"
    \n"+e+"
    \n"}html(e){return e}heading(e,t,s,n){return this.options.headerIds?"'+e+"\n":""+e+"\n"}hr(){return this.options.xhtml?"
    \n":"
    \n"}list(e,t,s){const n=t?"ol":"ul";return"<"+n+(t&&1!==s?' start="'+s+'"':"")+">\n"+e+"\n"}listitem(e){return"
  • "+e+"
  • \n"}checkbox(e){return" "}paragraph(e){return"

    "+e+"

    \n"}table(e,t){return t&&(t=""+t+""),"\n\n"+e+"\n"+t+"
    \n"}tablerow(e){return"\n"+e+"\n"}tablecell(e,t){const s=t.header?"th":"td";return(t.align?"<"+s+' align="'+t.align+'">':"<"+s+">")+e+"\n"}strong(e){return""+e+""}em(e){return""+e+""}codespan(e){return""+e+""}br(){return this.options.xhtml?"
    ":"
    "}del(e){return""+e+""}link(e,t,s){if(null===(e=r(this.options.sanitize,this.options.baseUrl,e)))return s;let n='
    "}image(e,t,s){if(null===(e=r(this.options.sanitize,this.options.baseUrl,e)))return s;let n=''+s+'":">"}text(e){return e}}},T9Ld:function(e,t,s){const{defaults:n}=s("vbtb"),{block:r}=s("e56X"),{rtrim:i,splitCells:l,escape:a}=s("rUJ1");e.exports=class e{constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||n,this.rules=r.normal,this.options.pedantic?this.rules=r.pedantic:this.options.gfm&&(this.rules=r.gfm)}static get rules(){return r}static lex(t,s){return new e(s).lex(t)}lex(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," "),this.token(e,!0)}token(e,t){let s,n,o,h,c,p,u,g,d,f,b,k,m,x,_,w;for(e=e.replace(/^ +$/gm,"");e;)if((o=this.rules.newline.exec(e))&&(e=e.substring(o[0].length),o[0].length>1&&this.tokens.push({type:"space"})),o=this.rules.code.exec(e)){const t=this.tokens[this.tokens.length-1];e=e.substring(o[0].length),t&&"paragraph"===t.type?t.text+="\n"+o[0].trimRight():(o=o[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",codeBlockStyle:"indented",text:this.options.pedantic?o:i(o,"\n")}))}else if(o=this.rules.fences.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"code",lang:o[2]?o[2].trim():o[2],text:o[3]||""});else if(o=this.rules.heading.exec(e))e=e.substring(o[0].length),this.tokens.push({type:"heading",depth:o[1].length,text:o[2]});else if((o=this.rules.nptable.exec(e))&&(p={type:"table",header:l(o[1].replace(/^ *| *\| *$/g,"")),align:o[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:o[3]?o[3].replace(/\n$/,"").split("\n"):[]}).header.length===p.align.length){for(e=e.substring(o[0].length),b=0;b ?/gm,""),this.token(o,t),this.tokens.push({type:"blockquote_end"});else if(o=this.rules.list.exec(e)){for(e=e.substring(o[0].length),u={type:"list_start",ordered:x=(h=o[2]).length>1,start:x?+h:"",loose:!1},this.tokens.push(u),g=[],s=!1,m=(o=o[0].match(this.rules.item)).length,b=0;b1?1===c.length:c.length>1||this.options.smartLists&&c!==h)&&(e=o.slice(b+1).join("\n")+e,b=m-1)),n=s||/\n\n(?!\s*$)/.test(p),b!==m-1&&(s="\n"===p.charAt(p.length-1),n||(n=s)),n&&(u.loose=!0),w=void 0,(_=/^\[[ xX]\] /.test(p))&&(w=" "!==p[1],p=p.replace(/^\[[ xX]\] +/,"")),d={type:"list_item_start",task:_,checked:w,loose:n},g.push(d),this.tokens.push(d),this.token(p,!1),this.tokens.push({type:"list_item_end"});if(u.loose)for(m=g.length,b=0;b ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:n,table:n,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};l.def=r(l.def).replace("label",l._label).replace("title",l._title).getRegex(),l.bullet=/(?:[*+-]|\d{1,9}\.)/,l.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,l.item=r(l.item,"gm").replace(/bull/g,l.bullet).getRegex(),l.list=r(l.list).replace(/bull/g,l.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+l.def.source+")").getRegex(),l._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",l._comment=//,l.html=r(l.html,"i").replace("comment",l._comment).replace("tag",l._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),l.paragraph=r(l._paragraph).replace("hr",l.hr).replace("heading"," {0,3}#{1,6} +").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}|~{3,})[^`\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",l._tag).getRegex(),l.blockquote=r(l.blockquote).replace("paragraph",l.paragraph).getRegex(),l.normal=i({},l),l.gfm=i({},l.normal,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),l.pedantic=i({},l.normal,{html:r("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",l._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,fences:n,paragraph:r(l.normal._paragraph).replace("hr",l.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",l.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});const a={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:n,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:n,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\?@\\[^_{|}~"};a.em=r(a.em).replace(/punctuation/g,a._punctuation).getRegex(),a._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,a._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,a._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,a.autolink=r(a.autolink).replace("scheme",a._scheme).replace("email",a._email).getRegex(),a._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,a.tag=r(a.tag).replace("comment",l._comment).replace("attribute",a._attribute).getRegex(),a._label=/(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,a._href=/<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/,a._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,a.link=r(a.link).replace("label",a._label).replace("href",a._href).replace("title",a._title).getRegex(),a.reflink=r(a.reflink).replace("label",a._label).getRegex(),a.normal=i({},a),a.pedantic=i({},a.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:r(/^!?\[(label)\]\((.*?)\)/).replace("label",a._label).getRegex(),reflink:r(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",a._label).getRegex()}),a.gfm=i({},a.normal,{escape:r(a.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:/^(`+|[^`])(?:[\s\S]*?(?:(?=[\\/i.test(o[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(o[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(o[0])&&(this.inRawBlock=!1),t=t.substring(o[0].length),c+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):a(o[0]):o[0];else if(o=this.rules.link.exec(t)){const n=l(o[2],"()");if(n>-1){const e=(0===o[0].indexOf("!")?5:4)+o[1].length+n;o[2]=o[2].substring(0,n),o[0]=o[0].substring(0,e).trim(),o[3]=""}t=t.substring(o[0].length),this.inLink=!0,r=o[2],this.options.pedantic?(s=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(r))?(r=s[1],i=s[3]):i="":i=o[3]?o[3].slice(1,-1):"",r=r.trim().replace(/^<([\s\S]*)>$/,"$1"),c+=this.outputLink(o,{href:e.escapes(r),title:e.escapes(i)}),this.inLink=!1}else if((o=this.rules.reflink.exec(t))||(o=this.rules.nolink.exec(t))){if(t=t.substring(o[0].length),s=(o[2]||o[1]).replace(/\s+/g," "),!(s=this.links[s.toLowerCase()])||!s.href){c+=o[0].charAt(0),t=o[0].substring(1)+t;continue}this.inLink=!0,c+=this.outputLink(o,s),this.inLink=!1}else if(o=this.rules.strong.exec(t))t=t.substring(o[0].length),c+=this.renderer.strong(this.output(o[4]||o[3]||o[2]||o[1]));else if(o=this.rules.em.exec(t))t=t.substring(o[0].length),c+=this.renderer.em(this.output(o[6]||o[5]||o[4]||o[3]||o[2]||o[1]));else if(o=this.rules.code.exec(t))t=t.substring(o[0].length),c+=this.renderer.codespan(a(o[2].trim(),!0));else if(o=this.rules.br.exec(t))t=t.substring(o[0].length),c+=this.renderer.br();else if(o=this.rules.del.exec(t))t=t.substring(o[0].length),c+=this.renderer.del(this.output(o[1]));else if(o=this.rules.autolink.exec(t))t=t.substring(o[0].length),r="@"===o[2]?"mailto:"+(n=a(this.mangle(o[1]))):n=a(o[1]),c+=this.renderer.link(r,null,n);else if(this.inLink||!(o=this.rules.url.exec(t))){if(o=this.rules.text.exec(t))t=t.substring(o[0].length),this.inRawBlock?c+=this.renderer.text(this.options.sanitize?this.options.sanitizer?this.options.sanitizer(o[0]):a(o[0]):o[0]):c+=this.renderer.text(a(this.smartypants(o[0])));else if(t)throw new Error("Infinite loop on byte: "+t.charCodeAt(0))}else{if("@"===o[2])r="mailto:"+(n=a(o[0]));else{do{h=o[0],o[0]=this.rules._backpedal.exec(o[0])[0]}while(h!==o[0]);n=a(o[0]),r="www."===o[1]?"http://"+n:n}t=t.substring(o[0].length),c+=this.renderer.link(r,null,n)}return c}static escapes(t){return t?t.replace(e.rules._escapes,"$1"):t}outputLink(e,t){const s=t.href,n=t.title?a(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(s,n,this.output(e[1])):this.renderer.image(s,n,a(e[1]))}smartypants(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e}mangle(e){if(!this.options.mangle)return e;const t=e.length;let s,n="",r=0;for(;r.5&&(s="x"+s.toString(16)),n+="&#"+s+";";return n}}},rUJ1:function(e,t){const s=/[&<>"']/,n=/[&<>"']/g,r=/[<>"']|&(?!#?\w+;)/,i=/[<>"']|&(?!#?\w+;)/g,l={"&":"&","<":"<",">":">",'"':""","'":"'"},a=e=>l[e];const o=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function h(e){return e.replace(o,(e,t)=>"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):"")}const c=/(^|[^\[])\^/g;const p=/[^\w:]/g,u=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;const g={},d=/^[^:]+:\/*[^/]*$/,f=/^([^:]+:)[\s\S]*$/,b=/^([^:]+:\/*[^/]*)[\s\S]*$/;function k(e,t){g[" "+e]||(d.test(e)?g[" "+e]=e+"/":g[" "+e]=m(e,"/",!0));const s=-1===(e=g[" "+e]).indexOf(":");return"//"===t.substring(0,2)?s?t:e.replace(f,"$1")+t:"/"===t.charAt(0)?s?t:e.replace(b,"$1")+t:e+t}function m(e,t,s){const n=e.length;if(0===n)return"";let r=0;for(;r(n=(n=n.source||n).replace(c,"$1"),e=e.replace(t,n),s),getRegex:()=>new RegExp(e,t)};return s},cleanUrl:function(e,t,s){if(e){let e;try{e=decodeURIComponent(h(s)).replace(p,"").toLowerCase()}catch(e){return null}if(0===e.indexOf("javascript:")||0===e.indexOf("vbscript:")||0===e.indexOf("data:"))return null}t&&!u.test(s)&&(s=k(t,s));try{s=encodeURI(s).replace(/%25/g,"%")}catch(e){return null}return s},resolveUrl:k,noopTest:{exec:function(){}},merge:function(e){let t,s,n=1;for(;n{let n=!1,r=t;for(;--r>=0&&"\\"===s[r];)n=!n;return n?"|":" |"}).split(/ \|/);let n=0;if(s.length>t)s.splice(t);else for(;s.length","\"","'","getEscapeReplacement","unescapeTest","_","n","String","fromCharCode","parseInt","caret","nonWordAndColonTest","originIndependentUrl","baseUrls","justDomain","protocol","domain","resolveUrl","base","relativeBase","str","c","invert","suffLen","currChar","substr","encode","regex","obj","name","val","prot","decodeURIComponent","encodeURI","target","key","arguments","tableRow","count","offset","curr","splice","warn","newDefaults"],"mappings":"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","file":"static/js/chunk-7f9e.c49aa694.js","sourcesContent":["/**\n * TextRenderer\n * returns only the textual part of the token\n */\nmodule.exports = class TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n\n em(text) {\n return text;\n }\n\n codespan(text) {\n return text;\n }\n\n del(text) {\n return text;\n }\n\n text(text) {\n return text;\n }\n\n link(href, title, text) {\n return '' + text;\n }\n\n image(href, title, text) {\n return '' + text;\n }\n\n br() {\n return '';\n }\n};\n","const Lexer = require('./Lexer.js');\nconst Parser = require('./Parser.js');\nconst Renderer = require('./Renderer.js');\nconst TextRenderer = require('./TextRenderer.js');\nconst InlineLexer = require('./InlineLexer.js');\nconst Slugger = require('./Slugger.js');\nconst {\n merge,\n checkSanitizeDeprecation,\n escape\n} = require('./helpers.js');\nconst {\n getDefaults,\n changeDefaults,\n defaults\n} = require('./defaults.js');\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n throw new Error('marked(): input parameter is undefined or null');\n }\n if (typeof src !== 'string') {\n throw new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected');\n }\n\n if (callback || typeof opt === 'function') {\n if (!callback) {\n callback = opt;\n opt = null;\n }\n\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n const highlight = opt.highlight;\n let tokens,\n pending,\n i = 0;\n\n try {\n tokens = Lexer.lex(src, opt);\n } catch (e) {\n return callback(e);\n }\n\n pending = tokens.length;\n\n const done = function(err) {\n if (err) {\n opt.highlight = highlight;\n return callback(err);\n }\n\n let out;\n\n try {\n out = Parser.parse(tokens, opt);\n } catch (e) {\n err = e;\n }\n\n opt.highlight = highlight;\n\n return err\n ? callback(err)\n : callback(null, out);\n };\n\n if (!highlight || highlight.length < 3) {\n return done();\n }\n\n delete opt.highlight;\n\n if (!pending) return done();\n\n for (; i < tokens.length; i++) {\n (function(token) {\n if (token.type !== 'code') {\n return --pending || done();\n }\n return highlight(token.text, token.lang, function(err, code) {\n if (err) return done(err);\n if (code == null || code === token.text) {\n return --pending || done();\n }\n token.text = code;\n token.escaped = true;\n --pending || done();\n });\n })(tokens[i]);\n }\n\n return;\n }\n try {\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n return Parser.parse(Lexer.lex(src, opt), opt);\n } catch (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if ((opt || marked.defaults).silent) {\n return '

    An error occurred:

    '\n        + escape(e.message + '', true)\n        + '
    ';\n }\n throw e;\n }\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n merge(marked.defaults, opt);\n changeDefaults(marked.defaults);\n return marked;\n};\n\nmarked.getDefaults = getDefaults;\n\nmarked.defaults = defaults;\n\n/**\n * Expose\n */\n\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\n\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\n\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\n\nmarked.InlineLexer = InlineLexer;\nmarked.inlineLexer = InlineLexer.output;\n\nmarked.Slugger = Slugger;\n\nmarked.parse = marked;\n\nmodule.exports = marked;\n","const Renderer = require('./Renderer.js');\nconst Slugger = require('./Slugger.js');\nconst InlineLexer = require('./InlineLexer.js');\nconst TextRenderer = require('./TextRenderer.js');\nconst { defaults } = require('./defaults.js');\nconst {\n merge,\n unescape\n} = require('./helpers.js');\n\n/**\n * Parsing & Compiling\n */\nmodule.exports = class Parser {\n constructor(options) {\n this.tokens = [];\n this.token = null;\n this.options = options || defaults;\n this.options.renderer = this.options.renderer || new Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.slugger = new Slugger();\n }\n\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new Parser(options);\n return parser.parse(tokens);\n };\n\n /**\n * Parse Loop\n */\n parse(tokens) {\n this.inline = new InlineLexer(tokens.links, this.options);\n // use an InlineLexer with a TextRenderer to extract pure text\n this.inlineText = new InlineLexer(\n tokens.links,\n merge({}, this.options, { renderer: new TextRenderer() })\n );\n this.tokens = tokens.reverse();\n\n let out = '';\n while (this.next()) {\n out += this.tok();\n }\n\n return out;\n };\n\n /**\n * Next Token\n */\n next() {\n this.token = this.tokens.pop();\n return this.token;\n };\n\n /**\n * Preview Next Token\n */\n peek() {\n return this.tokens[this.tokens.length - 1] || 0;\n };\n\n /**\n * Parse Text Tokens\n */\n parseText() {\n let body = this.token.text;\n\n while (this.peek().type === 'text') {\n body += '\\n' + this.next().text;\n }\n\n return this.inline.output(body);\n };\n\n /**\n * Parse Current Token\n */\n tok() {\n let body = '';\n switch (this.token.type) {\n case 'space': {\n return '';\n }\n case 'hr': {\n return this.renderer.hr();\n }\n case 'heading': {\n return this.renderer.heading(\n this.inline.output(this.token.text),\n this.token.depth,\n unescape(this.inlineText.output(this.token.text)),\n this.slugger);\n }\n case 'code': {\n return this.renderer.code(this.token.text,\n this.token.lang,\n this.token.escaped);\n }\n case 'table': {\n let header = '',\n i,\n row,\n cell,\n j;\n\n // header\n cell = '';\n for (i = 0; i < this.token.header.length; i++) {\n cell += this.renderer.tablecell(\n this.inline.output(this.token.header[i]),\n { header: true, align: this.token.align[i] }\n );\n }\n header += this.renderer.tablerow(cell);\n\n for (i = 0; i < this.token.cells.length; i++) {\n row = this.token.cells[i];\n\n cell = '';\n for (j = 0; j < row.length; j++) {\n cell += this.renderer.tablecell(\n this.inline.output(row[j]),\n { header: false, align: this.token.align[j] }\n );\n }\n\n body += this.renderer.tablerow(cell);\n }\n return this.renderer.table(header, body);\n }\n case 'blockquote_start': {\n body = '';\n\n while (this.next().type !== 'blockquote_end') {\n body += this.tok();\n }\n\n return this.renderer.blockquote(body);\n }\n case 'list_start': {\n body = '';\n const ordered = this.token.ordered,\n start = this.token.start;\n\n while (this.next().type !== 'list_end') {\n body += this.tok();\n }\n\n return this.renderer.list(body, ordered, start);\n }\n case 'list_item_start': {\n body = '';\n const loose = this.token.loose;\n const checked = this.token.checked;\n const task = this.token.task;\n\n if (this.token.task) {\n if (loose) {\n if (this.peek().type === 'text') {\n const nextToken = this.peek();\n nextToken.text = this.renderer.checkbox(checked) + ' ' + nextToken.text;\n } else {\n this.tokens.push({\n type: 'text',\n text: this.renderer.checkbox(checked)\n });\n }\n } else {\n body += this.renderer.checkbox(checked);\n }\n }\n\n while (this.next().type !== 'list_item_end') {\n body += !loose && this.token.type === 'text'\n ? this.parseText()\n : this.tok();\n }\n return this.renderer.listitem(body, task, checked);\n }\n case 'html': {\n // TODO parse inline content if parameter markdown=1\n return this.renderer.html(this.token.text);\n }\n case 'paragraph': {\n return this.renderer.paragraph(this.inline.output(this.token.text));\n }\n case 'text': {\n return this.renderer.paragraph(this.parseText());\n }\n default: {\n const errMsg = 'Token with \"' + this.token.type + '\" type was not found.';\n if (this.options.silent) {\n console.log(errMsg);\n } else {\n throw new Error(errMsg);\n }\n }\n }\n };\n};\n","/**\n * Slugger generates header id\n */\nmodule.exports = class Slugger {\n constructor() {\n this.seen = {};\n }\n\n /**\n * Convert string to unique id\n */\n slug(value) {\n let slug = value\n .toLowerCase()\n .trim()\n .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '')\n .replace(/\\s/g, '-');\n\n if (this.seen.hasOwnProperty(slug)) {\n const originalSlug = slug;\n do {\n this.seen[originalSlug]++;\n slug = originalSlug + '-' + this.seen[originalSlug];\n } while (this.seen.hasOwnProperty(slug));\n }\n this.seen[slug] = 0;\n\n return slug;\n };\n};\n","const { defaults } = require('./defaults.js');\nconst {\n cleanUrl,\n escape\n} = require('./helpers.js');\n\n/**\n * Renderer\n */\nmodule.exports = class Renderer {\n constructor(options) {\n this.options = options || defaults;\n }\n\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/\\S*/)[0];\n if (this.options.highlight) {\n const out = this.options.highlight(code, lang);\n if (out != null && out !== code) {\n escaped = true;\n code = out;\n }\n }\n\n if (!lang) {\n return '
    '\n        + (escaped ? code : escape(code, true))\n        + '
    ';\n }\n\n return '
    '\n      + (escaped ? code : escape(code, true))\n      + '
    \\n';\n };\n\n blockquote(quote) {\n return '
    \\n' + quote + '
    \\n';\n };\n\n html(html) {\n return html;\n };\n\n heading(text, level, raw, slugger) {\n if (this.options.headerIds) {\n return ''\n + text\n + '\\n';\n }\n // ignore IDs\n return '' + text + '\\n';\n };\n\n hr() {\n return this.options.xhtml ? '
    \\n' : '
    \\n';\n };\n\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul',\n startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '\\n';\n };\n\n listitem(text) {\n return '
  • ' + text + '
  • \\n';\n };\n\n checkbox(checked) {\n return ' ';\n };\n\n paragraph(text) {\n return '

    ' + text + '

    \\n';\n };\n\n table(header, body) {\n if (body) body = '' + body + '';\n\n return '\\n'\n + '\\n'\n + header\n + '\\n'\n + body\n + '
    \\n';\n };\n\n tablerow(content) {\n return '\\n' + content + '\\n';\n };\n\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? '<' + type + ' align=\"' + flags.align + '\">'\n : '<' + type + '>';\n return tag + content + '\\n';\n };\n\n // span level renderer\n strong(text) {\n return '' + text + '';\n };\n\n em(text) {\n return '' + text + '';\n };\n\n codespan(text) {\n return '' + text + '';\n };\n\n br() {\n return this.options.xhtml ? '
    ' : '
    ';\n };\n\n del(text) {\n return '' + text + '';\n };\n\n link(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n let out = '
    ';\n return out;\n };\n\n image(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n\n let out = '\"'' : '>';\n return out;\n };\n\n text(text) {\n return text;\n };\n};\n","const { defaults } = require('./defaults.js');\nconst { block } = require('./rules.js');\nconst {\n rtrim,\n splitCells,\n escape\n} = require('./helpers.js');\n\n/**\n * Block Lexer\n */\nmodule.exports = class Lexer {\n constructor(options) {\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || defaults;\n this.rules = block.normal;\n\n if (this.options.pedantic) {\n this.rules = block.pedantic;\n } else if (this.options.gfm) {\n this.rules = block.gfm;\n }\n }\n\n /**\n * Expose Block Rules\n */\n static get rules() {\n return block;\n }\n\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new Lexer(options);\n return lexer.lex(src);\n };\n\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n')\n .replace(/\\t/g, ' ');\n\n return this.token(src, true);\n };\n\n /**\n * Lexing\n */\n token(src, top) {\n src = src.replace(/^ +$/gm, '');\n let next,\n loose,\n cap,\n bull,\n b,\n item,\n listStart,\n listItems,\n t,\n space,\n i,\n tag,\n l,\n isordered,\n istask,\n ischecked;\n\n while (src) {\n // newline\n if (cap = this.rules.newline.exec(src)) {\n src = src.substring(cap[0].length);\n if (cap[0].length > 1) {\n this.tokens.push({\n type: 'space'\n });\n }\n }\n\n // code\n if (cap = this.rules.code.exec(src)) {\n const lastToken = this.tokens[this.tokens.length - 1];\n src = src.substring(cap[0].length);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && lastToken.type === 'paragraph') {\n lastToken.text += '\\n' + cap[0].trimRight();\n } else {\n cap = cap[0].replace(/^ {4}/gm, '');\n this.tokens.push({\n type: 'code',\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(cap, '\\n')\n : cap\n });\n }\n continue;\n }\n\n // fences\n if (cap = this.rules.fences.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'code',\n lang: cap[2] ? cap[2].trim() : cap[2],\n text: cap[3] || ''\n });\n continue;\n }\n\n // heading\n if (cap = this.rules.heading.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'heading',\n depth: cap[1].length,\n text: cap[2]\n });\n continue;\n }\n\n // table no leading pipe (gfm)\n if (cap = this.rules.nptable.exec(src)) {\n item = {\n type: 'table',\n header: splitCells(cap[1].replace(/^ *| *\\| *$/g, '')),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n cells: cap[3] ? cap[3].replace(/\\n$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n src = src.substring(cap[0].length);\n\n for (i = 0; i < item.align.length; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n for (i = 0; i < item.cells.length; i++) {\n item.cells[i] = splitCells(item.cells[i], item.header.length);\n }\n\n this.tokens.push(item);\n\n continue;\n }\n }\n\n // hr\n if (cap = this.rules.hr.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'hr'\n });\n continue;\n }\n\n // blockquote\n if (cap = this.rules.blockquote.exec(src)) {\n src = src.substring(cap[0].length);\n\n this.tokens.push({\n type: 'blockquote_start'\n });\n\n cap = cap[0].replace(/^ *> ?/gm, '');\n\n // Pass `top` to keep the current\n // \"toplevel\" state. This is exactly\n // how markdown.pl works.\n this.token(cap, top);\n\n this.tokens.push({\n type: 'blockquote_end'\n });\n\n continue;\n }\n\n // list\n if (cap = this.rules.list.exec(src)) {\n src = src.substring(cap[0].length);\n bull = cap[2];\n isordered = bull.length > 1;\n\n listStart = {\n type: 'list_start',\n ordered: isordered,\n start: isordered ? +bull : '',\n loose: false\n };\n\n this.tokens.push(listStart);\n\n // Get each top-level item.\n cap = cap[0].match(this.rules.item);\n\n listItems = [];\n next = false;\n l = cap.length;\n i = 0;\n\n for (; i < l; i++) {\n item = cap[i];\n\n // Remove the list item's bullet\n // so it is seen as the next token.\n space = item.length;\n item = item.replace(/^ *([*+-]|\\d+\\.) */, '');\n\n // Outdent whatever the\n // list item contains. Hacky.\n if (~item.indexOf('\\n ')) {\n space -= item.length;\n item = !this.options.pedantic\n ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')\n : item.replace(/^ {1,4}/gm, '');\n }\n\n // Determine whether the next list item belongs here.\n // Backpedal if it does not belong in this list.\n if (i !== l - 1) {\n b = block.bullet.exec(cap[i + 1])[0];\n if (bull.length > 1 ? b.length === 1\n : (b.length > 1 || (this.options.smartLists && b !== bull))) {\n src = cap.slice(i + 1).join('\\n') + src;\n i = l - 1;\n }\n }\n\n // Determine whether item is loose or not.\n // Use: /(^|\\n)(?! )[^\\n]+\\n\\n(?!\\s*$)/\n // for discount behavior.\n loose = next || /\\n\\n(?!\\s*$)/.test(item);\n if (i !== l - 1) {\n next = item.charAt(item.length - 1) === '\\n';\n if (!loose) loose = next;\n }\n\n if (loose) {\n listStart.loose = true;\n }\n\n // Check for task list items\n istask = /^\\[[ xX]\\] /.test(item);\n ischecked = undefined;\n if (istask) {\n ischecked = item[1] !== ' ';\n item = item.replace(/^\\[[ xX]\\] +/, '');\n }\n\n t = {\n type: 'list_item_start',\n task: istask,\n checked: ischecked,\n loose: loose\n };\n\n listItems.push(t);\n this.tokens.push(t);\n\n // Recurse.\n this.token(item, false);\n\n this.tokens.push({\n type: 'list_item_end'\n });\n }\n\n if (listStart.loose) {\n l = listItems.length;\n i = 0;\n for (; i < l; i++) {\n listItems[i].loose = true;\n }\n }\n\n this.tokens.push({\n type: 'list_end'\n });\n\n continue;\n }\n\n // html\n if (cap = this.rules.html.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: this.options.sanitize\n ? 'paragraph'\n : 'html',\n pre: !this.options.sanitizer\n && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]\n });\n continue;\n }\n\n // def\n if (top && (cap = this.rules.def.exec(src))) {\n src = src.substring(cap[0].length);\n if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);\n tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n if (!this.tokens.links[tag]) {\n this.tokens.links[tag] = {\n href: cap[2],\n title: cap[3]\n };\n }\n continue;\n }\n\n // table (gfm)\n if (cap = this.rules.table.exec(src)) {\n item = {\n type: 'table',\n header: splitCells(cap[1].replace(/^ *| *\\| *$/g, '')),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n cells: cap[3] ? cap[3].replace(/\\n$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n src = src.substring(cap[0].length);\n\n for (i = 0; i < item.align.length; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n for (i = 0; i < item.cells.length; i++) {\n item.cells[i] = splitCells(\n item.cells[i].replace(/^ *\\| *| *\\| *$/g, ''),\n item.header.length);\n }\n\n this.tokens.push(item);\n\n continue;\n }\n }\n\n // lheading\n if (cap = this.rules.lheading.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'heading',\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1]\n });\n continue;\n }\n\n // top-level paragraph\n if (top && (cap = this.rules.paragraph.exec(src))) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'paragraph',\n text: cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1]\n });\n continue;\n }\n\n // text\n if (cap = this.rules.text.exec(src)) {\n // Top-level should never reach here.\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'text',\n text: cap[0]\n });\n continue;\n }\n\n if (src) {\n throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));\n }\n }\n\n return this.tokens;\n };\n};\n","const {\n noopTest,\n edit,\n merge\n} = require('./helpers.js');\n\n/**\n * Block-Level Grammar\n */\nconst block = {\n newline: /^\\n+/,\n code: /^( {4}[^\\n]+\\n*)+/,\n fences: /^ {0,3}(`{3,}|~{3,})([^`~\\n]*)\\n(?:|([\\s\\S]*?)\\n)(?: {0,3}\\1[~`]* *(?:\\n+|$)|$)/,\n hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)/,\n heading: /^ {0,3}(#{1,6}) +([^\\n]*?)(?: +#+)? *(?:\\n+|$)/,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( {0,3})(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style)[\\\\s>][\\\\s\\\\S]*?(?:[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?\\\\?>\\\\n*' // (3)\n + '|\\\\n*' // (4)\n + '|\\\\n*' // (5)\n + '|)[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (6)\n + '|<(?!script|pre|style)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (7) open tag\n + '|(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *\\n? *]+)>?(?:(?: +\\n? *| *\\n *)(title))? *(?:\\n+|$)/,\n nptable: noopTest,\n table: noopTest,\n lheading: /^([^\\n]+)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n // regex template, placeholders will be replaced according to different paragraph\n // interruption rules of commonmark and the original markdown spec:\n _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\\n]+)*)/,\n text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\[\\[\\]]|[^\\[\\]])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n .replace('label', block._label)\n .replace('title', block._title)\n .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d{1,9}\\.)/;\nblock.item = /^( *)(bull) ?[^\\n]*(?:\\n(?!\\1bull ?)[^\\n]*)*/;\nblock.item = edit(block.item, 'gm')\n .replace(/bull/g, block.bullet)\n .getRegex();\n\nblock.list = edit(block.list)\n .replace(/bull/g, block.bullet)\n .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n .replace('def', '\\\\n+(?=' + block.def.source + ')')\n .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n + '|track|ul';\nblock._comment = //;\nblock.html = edit(block.html, 'i')\n .replace('comment', block._comment)\n .replace('tag', block._tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nblock.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} +')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}|~{3,})[^`\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', ')|<(?:script|pre|style|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n .replace('paragraph', block.paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = merge({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = merge({}, block.normal, {\n nptable: /^ *([^|\\n ].*\\|.*)\\n *([-:]+ *\\|[-| :]*)(?:\\n((?:.*[^>\\n ].*(?:\\n|$))*)\\n*|$)/,\n table: /^ *\\|(.+)\\n *\\|?( *[-:]+[-| :]*)(?:\\n((?: *[^>\\n ].*(?:\\n|$))*)\\n*|$)/\n});\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = merge({}, block.normal, {\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+? *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', block._comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^ *(#{1,6}) *([^\\n]+?) *(?:#+ *)?(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n paragraph: edit(block.normal._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', block.lheading)\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .getRegex()\n});\n\n/**\n * Inline-Level Grammar\n */\nconst inline = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noopTest,\n tag: '^comment'\n + '|^' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. \n + '|^' // declaration, e.g. \n + '|^', // CDATA section\n link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(?!\\s*\\])((?:\\\\[\\[\\]]?|[^\\[\\]\\\\])+)\\]/,\n nolink: /^!?\\[(?!\\s*\\])((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\](?:\\[\\])?/,\n strong: /^__([^\\s_])__(?!_)|^\\*\\*([^\\s*])\\*\\*(?!\\*)|^__([^\\s][\\s\\S]*?[^\\s])__(?!_)|^\\*\\*([^\\s][\\s\\S]*?[^\\s])\\*\\*(?!\\*)/,\n em: /^_([^\\s_])_(?!_)|^\\*([^\\s*<\\[])\\*(?!\\*)|^_([^\\s<][\\s\\S]*?[^\\s_])_(?!_|[^\\spunctuation])|^_([^\\s_<][\\s\\S]*?[^\\s])_(?!_|[^\\spunctuation])|^\\*([^\\s<\"][\\s\\S]*?[^\\s\\*])\\*(?!\\*|[^\\spunctuation])|^\\*([^\\s*\"<\\[][\\s\\S]*?[^\\s])\\*(?!\\*)/,\n code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n del: noopTest,\n text: /^(`+|[^`])(?:[\\s\\S]*?(?:(?=[\\\\?@\\\\[^_{|}~';\ninline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();\n\ninline._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n .replace('scheme', inline._scheme)\n .replace('email', inline._email)\n .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n .replace('comment', block._comment)\n .replace('attribute', inline._attribute)\n .getRegex();\n\ninline._label = /(?:\\[[^\\[\\]]*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\[<>]?|[^\\s<>\\\\])*>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n .replace('label', inline._label)\n .replace('href', inline._href)\n .replace('title', inline._title)\n .getRegex();\n\ninline.reflink = edit(inline.reflink)\n .replace('label', inline._label)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = merge({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = merge({}, inline.normal, {\n strong: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n em: /^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', inline._label)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', inline._label)\n .getRegex()\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = merge({}, inline.normal, {\n escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n _backpedal: /(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,\n del: /^~+(?=\\S)([\\s\\S]*?\\S)~+/,\n text: /^(`+|[^`])(?:[\\s\\S]*?(?:(?=[\\\\/i.test(cap[0])) {\n this.inLink = false;\n }\n if (!this.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.inRawBlock = true;\n } else if (this.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.inRawBlock = false;\n }\n\n src = src.substring(cap[0].length);\n out += this.options.sanitize\n ? this.options.sanitizer\n ? this.options.sanitizer(cap[0])\n : escape(cap[0])\n : cap[0];\n continue;\n }\n\n // link\n if (cap = this.rules.link.exec(src)) {\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n src = src.substring(cap[0].length);\n this.inLink = true;\n href = cap[2];\n if (this.options.pedantic) {\n link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n } else {\n title = '';\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim().replace(/^<([\\s\\S]*)>$/, '$1');\n out += this.outputLink(cap, {\n href: InlineLexer.escapes(href),\n title: InlineLexer.escapes(title)\n });\n this.inLink = false;\n continue;\n }\n\n // reflink, nolink\n if ((cap = this.rules.reflink.exec(src))\n || (cap = this.rules.nolink.exec(src))) {\n src = src.substring(cap[0].length);\n link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = this.links[link.toLowerCase()];\n if (!link || !link.href) {\n out += cap[0].charAt(0);\n src = cap[0].substring(1) + src;\n continue;\n }\n this.inLink = true;\n out += this.outputLink(cap, link);\n this.inLink = false;\n continue;\n }\n\n // strong\n if (cap = this.rules.strong.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));\n continue;\n }\n\n // em\n if (cap = this.rules.em.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));\n continue;\n }\n\n // code\n if (cap = this.rules.code.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.codespan(escape(cap[2].trim(), true));\n continue;\n }\n\n // br\n if (cap = this.rules.br.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.br();\n continue;\n }\n\n // del (gfm)\n if (cap = this.rules.del.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.del(this.output(cap[1]));\n continue;\n }\n\n // autolink\n if (cap = this.rules.autolink.exec(src)) {\n src = src.substring(cap[0].length);\n if (cap[2] === '@') {\n text = escape(this.mangle(cap[1]));\n href = 'mailto:' + text;\n } else {\n text = escape(cap[1]);\n href = text;\n }\n out += this.renderer.link(href, null, text);\n continue;\n }\n\n // url (gfm)\n if (!this.inLink && (cap = this.rules.url.exec(src))) {\n if (cap[2] === '@') {\n text = escape(cap[0]);\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules._backpedal.exec(cap[0])[0];\n } while (prevCapZero !== cap[0]);\n text = escape(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + text;\n } else {\n href = text;\n }\n }\n src = src.substring(cap[0].length);\n out += this.renderer.link(href, null, text);\n continue;\n }\n\n // text\n if (cap = this.rules.text.exec(src)) {\n src = src.substring(cap[0].length);\n if (this.inRawBlock) {\n out += this.renderer.text(this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]);\n } else {\n out += this.renderer.text(escape(this.smartypants(cap[0])));\n }\n continue;\n }\n\n if (src) {\n throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));\n }\n }\n\n return out;\n }\n\n static escapes(text) {\n return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;\n }\n\n /**\n * Compile Link\n */\n outputLink(cap, link) {\n const href = link.href,\n title = link.title ? escape(link.title) : null;\n\n return cap[0].charAt(0) !== '!'\n ? this.renderer.link(href, title, this.output(cap[1]))\n : this.renderer.image(href, title, escape(cap[1]));\n }\n\n /**\n * Smartypants Transformations\n */\n smartypants(text) {\n if (!this.options.smartypants) return text;\n return text\n // em-dashes\n .replace(/---/g, '\\u2014')\n // en-dashes\n .replace(/--/g, '\\u2013')\n // opening singles\n .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n // closing singles & apostrophes\n .replace(/'/g, '\\u2019')\n // opening doubles\n .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n // closing doubles\n .replace(/\"/g, '\\u201d')\n // ellipses\n .replace(/\\.{3}/g, '\\u2026');\n }\n\n /**\n * Mangle Links\n */\n mangle(text) {\n if (!this.options.mangle) return text;\n const l = text.length;\n let out = '',\n i = 0,\n ch;\n\n for (; i < l; i++) {\n ch = text.charCodeAt(i);\n if (Math.random() > 0.5) {\n ch = 'x' + ch.toString(16);\n }\n out += '&#' + ch + ';';\n }\n\n return out;\n }\n};\n","/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = /[&<>\"']/g;\nconst escapeTestNoEncode = /[<>\"']|&(?!#?\\w+;)/;\nconst escapeReplaceNoEncode = /[<>\"']|&(?!#?\\w+;)/g;\nconst escapeReplacements = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n } else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n regex = regex.source || regex;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n val = val.source || val;\n val = val.replace(caret, '$1');\n regex = regex.replace(name, val);\n return obj;\n },\n getRegex: () => {\n return new RegExp(regex, opt);\n }\n };\n return obj;\n}\n\nconst nonWordAndColonTest = /[^\\w:]/g;\nconst originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\nfunction cleanUrl(sanitize, base, href) {\n if (sanitize) {\n let prot;\n try {\n prot = decodeURIComponent(unescape(href))\n .replace(nonWordAndColonTest, '')\n .toLowerCase();\n } catch (e) {\n return null;\n }\n if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n return null;\n }\n }\n if (base && !originIndependentUrl.test(href)) {\n href = resolveUrl(base, href);\n }\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n } catch (e) {\n return null;\n }\n return href;\n}\n\nconst baseUrls = {};\nconst justDomain = /^[^:]+:\\/*[^/]*$/;\nconst protocol = /^([^:]+:)[\\s\\S]*$/;\nconst domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\nfunction resolveUrl(base, href) {\n if (!baseUrls[' ' + base]) {\n // we can ignore everything in base after the last slash of its path component,\n // but we might need to add _that_\n // https://tools.ietf.org/html/rfc3986#section-3\n if (justDomain.test(base)) {\n baseUrls[' ' + base] = base + '/';\n } else {\n baseUrls[' ' + base] = rtrim(base, '/', true);\n }\n }\n base = baseUrls[' ' + base];\n const relativeBase = base.indexOf(':') === -1;\n\n if (href.substring(0, 2) === '//') {\n if (relativeBase) {\n return href;\n }\n return base.replace(protocol, '$1') + href;\n } else if (href.charAt(0) === '/') {\n if (relativeBase) {\n return href;\n }\n return base.replace(domain, '$1') + href;\n } else {\n return base + href;\n }\n}\n\nconst noopTest = { exec: function noopTest() {} };\n\nfunction merge(obj) {\n let i = 1,\n target,\n key;\n\n for (; i < arguments.length; i++) {\n target = arguments[i];\n for (key in target) {\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n obj[key] = target[key];\n }\n }\n }\n\n return obj;\n}\n\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false,\n curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(/ \\|/);\n let i = 0;\n\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n\n// Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n// /c*$/ is vulnerable to REDOS.\n// invert: Remove suffix of non-c chars instead. Default falsey.\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.substr(0, l - suffLen);\n}\n\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n const l = str.length;\n let level = 0,\n i = 0;\n for (; i < l; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction checkSanitizeDeprecation(opt) {\n if (opt && opt.sanitize && !opt.silent) {\n console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n }\n}\n\nmodule.exports = {\n escape,\n unescape,\n edit,\n cleanUrl,\n resolveUrl,\n noopTest,\n merge,\n splitCells,\n rtrim,\n findClosingBracket,\n checkSanitizeDeprecation\n};\n","function getDefaults() {\n return {\n baseUrl: null,\n breaks: false,\n gfm: true,\n headerIds: true,\n headerPrefix: '',\n highlight: null,\n langPrefix: 'language-',\n mangle: true,\n pedantic: false,\n renderer: null,\n sanitize: false,\n sanitizer: null,\n silent: false,\n smartLists: false,\n smartypants: false,\n xhtml: false\n };\n}\n\nfunction changeDefaults(newDefaults) {\n module.exports.defaults = newDefaults;\n}\n\nmodule.exports = {\n defaults: getDefaults(),\n getDefaults,\n changeDefaults\n};\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./node_modules/marked/src/TextRenderer.js","webpack:///./node_modules/marked/src/marked.js","webpack:///./node_modules/marked/src/Parser.js","webpack:///./node_modules/marked/src/Slugger.js","webpack:///./node_modules/marked/src/Renderer.js","webpack:///./node_modules/marked/src/Lexer.js","webpack:///./node_modules/marked/src/rules.js","webpack:///./node_modules/marked/src/InlineLexer.js","webpack:///./node_modules/marked/src/helpers.js","webpack:///./node_modules/marked/src/defaults.js"],"names":["module","exports","[object Object]","text","href","title","Lexer","__webpack_require__","Parser","Renderer","TextRenderer","InlineLexer","Slugger","merge","checkSanitizeDeprecation","escape","getDefaults","changeDefaults","defaults","marked","src","opt","callback","Error","Object","prototype","toString","call","highlight","tokens","pending","i","lex","e","length","done","err","out","parse","token","type","lang","code","escaped","message","silent","options","setOptions","parser","lexer","inlineLexer","output","unescape","this","renderer","slugger","inline","links","inlineText","reverse","next","tok","pop","body","peek","hr","heading","depth","row","cell","j","header","tablecell","align","tablerow","cells","table","blockquote","ordered","start","list","loose","checked","task","nextToken","checkbox","push","parseText","listitem","html","paragraph","errMsg","console","log","seen","value","slug","toLowerCase","trim","replace","hasOwnProperty","originalSlug","cleanUrl","infostring","match","langPrefix","quote","level","raw","headerIds","headerPrefix","xhtml","content","flags","sanitize","baseUrl","block","rtrim","splitCells","create","rules","normal","pedantic","gfm","top","cap","bull","b","item","listStart","listItems","t","space","tag","l","isordered","istask","ischecked","newline","exec","substring","lastToken","trimRight","codeBlockStyle","fences","nptable","split","test","indexOf","RegExp","bullet","smartLists","slice","join","charAt","undefined","pre","sanitizer","def","lheading","charCodeAt","noopTest","edit","_paragraph","_label","_title","getRegex","source","_tag","_comment","autolink","url","link","reflink","nolink","strong","em","br","del","_punctuation","_escapes","_scheme","_email","_attribute","_href","_extended_email","_backpedal","breaks","findClosingBracket","prevCapZero","inLink","inRawBlock","lastParenIndex","linkLen","outputLink","escapes","codespan","mangle","smartypants","image","ch","Math","random","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","&","<",">","\"","'","getEscapeReplacement","unescapeTest","_","n","String","fromCharCode","parseInt","caret","nonWordAndColonTest","originIndependentUrl","baseUrls","justDomain","protocol","domain","resolveUrl","base","relativeBase","str","c","invert","suffLen","currChar","substr","encode","regex","obj","name","val","prot","decodeURIComponent","encodeURI","target","key","arguments","tableRow","count","offset","curr","splice","warn","newDefaults"],"mappings":"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","file":"static/js/chunk-5118.7c48ad58.js","sourcesContent":["/**\n * TextRenderer\n * returns only the textual part of the token\n */\nmodule.exports = class TextRenderer {\n // no need for block level renderers\n strong(text) {\n return text;\n }\n\n em(text) {\n return text;\n }\n\n codespan(text) {\n return text;\n }\n\n del(text) {\n return text;\n }\n\n text(text) {\n return text;\n }\n\n link(href, title, text) {\n return '' + text;\n }\n\n image(href, title, text) {\n return '' + text;\n }\n\n br() {\n return '';\n }\n};\n","const Lexer = require('./Lexer.js');\nconst Parser = require('./Parser.js');\nconst Renderer = require('./Renderer.js');\nconst TextRenderer = require('./TextRenderer.js');\nconst InlineLexer = require('./InlineLexer.js');\nconst Slugger = require('./Slugger.js');\nconst {\n merge,\n checkSanitizeDeprecation,\n escape\n} = require('./helpers.js');\nconst {\n getDefaults,\n changeDefaults,\n defaults\n} = require('./defaults.js');\n\n/**\n * Marked\n */\nfunction marked(src, opt, callback) {\n // throw error in case of non string input\n if (typeof src === 'undefined' || src === null) {\n throw new Error('marked(): input parameter is undefined or null');\n }\n if (typeof src !== 'string') {\n throw new Error('marked(): input parameter is of type '\n + Object.prototype.toString.call(src) + ', string expected');\n }\n\n if (callback || typeof opt === 'function') {\n if (!callback) {\n callback = opt;\n opt = null;\n }\n\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n const highlight = opt.highlight;\n let tokens,\n pending,\n i = 0;\n\n try {\n tokens = Lexer.lex(src, opt);\n } catch (e) {\n return callback(e);\n }\n\n pending = tokens.length;\n\n const done = function(err) {\n if (err) {\n opt.highlight = highlight;\n return callback(err);\n }\n\n let out;\n\n try {\n out = Parser.parse(tokens, opt);\n } catch (e) {\n err = e;\n }\n\n opt.highlight = highlight;\n\n return err\n ? callback(err)\n : callback(null, out);\n };\n\n if (!highlight || highlight.length < 3) {\n return done();\n }\n\n delete opt.highlight;\n\n if (!pending) return done();\n\n for (; i < tokens.length; i++) {\n (function(token) {\n if (token.type !== 'code') {\n return --pending || done();\n }\n return highlight(token.text, token.lang, function(err, code) {\n if (err) return done(err);\n if (code == null || code === token.text) {\n return --pending || done();\n }\n token.text = code;\n token.escaped = true;\n --pending || done();\n });\n })(tokens[i]);\n }\n\n return;\n }\n try {\n opt = merge({}, marked.defaults, opt || {});\n checkSanitizeDeprecation(opt);\n return Parser.parse(Lexer.lex(src, opt), opt);\n } catch (e) {\n e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n if ((opt || marked.defaults).silent) {\n return '

    An error occurred:

    '\n        + escape(e.message + '', true)\n        + '
    ';\n }\n throw e;\n }\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n merge(marked.defaults, opt);\n changeDefaults(marked.defaults);\n return marked;\n};\n\nmarked.getDefaults = getDefaults;\n\nmarked.defaults = defaults;\n\n/**\n * Expose\n */\n\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\n\nmarked.Renderer = Renderer;\nmarked.TextRenderer = TextRenderer;\n\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\n\nmarked.InlineLexer = InlineLexer;\nmarked.inlineLexer = InlineLexer.output;\n\nmarked.Slugger = Slugger;\n\nmarked.parse = marked;\n\nmodule.exports = marked;\n","const Renderer = require('./Renderer.js');\nconst Slugger = require('./Slugger.js');\nconst InlineLexer = require('./InlineLexer.js');\nconst TextRenderer = require('./TextRenderer.js');\nconst { defaults } = require('./defaults.js');\nconst {\n merge,\n unescape\n} = require('./helpers.js');\n\n/**\n * Parsing & Compiling\n */\nmodule.exports = class Parser {\n constructor(options) {\n this.tokens = [];\n this.token = null;\n this.options = options || defaults;\n this.options.renderer = this.options.renderer || new Renderer();\n this.renderer = this.options.renderer;\n this.renderer.options = this.options;\n this.slugger = new Slugger();\n }\n\n /**\n * Static Parse Method\n */\n static parse(tokens, options) {\n const parser = new Parser(options);\n return parser.parse(tokens);\n };\n\n /**\n * Parse Loop\n */\n parse(tokens) {\n this.inline = new InlineLexer(tokens.links, this.options);\n // use an InlineLexer with a TextRenderer to extract pure text\n this.inlineText = new InlineLexer(\n tokens.links,\n merge({}, this.options, { renderer: new TextRenderer() })\n );\n this.tokens = tokens.reverse();\n\n let out = '';\n while (this.next()) {\n out += this.tok();\n }\n\n return out;\n };\n\n /**\n * Next Token\n */\n next() {\n this.token = this.tokens.pop();\n return this.token;\n };\n\n /**\n * Preview Next Token\n */\n peek() {\n return this.tokens[this.tokens.length - 1] || 0;\n };\n\n /**\n * Parse Text Tokens\n */\n parseText() {\n let body = this.token.text;\n\n while (this.peek().type === 'text') {\n body += '\\n' + this.next().text;\n }\n\n return this.inline.output(body);\n };\n\n /**\n * Parse Current Token\n */\n tok() {\n let body = '';\n switch (this.token.type) {\n case 'space': {\n return '';\n }\n case 'hr': {\n return this.renderer.hr();\n }\n case 'heading': {\n return this.renderer.heading(\n this.inline.output(this.token.text),\n this.token.depth,\n unescape(this.inlineText.output(this.token.text)),\n this.slugger);\n }\n case 'code': {\n return this.renderer.code(this.token.text,\n this.token.lang,\n this.token.escaped);\n }\n case 'table': {\n let header = '',\n i,\n row,\n cell,\n j;\n\n // header\n cell = '';\n for (i = 0; i < this.token.header.length; i++) {\n cell += this.renderer.tablecell(\n this.inline.output(this.token.header[i]),\n { header: true, align: this.token.align[i] }\n );\n }\n header += this.renderer.tablerow(cell);\n\n for (i = 0; i < this.token.cells.length; i++) {\n row = this.token.cells[i];\n\n cell = '';\n for (j = 0; j < row.length; j++) {\n cell += this.renderer.tablecell(\n this.inline.output(row[j]),\n { header: false, align: this.token.align[j] }\n );\n }\n\n body += this.renderer.tablerow(cell);\n }\n return this.renderer.table(header, body);\n }\n case 'blockquote_start': {\n body = '';\n\n while (this.next().type !== 'blockquote_end') {\n body += this.tok();\n }\n\n return this.renderer.blockquote(body);\n }\n case 'list_start': {\n body = '';\n const ordered = this.token.ordered,\n start = this.token.start;\n\n while (this.next().type !== 'list_end') {\n body += this.tok();\n }\n\n return this.renderer.list(body, ordered, start);\n }\n case 'list_item_start': {\n body = '';\n const loose = this.token.loose;\n const checked = this.token.checked;\n const task = this.token.task;\n\n if (this.token.task) {\n if (loose) {\n if (this.peek().type === 'text') {\n const nextToken = this.peek();\n nextToken.text = this.renderer.checkbox(checked) + ' ' + nextToken.text;\n } else {\n this.tokens.push({\n type: 'text',\n text: this.renderer.checkbox(checked)\n });\n }\n } else {\n body += this.renderer.checkbox(checked);\n }\n }\n\n while (this.next().type !== 'list_item_end') {\n body += !loose && this.token.type === 'text'\n ? this.parseText()\n : this.tok();\n }\n return this.renderer.listitem(body, task, checked);\n }\n case 'html': {\n // TODO parse inline content if parameter markdown=1\n return this.renderer.html(this.token.text);\n }\n case 'paragraph': {\n return this.renderer.paragraph(this.inline.output(this.token.text));\n }\n case 'text': {\n return this.renderer.paragraph(this.parseText());\n }\n default: {\n const errMsg = 'Token with \"' + this.token.type + '\" type was not found.';\n if (this.options.silent) {\n console.log(errMsg);\n } else {\n throw new Error(errMsg);\n }\n }\n }\n };\n};\n","/**\n * Slugger generates header id\n */\nmodule.exports = class Slugger {\n constructor() {\n this.seen = {};\n }\n\n /**\n * Convert string to unique id\n */\n slug(value) {\n let slug = value\n .toLowerCase()\n .trim()\n .replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g, '')\n .replace(/\\s/g, '-');\n\n if (this.seen.hasOwnProperty(slug)) {\n const originalSlug = slug;\n do {\n this.seen[originalSlug]++;\n slug = originalSlug + '-' + this.seen[originalSlug];\n } while (this.seen.hasOwnProperty(slug));\n }\n this.seen[slug] = 0;\n\n return slug;\n };\n};\n","const { defaults } = require('./defaults.js');\nconst {\n cleanUrl,\n escape\n} = require('./helpers.js');\n\n/**\n * Renderer\n */\nmodule.exports = class Renderer {\n constructor(options) {\n this.options = options || defaults;\n }\n\n code(code, infostring, escaped) {\n const lang = (infostring || '').match(/\\S*/)[0];\n if (this.options.highlight) {\n const out = this.options.highlight(code, lang);\n if (out != null && out !== code) {\n escaped = true;\n code = out;\n }\n }\n\n if (!lang) {\n return '
    '\n        + (escaped ? code : escape(code, true))\n        + '
    ';\n }\n\n return '
    '\n      + (escaped ? code : escape(code, true))\n      + '
    \\n';\n };\n\n blockquote(quote) {\n return '
    \\n' + quote + '
    \\n';\n };\n\n html(html) {\n return html;\n };\n\n heading(text, level, raw, slugger) {\n if (this.options.headerIds) {\n return ''\n + text\n + '\\n';\n }\n // ignore IDs\n return '' + text + '\\n';\n };\n\n hr() {\n return this.options.xhtml ? '
    \\n' : '
    \\n';\n };\n\n list(body, ordered, start) {\n const type = ordered ? 'ol' : 'ul',\n startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n return '<' + type + startatt + '>\\n' + body + '\\n';\n };\n\n listitem(text) {\n return '
  • ' + text + '
  • \\n';\n };\n\n checkbox(checked) {\n return ' ';\n };\n\n paragraph(text) {\n return '

    ' + text + '

    \\n';\n };\n\n table(header, body) {\n if (body) body = '' + body + '';\n\n return '\\n'\n + '\\n'\n + header\n + '\\n'\n + body\n + '
    \\n';\n };\n\n tablerow(content) {\n return '\\n' + content + '\\n';\n };\n\n tablecell(content, flags) {\n const type = flags.header ? 'th' : 'td';\n const tag = flags.align\n ? '<' + type + ' align=\"' + flags.align + '\">'\n : '<' + type + '>';\n return tag + content + '\\n';\n };\n\n // span level renderer\n strong(text) {\n return '' + text + '';\n };\n\n em(text) {\n return '' + text + '';\n };\n\n codespan(text) {\n return '' + text + '';\n };\n\n br() {\n return this.options.xhtml ? '
    ' : '
    ';\n };\n\n del(text) {\n return '' + text + '';\n };\n\n link(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n let out = '
    ';\n return out;\n };\n\n image(href, title, text) {\n href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);\n if (href === null) {\n return text;\n }\n\n let out = '\"'' : '>';\n return out;\n };\n\n text(text) {\n return text;\n };\n};\n","const { defaults } = require('./defaults.js');\nconst { block } = require('./rules.js');\nconst {\n rtrim,\n splitCells,\n escape\n} = require('./helpers.js');\n\n/**\n * Block Lexer\n */\nmodule.exports = class Lexer {\n constructor(options) {\n this.tokens = [];\n this.tokens.links = Object.create(null);\n this.options = options || defaults;\n this.rules = block.normal;\n\n if (this.options.pedantic) {\n this.rules = block.pedantic;\n } else if (this.options.gfm) {\n this.rules = block.gfm;\n }\n }\n\n /**\n * Expose Block Rules\n */\n static get rules() {\n return block;\n }\n\n /**\n * Static Lex Method\n */\n static lex(src, options) {\n const lexer = new Lexer(options);\n return lexer.lex(src);\n };\n\n /**\n * Preprocessing\n */\n lex(src) {\n src = src\n .replace(/\\r\\n|\\r/g, '\\n')\n .replace(/\\t/g, ' ');\n\n return this.token(src, true);\n };\n\n /**\n * Lexing\n */\n token(src, top) {\n src = src.replace(/^ +$/gm, '');\n let next,\n loose,\n cap,\n bull,\n b,\n item,\n listStart,\n listItems,\n t,\n space,\n i,\n tag,\n l,\n isordered,\n istask,\n ischecked;\n\n while (src) {\n // newline\n if (cap = this.rules.newline.exec(src)) {\n src = src.substring(cap[0].length);\n if (cap[0].length > 1) {\n this.tokens.push({\n type: 'space'\n });\n }\n }\n\n // code\n if (cap = this.rules.code.exec(src)) {\n const lastToken = this.tokens[this.tokens.length - 1];\n src = src.substring(cap[0].length);\n // An indented code block cannot interrupt a paragraph.\n if (lastToken && lastToken.type === 'paragraph') {\n lastToken.text += '\\n' + cap[0].trimRight();\n } else {\n cap = cap[0].replace(/^ {4}/gm, '');\n this.tokens.push({\n type: 'code',\n codeBlockStyle: 'indented',\n text: !this.options.pedantic\n ? rtrim(cap, '\\n')\n : cap\n });\n }\n continue;\n }\n\n // fences\n if (cap = this.rules.fences.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'code',\n lang: cap[2] ? cap[2].trim() : cap[2],\n text: cap[3] || ''\n });\n continue;\n }\n\n // heading\n if (cap = this.rules.heading.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'heading',\n depth: cap[1].length,\n text: cap[2]\n });\n continue;\n }\n\n // table no leading pipe (gfm)\n if (cap = this.rules.nptable.exec(src)) {\n item = {\n type: 'table',\n header: splitCells(cap[1].replace(/^ *| *\\| *$/g, '')),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n cells: cap[3] ? cap[3].replace(/\\n$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n src = src.substring(cap[0].length);\n\n for (i = 0; i < item.align.length; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n for (i = 0; i < item.cells.length; i++) {\n item.cells[i] = splitCells(item.cells[i], item.header.length);\n }\n\n this.tokens.push(item);\n\n continue;\n }\n }\n\n // hr\n if (cap = this.rules.hr.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'hr'\n });\n continue;\n }\n\n // blockquote\n if (cap = this.rules.blockquote.exec(src)) {\n src = src.substring(cap[0].length);\n\n this.tokens.push({\n type: 'blockquote_start'\n });\n\n cap = cap[0].replace(/^ *> ?/gm, '');\n\n // Pass `top` to keep the current\n // \"toplevel\" state. This is exactly\n // how markdown.pl works.\n this.token(cap, top);\n\n this.tokens.push({\n type: 'blockquote_end'\n });\n\n continue;\n }\n\n // list\n if (cap = this.rules.list.exec(src)) {\n src = src.substring(cap[0].length);\n bull = cap[2];\n isordered = bull.length > 1;\n\n listStart = {\n type: 'list_start',\n ordered: isordered,\n start: isordered ? +bull : '',\n loose: false\n };\n\n this.tokens.push(listStart);\n\n // Get each top-level item.\n cap = cap[0].match(this.rules.item);\n\n listItems = [];\n next = false;\n l = cap.length;\n i = 0;\n\n for (; i < l; i++) {\n item = cap[i];\n\n // Remove the list item's bullet\n // so it is seen as the next token.\n space = item.length;\n item = item.replace(/^ *([*+-]|\\d+\\.) */, '');\n\n // Outdent whatever the\n // list item contains. Hacky.\n if (~item.indexOf('\\n ')) {\n space -= item.length;\n item = !this.options.pedantic\n ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')\n : item.replace(/^ {1,4}/gm, '');\n }\n\n // Determine whether the next list item belongs here.\n // Backpedal if it does not belong in this list.\n if (i !== l - 1) {\n b = block.bullet.exec(cap[i + 1])[0];\n if (bull.length > 1 ? b.length === 1\n : (b.length > 1 || (this.options.smartLists && b !== bull))) {\n src = cap.slice(i + 1).join('\\n') + src;\n i = l - 1;\n }\n }\n\n // Determine whether item is loose or not.\n // Use: /(^|\\n)(?! )[^\\n]+\\n\\n(?!\\s*$)/\n // for discount behavior.\n loose = next || /\\n\\n(?!\\s*$)/.test(item);\n if (i !== l - 1) {\n next = item.charAt(item.length - 1) === '\\n';\n if (!loose) loose = next;\n }\n\n if (loose) {\n listStart.loose = true;\n }\n\n // Check for task list items\n istask = /^\\[[ xX]\\] /.test(item);\n ischecked = undefined;\n if (istask) {\n ischecked = item[1] !== ' ';\n item = item.replace(/^\\[[ xX]\\] +/, '');\n }\n\n t = {\n type: 'list_item_start',\n task: istask,\n checked: ischecked,\n loose: loose\n };\n\n listItems.push(t);\n this.tokens.push(t);\n\n // Recurse.\n this.token(item, false);\n\n this.tokens.push({\n type: 'list_item_end'\n });\n }\n\n if (listStart.loose) {\n l = listItems.length;\n i = 0;\n for (; i < l; i++) {\n listItems[i].loose = true;\n }\n }\n\n this.tokens.push({\n type: 'list_end'\n });\n\n continue;\n }\n\n // html\n if (cap = this.rules.html.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: this.options.sanitize\n ? 'paragraph'\n : 'html',\n pre: !this.options.sanitizer\n && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),\n text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]\n });\n continue;\n }\n\n // def\n if (top && (cap = this.rules.def.exec(src))) {\n src = src.substring(cap[0].length);\n if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);\n tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n if (!this.tokens.links[tag]) {\n this.tokens.links[tag] = {\n href: cap[2],\n title: cap[3]\n };\n }\n continue;\n }\n\n // table (gfm)\n if (cap = this.rules.table.exec(src)) {\n item = {\n type: 'table',\n header: splitCells(cap[1].replace(/^ *| *\\| *$/g, '')),\n align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n cells: cap[3] ? cap[3].replace(/\\n$/, '').split('\\n') : []\n };\n\n if (item.header.length === item.align.length) {\n src = src.substring(cap[0].length);\n\n for (i = 0; i < item.align.length; i++) {\n if (/^ *-+: *$/.test(item.align[i])) {\n item.align[i] = 'right';\n } else if (/^ *:-+: *$/.test(item.align[i])) {\n item.align[i] = 'center';\n } else if (/^ *:-+ *$/.test(item.align[i])) {\n item.align[i] = 'left';\n } else {\n item.align[i] = null;\n }\n }\n\n for (i = 0; i < item.cells.length; i++) {\n item.cells[i] = splitCells(\n item.cells[i].replace(/^ *\\| *| *\\| *$/g, ''),\n item.header.length);\n }\n\n this.tokens.push(item);\n\n continue;\n }\n }\n\n // lheading\n if (cap = this.rules.lheading.exec(src)) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'heading',\n depth: cap[2].charAt(0) === '=' ? 1 : 2,\n text: cap[1]\n });\n continue;\n }\n\n // top-level paragraph\n if (top && (cap = this.rules.paragraph.exec(src))) {\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'paragraph',\n text: cap[1].charAt(cap[1].length - 1) === '\\n'\n ? cap[1].slice(0, -1)\n : cap[1]\n });\n continue;\n }\n\n // text\n if (cap = this.rules.text.exec(src)) {\n // Top-level should never reach here.\n src = src.substring(cap[0].length);\n this.tokens.push({\n type: 'text',\n text: cap[0]\n });\n continue;\n }\n\n if (src) {\n throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));\n }\n }\n\n return this.tokens;\n };\n};\n","const {\n noopTest,\n edit,\n merge\n} = require('./helpers.js');\n\n/**\n * Block-Level Grammar\n */\nconst block = {\n newline: /^\\n+/,\n code: /^( {4}[^\\n]+\\n*)+/,\n fences: /^ {0,3}(`{3,}|~{3,})([^`~\\n]*)\\n(?:|([\\s\\S]*?)\\n)(?: {0,3}\\1[~`]* *(?:\\n+|$)|$)/,\n hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)/,\n heading: /^ {0,3}(#{1,6}) +([^\\n]*?)(?: +#+)? *(?:\\n+|$)/,\n blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n list: /^( {0,3})(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,\n html: '^ {0,3}(?:' // optional indentation\n + '<(script|pre|style)[\\\\s>][\\\\s\\\\S]*?(?:[^\\\\n]*\\\\n+|$)' // (1)\n + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n + '|<\\\\?[\\\\s\\\\S]*?\\\\?>\\\\n*' // (3)\n + '|\\\\n*' // (4)\n + '|\\\\n*' // (5)\n + '|)[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (6)\n + '|<(?!script|pre|style)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (7) open tag\n + '|(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:\\\\n{2,}|$)' // (7) closing tag\n + ')',\n def: /^ {0,3}\\[(label)\\]: *\\n? *]+)>?(?:(?: +\\n? *| *\\n *)(title))? *(?:\\n+|$)/,\n nptable: noopTest,\n table: noopTest,\n lheading: /^([^\\n]+)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n // regex template, placeholders will be replaced according to different paragraph\n // interruption rules of commonmark and the original markdown spec:\n _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\\n]+)*)/,\n text: /^[^\\n]+/\n};\n\nblock._label = /(?!\\s*\\])(?:\\\\[\\[\\]]|[^\\[\\]])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n .replace('label', block._label)\n .replace('title', block._title)\n .getRegex();\n\nblock.bullet = /(?:[*+-]|\\d{1,9}\\.)/;\nblock.item = /^( *)(bull) ?[^\\n]*(?:\\n(?!\\1bull ?)[^\\n]*)*/;\nblock.item = edit(block.item, 'gm')\n .replace(/bull/g, block.bullet)\n .getRegex();\n\nblock.list = edit(block.list)\n .replace(/bull/g, block.bullet)\n .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n .replace('def', '\\\\n+(?=' + block.def.source + ')')\n .getRegex();\n\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n + '|track|ul';\nblock._comment = //;\nblock.html = edit(block.html, 'i')\n .replace('comment', block._comment)\n .replace('tag', block._tag)\n .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n .getRegex();\n\nblock.paragraph = edit(block._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' {0,3}#{1,6} +')\n .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n .replace('blockquote', ' {0,3}>')\n .replace('fences', ' {0,3}(?:`{3,}|~{3,})[^`\\\\n]*\\\\n')\n .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n .replace('html', ')|<(?:script|pre|style|!--)')\n .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n .getRegex();\n\nblock.blockquote = edit(block.blockquote)\n .replace('paragraph', block.paragraph)\n .getRegex();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = merge({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = merge({}, block.normal, {\n nptable: /^ *([^|\\n ].*\\|.*)\\n *([-:]+ *\\|[-| :]*)(?:\\n((?:.*[^>\\n ].*(?:\\n|$))*)\\n*|$)/,\n table: /^ *\\|(.+)\\n *\\|?( *[-:]+[-| :]*)(?:\\n((?: *[^>\\n ].*(?:\\n|$))*)\\n*|$)/\n});\n\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\n\nblock.pedantic = merge({}, block.normal, {\n html: edit(\n '^ *(?:comment *(?:\\\\n|\\\\s*$)'\n + '|<(tag)[\\\\s\\\\S]+? *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n + '|\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n .replace('comment', block._comment)\n .replace(/tag/g, '(?!(?:'\n + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n .getRegex(),\n def: /^ *\\[([^\\]]+)\\]: *]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n heading: /^ *(#{1,6}) *([^\\n]+?) *(?:#+ *)?(?:\\n+|$)/,\n fences: noopTest, // fences not supported\n paragraph: edit(block.normal._paragraph)\n .replace('hr', block.hr)\n .replace('heading', ' *#{1,6} *[^\\n]')\n .replace('lheading', block.lheading)\n .replace('blockquote', ' {0,3}>')\n .replace('|fences', '')\n .replace('|list', '')\n .replace('|html', '')\n .getRegex()\n});\n\n/**\n * Inline-Level Grammar\n */\nconst inline = {\n escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n url: noopTest,\n tag: '^comment'\n + '|^' // self-closing tag\n + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. \n + '|^' // declaration, e.g. \n + '|^', // CDATA section\n link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n reflink: /^!?\\[(label)\\]\\[(?!\\s*\\])((?:\\\\[\\[\\]]?|[^\\[\\]\\\\])+)\\]/,\n nolink: /^!?\\[(?!\\s*\\])((?:\\[[^\\[\\]]*\\]|\\\\[\\[\\]]|[^\\[\\]])*)\\](?:\\[\\])?/,\n strong: /^__([^\\s_])__(?!_)|^\\*\\*([^\\s*])\\*\\*(?!\\*)|^__([^\\s][\\s\\S]*?[^\\s])__(?!_)|^\\*\\*([^\\s][\\s\\S]*?[^\\s])\\*\\*(?!\\*)/,\n em: /^_([^\\s_])_(?!_)|^\\*([^\\s*<\\[])\\*(?!\\*)|^_([^\\s<][\\s\\S]*?[^\\s_])_(?!_|[^\\spunctuation])|^_([^\\s_<][\\s\\S]*?[^\\s])_(?!_|[^\\spunctuation])|^\\*([^\\s<\"][\\s\\S]*?[^\\s\\*])\\*(?!\\*|[^\\spunctuation])|^\\*([^\\s*\"<\\[][\\s\\S]*?[^\\s])\\*(?!\\*)/,\n code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n del: noopTest,\n text: /^(`+|[^`])(?:[\\s\\S]*?(?:(?=[\\\\?@\\\\[^_{|}~';\ninline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();\n\ninline._escapes = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g;\n\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n .replace('scheme', inline._scheme)\n .replace('email', inline._email)\n .getRegex();\n\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\n\ninline.tag = edit(inline.tag)\n .replace('comment', block._comment)\n .replace('attribute', inline._attribute)\n .getRegex();\n\ninline._label = /(?:\\[[^\\[\\]]*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\[<>]?|[^\\s<>\\\\])*>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\n\ninline.link = edit(inline.link)\n .replace('label', inline._label)\n .replace('href', inline._href)\n .replace('title', inline._title)\n .getRegex();\n\ninline.reflink = edit(inline.reflink)\n .replace('label', inline._label)\n .getRegex();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = merge({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = merge({}, inline.normal, {\n strong: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n em: /^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/,\n link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n .replace('label', inline._label)\n .getRegex(),\n reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n .replace('label', inline._label)\n .getRegex()\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = merge({}, inline.normal, {\n escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n _backpedal: /(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,\n del: /^~+(?=\\S)([\\s\\S]*?\\S)~+/,\n text: /^(`+|[^`])(?:[\\s\\S]*?(?:(?=[\\\\/i.test(cap[0])) {\n this.inLink = false;\n }\n if (!this.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.inRawBlock = true;\n } else if (this.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n this.inRawBlock = false;\n }\n\n src = src.substring(cap[0].length);\n out += this.options.sanitize\n ? this.options.sanitizer\n ? this.options.sanitizer(cap[0])\n : escape(cap[0])\n : cap[0];\n continue;\n }\n\n // link\n if (cap = this.rules.link.exec(src)) {\n const lastParenIndex = findClosingBracket(cap[2], '()');\n if (lastParenIndex > -1) {\n const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n const linkLen = start + cap[1].length + lastParenIndex;\n cap[2] = cap[2].substring(0, lastParenIndex);\n cap[0] = cap[0].substring(0, linkLen).trim();\n cap[3] = '';\n }\n src = src.substring(cap[0].length);\n this.inLink = true;\n href = cap[2];\n if (this.options.pedantic) {\n link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n\n if (link) {\n href = link[1];\n title = link[3];\n } else {\n title = '';\n }\n } else {\n title = cap[3] ? cap[3].slice(1, -1) : '';\n }\n href = href.trim().replace(/^<([\\s\\S]*)>$/, '$1');\n out += this.outputLink(cap, {\n href: InlineLexer.escapes(href),\n title: InlineLexer.escapes(title)\n });\n this.inLink = false;\n continue;\n }\n\n // reflink, nolink\n if ((cap = this.rules.reflink.exec(src))\n || (cap = this.rules.nolink.exec(src))) {\n src = src.substring(cap[0].length);\n link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n link = this.links[link.toLowerCase()];\n if (!link || !link.href) {\n out += cap[0].charAt(0);\n src = cap[0].substring(1) + src;\n continue;\n }\n this.inLink = true;\n out += this.outputLink(cap, link);\n this.inLink = false;\n continue;\n }\n\n // strong\n if (cap = this.rules.strong.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));\n continue;\n }\n\n // em\n if (cap = this.rules.em.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));\n continue;\n }\n\n // code\n if (cap = this.rules.code.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.codespan(escape(cap[2].trim(), true));\n continue;\n }\n\n // br\n if (cap = this.rules.br.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.br();\n continue;\n }\n\n // del (gfm)\n if (cap = this.rules.del.exec(src)) {\n src = src.substring(cap[0].length);\n out += this.renderer.del(this.output(cap[1]));\n continue;\n }\n\n // autolink\n if (cap = this.rules.autolink.exec(src)) {\n src = src.substring(cap[0].length);\n if (cap[2] === '@') {\n text = escape(this.mangle(cap[1]));\n href = 'mailto:' + text;\n } else {\n text = escape(cap[1]);\n href = text;\n }\n out += this.renderer.link(href, null, text);\n continue;\n }\n\n // url (gfm)\n if (!this.inLink && (cap = this.rules.url.exec(src))) {\n if (cap[2] === '@') {\n text = escape(cap[0]);\n href = 'mailto:' + text;\n } else {\n // do extended autolink path validation\n do {\n prevCapZero = cap[0];\n cap[0] = this.rules._backpedal.exec(cap[0])[0];\n } while (prevCapZero !== cap[0]);\n text = escape(cap[0]);\n if (cap[1] === 'www.') {\n href = 'http://' + text;\n } else {\n href = text;\n }\n }\n src = src.substring(cap[0].length);\n out += this.renderer.link(href, null, text);\n continue;\n }\n\n // text\n if (cap = this.rules.text.exec(src)) {\n src = src.substring(cap[0].length);\n if (this.inRawBlock) {\n out += this.renderer.text(this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]);\n } else {\n out += this.renderer.text(escape(this.smartypants(cap[0])));\n }\n continue;\n }\n\n if (src) {\n throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));\n }\n }\n\n return out;\n }\n\n static escapes(text) {\n return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;\n }\n\n /**\n * Compile Link\n */\n outputLink(cap, link) {\n const href = link.href,\n title = link.title ? escape(link.title) : null;\n\n return cap[0].charAt(0) !== '!'\n ? this.renderer.link(href, title, this.output(cap[1]))\n : this.renderer.image(href, title, escape(cap[1]));\n }\n\n /**\n * Smartypants Transformations\n */\n smartypants(text) {\n if (!this.options.smartypants) return text;\n return text\n // em-dashes\n .replace(/---/g, '\\u2014')\n // en-dashes\n .replace(/--/g, '\\u2013')\n // opening singles\n .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n // closing singles & apostrophes\n .replace(/'/g, '\\u2019')\n // opening doubles\n .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n // closing doubles\n .replace(/\"/g, '\\u201d')\n // ellipses\n .replace(/\\.{3}/g, '\\u2026');\n }\n\n /**\n * Mangle Links\n */\n mangle(text) {\n if (!this.options.mangle) return text;\n const l = text.length;\n let out = '',\n i = 0,\n ch;\n\n for (; i < l; i++) {\n ch = text.charCodeAt(i);\n if (Math.random() > 0.5) {\n ch = 'x' + ch.toString(16);\n }\n out += '&#' + ch + ';';\n }\n\n return out;\n }\n};\n","/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = /[&<>\"']/g;\nconst escapeTestNoEncode = /[<>\"']|&(?!#?\\w+;)/;\nconst escapeReplaceNoEncode = /[<>\"']|&(?!#?\\w+;)/g;\nconst escapeReplacements = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n if (encode) {\n if (escapeTest.test(html)) {\n return html.replace(escapeReplace, getEscapeReplacement);\n }\n } else {\n if (escapeTestNoEncode.test(html)) {\n return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n }\n }\n\n return html;\n}\n\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\n\nfunction unescape(html) {\n // explicitly match decimal, hex, and named HTML entities\n return html.replace(unescapeTest, (_, n) => {\n n = n.toLowerCase();\n if (n === 'colon') return ':';\n if (n.charAt(0) === '#') {\n return n.charAt(1) === 'x'\n ? String.fromCharCode(parseInt(n.substring(2), 16))\n : String.fromCharCode(+n.substring(1));\n }\n return '';\n });\n}\n\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n regex = regex.source || regex;\n opt = opt || '';\n const obj = {\n replace: (name, val) => {\n val = val.source || val;\n val = val.replace(caret, '$1');\n regex = regex.replace(name, val);\n return obj;\n },\n getRegex: () => {\n return new RegExp(regex, opt);\n }\n };\n return obj;\n}\n\nconst nonWordAndColonTest = /[^\\w:]/g;\nconst originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;\nfunction cleanUrl(sanitize, base, href) {\n if (sanitize) {\n let prot;\n try {\n prot = decodeURIComponent(unescape(href))\n .replace(nonWordAndColonTest, '')\n .toLowerCase();\n } catch (e) {\n return null;\n }\n if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {\n return null;\n }\n }\n if (base && !originIndependentUrl.test(href)) {\n href = resolveUrl(base, href);\n }\n try {\n href = encodeURI(href).replace(/%25/g, '%');\n } catch (e) {\n return null;\n }\n return href;\n}\n\nconst baseUrls = {};\nconst justDomain = /^[^:]+:\\/*[^/]*$/;\nconst protocol = /^([^:]+:)[\\s\\S]*$/;\nconst domain = /^([^:]+:\\/*[^/]*)[\\s\\S]*$/;\n\nfunction resolveUrl(base, href) {\n if (!baseUrls[' ' + base]) {\n // we can ignore everything in base after the last slash of its path component,\n // but we might need to add _that_\n // https://tools.ietf.org/html/rfc3986#section-3\n if (justDomain.test(base)) {\n baseUrls[' ' + base] = base + '/';\n } else {\n baseUrls[' ' + base] = rtrim(base, '/', true);\n }\n }\n base = baseUrls[' ' + base];\n const relativeBase = base.indexOf(':') === -1;\n\n if (href.substring(0, 2) === '//') {\n if (relativeBase) {\n return href;\n }\n return base.replace(protocol, '$1') + href;\n } else if (href.charAt(0) === '/') {\n if (relativeBase) {\n return href;\n }\n return base.replace(domain, '$1') + href;\n } else {\n return base + href;\n }\n}\n\nconst noopTest = { exec: function noopTest() {} };\n\nfunction merge(obj) {\n let i = 1,\n target,\n key;\n\n for (; i < arguments.length; i++) {\n target = arguments[i];\n for (key in target) {\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n obj[key] = target[key];\n }\n }\n }\n\n return obj;\n}\n\nfunction splitCells(tableRow, count) {\n // ensure that every cell-delimiting pipe has a space\n // before it to distinguish it from an escaped pipe\n const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n let escaped = false,\n curr = offset;\n while (--curr >= 0 && str[curr] === '\\\\') escaped = !escaped;\n if (escaped) {\n // odd number of slashes means | is escaped\n // so we leave it alone\n return '|';\n } else {\n // add space before unescaped |\n return ' |';\n }\n }),\n cells = row.split(/ \\|/);\n let i = 0;\n\n if (cells.length > count) {\n cells.splice(count);\n } else {\n while (cells.length < count) cells.push('');\n }\n\n for (; i < cells.length; i++) {\n // leading or trailing whitespace is ignored per the gfm spec\n cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n }\n return cells;\n}\n\n// Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n// /c*$/ is vulnerable to REDOS.\n// invert: Remove suffix of non-c chars instead. Default falsey.\nfunction rtrim(str, c, invert) {\n const l = str.length;\n if (l === 0) {\n return '';\n }\n\n // Length of suffix matching the invert condition.\n let suffLen = 0;\n\n // Step left until we fail to match the invert condition.\n while (suffLen < l) {\n const currChar = str.charAt(l - suffLen - 1);\n if (currChar === c && !invert) {\n suffLen++;\n } else if (currChar !== c && invert) {\n suffLen++;\n } else {\n break;\n }\n }\n\n return str.substr(0, l - suffLen);\n}\n\nfunction findClosingBracket(str, b) {\n if (str.indexOf(b[1]) === -1) {\n return -1;\n }\n const l = str.length;\n let level = 0,\n i = 0;\n for (; i < l; i++) {\n if (str[i] === '\\\\') {\n i++;\n } else if (str[i] === b[0]) {\n level++;\n } else if (str[i] === b[1]) {\n level--;\n if (level < 0) {\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction checkSanitizeDeprecation(opt) {\n if (opt && opt.sanitize && !opt.silent) {\n console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');\n }\n}\n\nmodule.exports = {\n escape,\n unescape,\n edit,\n cleanUrl,\n resolveUrl,\n noopTest,\n merge,\n splitCells,\n rtrim,\n findClosingBracket,\n checkSanitizeDeprecation\n};\n","function getDefaults() {\n return {\n baseUrl: null,\n breaks: false,\n gfm: true,\n headerIds: true,\n headerPrefix: '',\n highlight: null,\n langPrefix: 'language-',\n mangle: true,\n pedantic: false,\n renderer: null,\n sanitize: false,\n sanitizer: null,\n silent: false,\n smartLists: false,\n smartypants: false,\n xhtml: false\n };\n}\n\nfunction changeDefaults(newDefaults) {\n module.exports.defaults = newDefaults;\n}\n\nmodule.exports = {\n defaults: getDefaults(),\n getDefaults,\n changeDefaults\n};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js b/priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js new file mode 100644 index 000000000..a29b6daab --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-5882"],{"13xp":function(s,e,t){"use strict";var r=t("2r4G");t.n(r).a},"2r4G":function(s,e,t){},"4bFr":function(s,e,t){"use strict";t.r(e);var r=t("ot3S"),i=t("tPM3"),a=t("o0o1"),n=t.n(a),o=t("yXPU"),u=t.n(o),l=t("XJYT"),c={name:"SecuritySettingsModal",props:{visible:{type:Boolean,default:!1},user:{type:Object,default:function(){return{}}}},data:function(){return{securitySettingsForm:{newEmail:"",newPassword:"",isEmailLoading:!1,isPasswordLoading:!1}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},getLabelWidth:function(){return this.isDesktop?"120px":"85px"},userCredentials:function(){return this.$store.state.userProfile.userCredentials}},mounted:function(){var s=u()(n.a.mark(function s(){return n.a.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return s.next=2,this.$store.dispatch("FetchUserCredentials",{nickname:this.user.nickname});case 2:this.securitySettingsForm.newEmail=this.userCredentials.email;case 3:case"end":return s.stop()}},s,this)}));return function(){return s.apply(this,arguments)}}(),methods:{updateEmail:function(){var s=u()(n.a.mark(function s(){var e;return n.a.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return e={email:this.securitySettingsForm.newEmail},this.securitySettingsForm.isEmailLoading=!0,s.next=4,this.$store.dispatch("UpdateUserCredentials",{nickname:this.user.nickname,credentials:e});case 4:this.securitySettingsForm.isEmailLoading=!1,Object(l.Message)({message:this.$t("userProfile.securitySettings.emailUpdated"),type:"success",duration:5e3});case 6:case"end":return s.stop()}},s,this)}));return function(){return s.apply(this,arguments)}}(),updatePassword:function(){var s=u()(n.a.mark(function s(){var e;return n.a.wrap(function(s){for(;;)switch(s.prev=s.next){case 0:return e={password:this.securitySettingsForm.newPassword},this.securitySettingsForm.isPasswordLoading=!0,s.next=4,this.$store.dispatch("UpdateUserCredentials",{nickname:this.user.nickname,credentials:e});case 4:this.securitySettingsForm.isPasswordLoading=!1,this.securitySettingsForm.newPassword="",Object(l.Message)({message:this.$t("userProfile.securitySettings.passwordUpdated"),type:"success",duration:5e3});case 7:case"end":return s.stop()}},s,this)}));return function(){return s.apply(this,arguments)}}(),close:function(){this.$emit("close",!0)}}},d=(t("13xp"),t("KHd+")),p=Object(d.a)(c,function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("el-dialog",{staticClass:"security-settings-modal",attrs:{"before-close":s.close,title:s.$t("userProfile.securitySettings.securitySettings"),visible:s.visible}},[t("el-form",{attrs:{model:s.securitySettingsForm,"label-width":s.getLabelWidth}},[t("el-form-item",{attrs:{label:s.$t("userProfile.securitySettings.email")}},[t("el-input",{attrs:{placeholder:s.$t("userProfile.securitySettings.inputNewEmail")},model:{value:s.securitySettingsForm.newEmail,callback:function(e){s.$set(s.securitySettingsForm,"newEmail",e)},expression:"securitySettingsForm.newEmail"}})],1),s._v(" "),t("el-form-item",[t("el-button",{staticClass:"security-settings-submit-button",attrs:{loading:s.securitySettingsForm.isEmailLoading,disabled:!s.securitySettingsForm.newEmail||s.securitySettingsForm.newEmail===s.userCredentials.email,type:"primary"},on:{click:function(e){return s.updateEmail()}}},[s._v("\n "+s._s(s.$t("userProfile.securitySettings.submit"))+"\n ")])],1),s._v(" "),t("el-form-item",{staticClass:"password-input",attrs:{label:s.$t("userProfile.securitySettings.password")}},[t("el-input",{attrs:{placeholder:s.$t("userProfile.securitySettings.inputNewPassword")},model:{value:s.securitySettingsForm.newPassword,callback:function(e){s.$set(s.securitySettingsForm,"newPassword",e)},expression:"securitySettingsForm.newPassword"}}),s._v(" "),t("small",{staticClass:"form-text"},[s._v("\n "+s._s(s.$t("userProfile.securitySettings.passwordLengthNotice",{minLength:8}))+"\n ")])],1),s._v(" "),t("el-alert",{staticClass:"password-alert",attrs:{closable:!1,type:"warning","show-icon":""}},[t("p",[s._v(s._s(s.$t("userProfile.securitySettings.passwordChangeWarning1")))]),s._v(" "),t("p",[s._v(s._s(s.$t("userProfile.securitySettings.passwordChangeWarning2")))])]),s._v(" "),t("el-form-item",[t("el-button",{staticClass:"security-settings-submit-button",attrs:{loading:s.securitySettingsForm.isPasswordLoading,disabled:s.securitySettingsForm.newPassword.length<8,type:"primary"},on:{click:function(e){return s.updatePassword()}}},[s._v("\n "+s._s(s.$t("userProfile.securitySettings.submit"))+"\n ")])],1)],1)],1)},[],!1,null,null,null);p.options.__file="SecuritySettingsModal.vue";var g=p.exports,v=t("rIUS"),_=t("WjBP"),m={name:"UsersShow",components:{ModerationDropdown:i.a,RebootButton:v.a,ResetPasswordDialog:_.a,Status:r.a,SecuritySettingsModal:g},data:function(){return{showPrivate:!1,resetPasswordDialogOpen:!1,securitySettingsModalVisible:!1}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},loading:function(){return this.$store.state.users.loading},statuses:function(){return this.$store.state.userProfile.statuses},statusesLoading:function(){return this.$store.state.userProfile.statusesLoading},user:function(){return this.$store.state.userProfile.user},userProfileLoading:function(){return this.$store.state.userProfile.userProfileLoading},userCredentials:function(){return this.$store.state.userProfile.userCredentials}},mounted:function(){this.$store.dispatch("NeedReboot"),this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("FetchUserProfile",{userId:this.$route.params.id,godmode:!1})},methods:{closeResetPasswordDialog:function(){this.resetPasswordDialogOpen=!1,this.$store.dispatch("RemovePasswordToken")},humanizeTag:function(s){return{force_nsfw:"Force NSFW",strip_media:"Strip Media",force_unlisted:"Force Unlisted",sandbox:"Sandbox",disable_remote_subscription:"Disable remote subscription",disable_any_subscription:"Disable any subscription"}[s]},onTogglePrivate:function(){this.$store.dispatch("FetchUserProfile",{userId:this.$route.params.id,godmode:this.showPrivate})},openResetPasswordDialog:function(){this.resetPasswordDialogOpen=!0},propertyExists:function(s,e){return s[e]}}},h=(t("9IXO"),Object(d.a)(m,function(){var s=this,e=s.$createElement,t=s._self._c||e;return s.userProfileLoading?s._e():t("main",[s.isDesktop||s.isTablet?t("header",{staticClass:"user-page-header"},[t("div",{staticClass:"avatar-name-container"},[s.propertyExists(s.user,"avatar")?t("el-avatar",{attrs:{src:s.user.avatar,size:"large"}}):s._e(),s._v(" "),s.propertyExists(s.user,"nickname")?t("h1",[s._v(s._s(s.user.nickname))]):t("h1",{staticClass:"invalid"},[s._v("("+s._s(s.$t("users.invalidNickname"))+")")]),s._v(" "),s.propertyExists(s.user,"url")?t("a",{attrs:{href:s.user.url,target:"_blank"}},[t("i",{staticClass:"el-icon-top-right",attrs:{title:s.$t("userProfile.openAccountInInstance")}})]):s._e()],1),s._v(" "),t("div",{staticClass:"left-header-container"},[s.propertyExists(s.user,"nickname")?t("moderation-dropdown",{attrs:{user:s.user,page:"userPage"},on:{"open-reset-token-dialog":s.openResetPasswordDialog}}):s._e(),s._v(" "),t("reboot-button")],1)]):s._e(),s._v(" "),s.isMobile?t("div",{staticClass:"user-page-header-container"},[t("header",{staticClass:"user-page-header"},[t("div",{staticClass:"avatar-name-container"},[s.propertyExists(s.user,"avatar")?t("el-avatar",{attrs:{src:s.user.avatar,size:"large"}}):s._e(),s._v(" "),s.propertyExists(s.user,"nickname")?t("h1",[s._v(s._s(s.user.nickname))]):t("h1",{staticClass:"invalid"},[s._v("("+s._s(s.$t("users.invalidNickname"))+")")])],1),s._v(" "),t("reboot-button")],1),s._v(" "),s.propertyExists(s.user,"nickname")?t("moderation-dropdown",{attrs:{user:s.user,page:"userPage"},on:{"open-reset-token-dialog":s.openResetPasswordDialog}}):s._e()],1):s._e(),s._v(" "),t("reset-password-dialog",{attrs:{"reset-password-dialog-open":s.resetPasswordDialogOpen},on:{"close-reset-token-dialog":s.closeResetPasswordDialog}}),s._v(" "),t("div",{staticClass:"user-profile-container"},[t("el-card",{staticClass:"user-profile-card"},[t("div",{staticClass:"el-table el-table--fit el-table--enable-row-hover el-table--enable-row-transition el-table--medium"},[s.propertyExists(s.user,"nickname")?s._e():t("el-tag",{staticClass:"invalid-user-tag",attrs:{type:"info"}},[s._v("\n "+s._s(s.$t("users.invalidAccount"))+"\n ")]),s._v(" "),t("table",{staticClass:"user-profile-table"},[t("tbody",[t("tr",{staticClass:"el-table__row"},[t("td",{staticClass:"name-col"},[s._v("ID")]),s._v(" "),t("td",{staticClass:"value-col"},[s._v("\n "+s._s(s.user.id)+"\n ")])]),s._v(" "),t("tr",{staticClass:"el-table__row"},[t("td",[s._v(s._s(s.$t("userProfile.tags")))]),s._v(" "),t("td",[0!==s.user.tags.length&&s.propertyExists(s.user,"tags")?s._l(s.user.tags,function(e){return t("el-tag",{key:e,staticClass:"user-profile-tag"},[s._v(s._s(s.humanizeTag(e)))])}):t("span",[s._v("—")])],2)]),s._v(" "),t("tr",{staticClass:"el-table__row"},[t("td",[s._v(s._s(s.$t("userProfile.roles")))]),s._v(" "),t("td",[s.user.roles.admin?t("el-tag",{staticClass:"user-profile-tag"},[s._v("\n "+s._s(s.$t("users.admin"))+"\n ")]):s._e(),s._v(" "),s.user.roles.moderator?t("el-tag",{staticClass:"user-profile-tag"},[s._v("\n "+s._s(s.$t("users.moderator"))+"\n ")]):s._e(),s._v(" "),s.propertyExists(s.user,"roles")&&(s.user.roles.moderator||s.user.roles.admin)?s._e():t("span",[s._v("—")])],1)]),s._v(" "),t("tr",{staticClass:"el-table__row"},[t("td",[s._v(s._s(s.$t("userProfile.accountType")))]),s._v(" "),t("td",[s.user.local?t("el-tag",{attrs:{type:"info"}},[s._v(s._s(s.$t("userProfile.local")))]):s._e(),s._v(" "),s.user.local?s._e():t("el-tag",{attrs:{type:"info"}},[s._v(s._s(s.$t("userProfile.external")))])],1)]),s._v(" "),t("tr",{staticClass:"el-table__row"},[t("td",[s._v(s._s(s.$t("userProfile.status")))]),s._v(" "),t("td",[s.user.deactivated?s._e():t("el-tag",{attrs:{type:"success"}},[s._v(s._s(s.$t("userProfile.active")))]),s._v(" "),s.user.deactivated?t("el-tag",{attrs:{type:"danger"}},[s._v(s._s(s.$t("userProfile.deactivated")))]):s._e()],1)])])])],1),s._v(" "),s.propertyExists(s.user,"nickname")?t("el-button",{staticClass:"security-setting-button",attrs:{icon:"el-icon-lock"},on:{click:function(e){s.securitySettingsModalVisible=!0}}},[s._v("\n "+s._s(s.$t("userProfile.securitySettings.securitySettings"))+"\n ")]):s._e(),s._v(" "),s.propertyExists(s.user,"nickname")?t("SecuritySettingsModal",{attrs:{user:s.user,visible:s.securitySettingsModalVisible},on:{close:function(e){s.securitySettingsModalVisible=!1}}}):s._e()],1),s._v(" "),t("div",{staticClass:"recent-statuses-container"},[t("h2",{staticClass:"recent-statuses"},[s._v(s._s(s.$t("userProfile.recentStatuses")))]),s._v(" "),t("el-checkbox",{staticClass:"show-private-statuses",on:{change:s.onTogglePrivate},model:{value:s.showPrivate,callback:function(e){s.showPrivate=e},expression:"showPrivate"}},[s._v("\n "+s._s(s.$t("statuses.showPrivateStatuses"))+"\n ")]),s._v(" "),s.statusesLoading?s._e():t("el-timeline",{staticClass:"statuses"},[s._l(s.statuses,function(e){return t("el-timeline-item",{key:e.id},[t("status",{attrs:{status:e,account:e.account,"show-checkbox":!1,"user-id":s.user.id,godmode:s.showPrivate}})],1)}),s._v(" "),0===s.statuses.length?t("p",{staticClass:"no-statuses"},[s._v(s._s(s.$t("userProfile.noStatuses")))]):s._e()],2)],1)],1)],1)},[],!1,null,null,null));h.options.__file="show.vue";e.default=h.exports},"53Av":function(s,e,t){"use strict";var r=t("lOBV");t.n(r).a},"9IXO":function(s,e,t){"use strict";var r=t("msq4");t.n(r).a},RnhZ:function(s,e,t){var r={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function i(s){var e=a(s);return t(e)}function a(s){if(!t.o(r,s)){var e=new Error("Cannot find module '"+s+"'");throw e.code="MODULE_NOT_FOUND",e}return r[s]}i.keys=function(){return Object.keys(r)},i.resolve=a,s.exports=i,i.id="RnhZ"},WjBP:function(s,e,t){"use strict";var r={name:"ResetPasswordDialog",props:{resetPasswordDialogOpen:{type:Boolean,default:!1}},computed:{dialogOpen:function(){return this.resetPasswordDialogOpen},loading:function(){return this.$store.state.users.loading},passwordResetLink:function(){return this.$store.state.users.passwordResetToken.link},passwordResetToken:function(){return this.$store.state.users.passwordResetToken.token}},methods:{closeResetPasswordDialog:function(){this.$emit("close-reset-token-dialog")}}},i=t("KHd+"),a=Object(i.a)(r,function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("el-dialog",{directives:[{name:"loading",rawName:"v-loading",value:s.loading,expression:"loading"}],attrs:{visible:s.dialogOpen,title:s.$t("users.passwordResetTokenCreated"),"custom-class":"password-reset-token-dialog"},on:{close:s.closeResetPasswordDialog}},[t("div",[t("p",{staticClass:"password-reset-token"},[s._v(s._s(s.$t("users.passwordResetTokenGenerated"))+" "+s._s(s.passwordResetToken))]),s._v(" "),t("p",[s._v(s._s(s.$t("users.linkToResetPassword"))+"\n "),t("a",{staticClass:"reset-password-link",attrs:{href:s.passwordResetLink,target:"_blank"}},[s._v(s._s(s.passwordResetLink))])])])])},[],!1,null,null,null);a.options.__file="ResetPasswordDialog.vue";e.a=a.exports},lOBV:function(s,e,t){},msq4:function(s,e,t){},tPM3:function(s,e,t){"use strict";var r={name:"ModerationDropdown",props:{user:{type:Object,default:function(){return{}}},page:{type:String,default:"users"},statusId:{type:String,default:""}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{getPasswordResetToken:function(s){this.$emit("open-reset-token-dialog"),this.$store.dispatch("GetPasswordResetToken",s)},handleConfirmationResend:function(s){this.$store.dispatch("ResendConfirmationEmail",[s])},handleDeletion:function(s){this.$store.dispatch("DeleteUsers",{users:[s],_userId:s.id})},handleEmailConfirmation:function(s){this.$store.dispatch("ConfirmUsersEmail",{users:[s],_userId:s.id,_statusId:this.statusId})},requirePasswordReset:function(s){this.$store.state.user.nodeInfo.metadata.mailerEnabled?this.$store.dispatch("RequirePasswordReset",[s]):this.$alert(this.$t("users.mailerMustBeEnabled"),"Error",{type:"error"})},showAdminAction:function(s){var e=s.local,t=s.id;return e&&this.showDeactivatedButton(t)},showDeactivatedButton:function(s){return this.$store.state.user.id!==s},toggleActivation:function(s){s.deactivated?this.$store.dispatch("ActivateUsers",{users:[s],_userId:s.id}):this.$store.dispatch("DeactivateUsers",{users:[s],_userId:s.id})},toggleTag:function(s,e){s.tags.includes(e)?this.$store.dispatch("RemoveTag",{users:[s],tag:e,_userId:s.id,_statusId:this.statusId}):this.$store.dispatch("AddTag",{users:[s],tag:e,_userId:s.id,_statusId:this.statusId})},toggleUserRight:function(s,e){s.roles[e]?this.$store.dispatch("DeleteRight",{users:[s],right:e,_userId:s.id,_statusId:this.statusId}):this.$store.dispatch("AddRight",{users:[s],right:e,_userId:s.id,_statusId:this.statusId})}}},i=(t("53Av"),t("KHd+")),a=Object(i.a)(r,function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("el-dropdown",{attrs:{"hide-on-click":!1,size:"small",trigger:"click",placement:"top-start"},nativeOn:{click:function(s){s.stopPropagation()}}},[t("div",["users"===s.page?t("el-button",{staticClass:"el-dropdown-link",attrs:{type:"text"}},[s._v("\n "+s._s(s.$t("users.moderation"))+"\n "),s.isDesktop?t("i",{staticClass:"el-icon-arrow-down el-icon--right"}):s._e()]):s._e(),s._v(" "),"userPage"===s.page||"statusPage"===s.page?t("el-button",{staticClass:"moderate-user-button"},[t("span",{staticClass:"moderate-user-button-container"},[t("span",[t("i",{staticClass:"el-icon-edit"}),s._v("\n "+s._s(s.$t("users.moderateUser"))+"\n ")]),s._v(" "),t("i",{staticClass:"el-icon-arrow-down el-icon--right"})])]):s._e()],1),s._v(" "),t("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[s.showAdminAction(s.user)?t("el-dropdown-item",{nativeOn:{click:function(e){return s.toggleUserRight(s.user,"admin")}}},[s._v("\n "+s._s(s.user.roles.admin?s.$t("users.revokeAdmin"):s.$t("users.grantAdmin"))+"\n ")]):s._e(),s._v(" "),s.showAdminAction(s.user)?t("el-dropdown-item",{nativeOn:{click:function(e){return s.toggleUserRight(s.user,"moderator")}}},[s._v("\n "+s._s(s.user.roles.moderator?s.$t("users.revokeModerator"):s.$t("users.grantModerator"))+"\n ")]):s._e(),s._v(" "),s.showDeactivatedButton(s.user.id)&&"statusPage"!==s.page?t("el-dropdown-item",{attrs:{divided:s.showAdminAction(s.user)},nativeOn:{click:function(e){return s.toggleActivation(s.user)}}},[s._v("\n "+s._s(s.user.deactivated?s.$t("users.activateAccount"):s.$t("users.deactivateAccount"))+"\n ")]):s._e(),s._v(" "),s.showDeactivatedButton(s.user.id)&&"statusPage"!==s.page?t("el-dropdown-item",{nativeOn:{click:function(e){return s.handleDeletion(s.user)}}},[s._v("\n "+s._s(s.$t("users.deleteAccount"))+"\n ")]):s._e(),s._v(" "),s.user.local&&s.user.confirmation_pending?t("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return s.handleEmailConfirmation(s.user)}}},[s._v("\n "+s._s(s.$t("users.confirmAccount"))+"\n ")]):s._e(),s._v(" "),s.user.local&&s.user.confirmation_pending?t("el-dropdown-item",{nativeOn:{click:function(e){return s.handleConfirmationResend(s.user)}}},[s._v("\n "+s._s(s.$t("users.resendConfirmation"))+"\n ")]):s._e(),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("force_nsfw")},attrs:{divided:s.showAdminAction(s.user)},nativeOn:{click:function(e){return s.toggleTag(s.user,"force_nsfw")}}},[s._v("\n "+s._s(s.$t("users.forceNsfw"))+"\n "),s.user.tags.includes("force_nsfw")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("strip_media")},nativeOn:{click:function(e){return s.toggleTag(s.user,"strip_media")}}},[s._v("\n "+s._s(s.$t("users.stripMedia"))+"\n "),s.user.tags.includes("strip_media")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("force_unlisted")},nativeOn:{click:function(e){return s.toggleTag(s.user,"force_unlisted")}}},[s._v("\n "+s._s(s.$t("users.forceUnlisted"))+"\n "),s.user.tags.includes("force_unlisted")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("sandbox")},nativeOn:{click:function(e){return s.toggleTag(s.user,"sandbox")}}},[s._v("\n "+s._s(s.$t("users.sandbox"))+"\n "),s.user.tags.includes("sandbox")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),s.user.local?t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("disable_remote_subscription")},nativeOn:{click:function(e){return s.toggleTag(s.user,"disable_remote_subscription")}}},[s._v("\n "+s._s(s.$t("users.disableRemoteSubscription"))+"\n "),s.user.tags.includes("disable_remote_subscription")?t("i",{staticClass:"el-icon-check"}):s._e()]):s._e(),s._v(" "),s.user.local?t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("disable_any_subscription")},nativeOn:{click:function(e){return s.toggleTag(s.user,"disable_any_subscription")}}},[s._v("\n "+s._s(s.$t("users.disableAnySubscription"))+"\n "),s.user.tags.includes("disable_any_subscription")?t("i",{staticClass:"el-icon-check"}):s._e()]):s._e(),s._v(" "),s.user.local?t("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return s.getPasswordResetToken(s.user.nickname)}}},[s._v("\n "+s._s(s.$t("users.getPasswordResetToken"))+"\n ")]):s._e(),s._v(" "),s.user.local?t("el-dropdown-item",{nativeOn:{click:function(e){return s.requirePasswordReset(s.user)}}},[s._v("\n "+s._s(s.$t("users.requirePasswordReset"))+"\n ")]):s._e()],1)],1)},[],!1,null,null,null);a.options.__file="ModerationDropdown.vue";e.a=a.exports}}]); +//# sourceMappingURL=chunk-5882.7cbc4c1b.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js.map b/priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js.map new file mode 100644 index 000000000..d1aa2037f --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/users/components/SecuritySettingsModal.vue?5147","webpack:///./src/views/users/show.vue?ef54","webpack:///./src/views/users/components/SecuritySettingsModal.vue?49db","webpack:///src/views/users/components/SecuritySettingsModal.vue","webpack:///./src/views/users/components/SecuritySettingsModal.vue","webpack:///./src/views/users/components/SecuritySettingsModal.vue?dd3f","webpack:///./src/views/users/show.vue?ac8b","webpack:///src/views/users/show.vue","webpack:///./src/views/users/show.vue","webpack:///./src/views/users/components/ModerationDropdown.vue?e3f0","webpack:///./src/views/users/show.vue?aed3","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/views/users/components/ResetPasswordDialog.vue?0b2b","webpack:///./src/views/users/components/ResetPasswordDialog.vue?31da","webpack:///src/views/users/components/ResetPasswordDialog.vue","webpack:///./src/views/users/components/ResetPasswordDialog.vue","webpack:///./src/views/users/components/ModerationDropdown.vue?ff75","webpack:///./src/views/users/components/ModerationDropdown.vue?676e","webpack:///src/views/users/components/ModerationDropdown.vue","webpack:///./src/views/users/components/ModerationDropdown.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_SecuritySettingsModal_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","components_SecuritySettingsModalvue_type_script_lang_js_","name","props","visible","type","Boolean","default","user","Object","data","securitySettingsForm","newEmail","newPassword","isEmailLoading","isPasswordLoading","computed","isDesktop","this","$store","state","app","device","getLabelWidth","userCredentials","userProfile","mounted","_mounted","asyncToGenerator_default","regenerator_default","a","mark","_callee","wrap","_context","prev","next","dispatch","nickname","email","stop","apply","arguments","methods","updateEmail","_updateEmail","_callee2","credentials","_context2","element_ui_common","message","$t","duration","updatePassword","_updatePassword","_callee3","_context3","password","close","$emit","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","before-close","title","model","label-width","label","placeholder","value","callback","$$v","$set","expression","_v","loading","disabled","on","click","$event","_s","minLength","closable","show-icon","length","options","__file","SecuritySettingsModal","users_showvue_type_script_lang_js_","components","ModerationDropdown","RebootButton","ResetPasswordDialog","Status","showPrivate","resetPasswordDialogOpen","securitySettingsModalVisible","isMobile","isTablet","users","statuses","statusesLoading","userProfileLoading","userId","$route","params","id","godmode","closeResetPasswordDialog","humanizeTag","tag","force_nsfw","strip_media","force_unlisted","sandbox","disable_remote_subscription","disable_any_subscription","onTogglePrivate","openResetPasswordDialog","propertyExists","account","property","show_component","_e","src","avatar","size","href","url","target","page","open-reset-token-dialog","reset-password-dialog-open","close-reset-token-dialog","tags","_l","key","roles","moderator","admin","local","deactivated","icon","change","status","show-checkbox","user-id","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ModerationDropdown_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_show_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","resolve","module","exports","components_ResetPasswordDialogvue_type_script_lang_js_","dialogOpen","passwordResetLink","passwordResetToken","link","token","directives","rawName","custom-class","components_ModerationDropdownvue_type_script_lang_js_","String","statusId","getPasswordResetToken","handleConfirmationResend","handleDeletion","_userId","handleEmailConfirmation","_statusId","requirePasswordReset","nodeInfo","metadata","mailerEnabled","$alert","showAdminAction","_ref","showDeactivatedButton","toggleActivation","toggleTag","includes","toggleUserRight","right","hide-on-click","trigger","placement","nativeOn","stopPropagation","slot","divided","confirmation_pending","class","active-tag"],"mappings":"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OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,QAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,WAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA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","file":"static/js/chunk-5882.7cbc4c1b.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.userProfileLoading)?_c('main',[(_vm.isDesktop || _vm.isTablet)?_c('header',{staticClass:\"user-page-header\"},[_c('div',{staticClass:\"avatar-name-container\"},[(_vm.propertyExists(_vm.user, 'avatar'))?_c('el-avatar',{attrs:{\"src\":_vm.user.avatar,\"size\":\"large\"}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'nickname'))?_c('h1',[_vm._v(_vm._s(_vm.user.nickname))]):_c('h1',{staticClass:\"invalid\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")]),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'url'))?_c('a',{attrs:{\"href\":_vm.user.url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"el-icon-top-right\",attrs:{\"title\":_vm.$t('userProfile.openAccountInInstance')}})]):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"left-header-container\"},[(_vm.propertyExists(_vm.user, 'nickname'))?_c('moderation-dropdown',{attrs:{\"user\":_vm.user,\"page\":'userPage'},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}}):_vm._e(),_vm._v(\" \"),_c('reboot-button')],1)]):_vm._e(),_vm._v(\" \"),(_vm.isMobile)?_c('div',{staticClass:\"user-page-header-container\"},[_c('header',{staticClass:\"user-page-header\"},[_c('div',{staticClass:\"avatar-name-container\"},[(_vm.propertyExists(_vm.user, 'avatar'))?_c('el-avatar',{attrs:{\"src\":_vm.user.avatar,\"size\":\"large\"}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'nickname'))?_c('h1',[_vm._v(_vm._s(_vm.user.nickname))]):_c('h1',{staticClass:\"invalid\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")])],1),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'nickname'))?_c('moderation-dropdown',{attrs:{\"user\":_vm.user,\"page\":'userPage'},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}}):_vm._e()],1):_vm._e(),_vm._v(\" \"),_c('reset-password-dialog',{attrs:{\"reset-password-dialog-open\":_vm.resetPasswordDialogOpen},on:{\"close-reset-token-dialog\":_vm.closeResetPasswordDialog}}),_vm._v(\" \"),_c('div',{staticClass:\"user-profile-container\"},[_c('el-card',{staticClass:\"user-profile-card\"},[_c('div',{staticClass:\"el-table el-table--fit el-table--enable-row-hover el-table--enable-row-transition el-table--medium\"},[(!_vm.propertyExists(_vm.user, 'nickname'))?_c('el-tag',{staticClass:\"invalid-user-tag\",attrs:{\"type\":\"info\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.invalidAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('table',{staticClass:\"user-profile-table\"},[_c('tbody',[_c('tr',{staticClass:\"el-table__row\"},[_c('td',{staticClass:\"name-col\"},[_vm._v(\"ID\")]),_vm._v(\" \"),_c('td',{staticClass:\"value-col\"},[_vm._v(\"\\n \"+_vm._s(_vm.user.id)+\"\\n \")])]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.tags')))]),_vm._v(\" \"),_c('td',[(_vm.user.tags.length === 0 || !_vm.propertyExists(_vm.user, 'tags'))?_c('span',[_vm._v(\"—\")]):_vm._l((_vm.user.tags),function(tag){return _c('el-tag',{key:tag,staticClass:\"user-profile-tag\"},[_vm._v(_vm._s(_vm.humanizeTag(tag)))])})],2)]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.roles')))]),_vm._v(\" \"),_c('td',[(_vm.user.roles.admin)?_c('el-tag',{staticClass:\"user-profile-tag\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.admin'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.roles.moderator)?_c('el-tag',{staticClass:\"user-profile-tag\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderator'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(!_vm.propertyExists(_vm.user, 'roles') || (!_vm.user.roles.moderator && !_vm.user.roles.admin))?_c('span',[_vm._v(\"—\")]):_vm._e()],1)]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.accountType')))]),_vm._v(\" \"),_c('td',[(_vm.user.local)?_c('el-tag',{attrs:{\"type\":\"info\"}},[_vm._v(_vm._s(_vm.$t('userProfile.local')))]):_vm._e(),_vm._v(\" \"),(!_vm.user.local)?_c('el-tag',{attrs:{\"type\":\"info\"}},[_vm._v(_vm._s(_vm.$t('userProfile.external')))]):_vm._e()],1)]),_vm._v(\" \"),_c('tr',{staticClass:\"el-table__row\"},[_c('td',[_vm._v(_vm._s(_vm.$t('userProfile.status')))]),_vm._v(\" \"),_c('td',[(!_vm.user.deactivated)?_c('el-tag',{attrs:{\"type\":\"success\"}},[_vm._v(_vm._s(_vm.$t('userProfile.active')))]):_vm._e(),_vm._v(\" \"),(_vm.user.deactivated)?_c('el-tag',{attrs:{\"type\":\"danger\"}},[_vm._v(_vm._s(_vm.$t('userProfile.deactivated')))]):_vm._e()],1)])])])],1),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'nickname'))?_c('el-button',{staticClass:\"security-setting-button\",attrs:{\"icon\":\"el-icon-lock\"},on:{\"click\":function($event){_vm.securitySettingsModalVisible = true}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.securitySettings'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'nickname'))?_c('SecuritySettingsModal',{attrs:{\"user\":_vm.user,\"visible\":_vm.securitySettingsModalVisible},on:{\"close\":function($event){_vm.securitySettingsModalVisible = false}}}):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"recent-statuses-container\"},[_c('h2',{staticClass:\"recent-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.recentStatuses')))]),_vm._v(\" \"),_c('el-checkbox',{staticClass:\"show-private-statuses\",on:{\"change\":_vm.onTogglePrivate},model:{value:(_vm.showPrivate),callback:function ($$v) {_vm.showPrivate=$$v},expression:\"showPrivate\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.showPrivateStatuses'))+\"\\n \")]),_vm._v(\" \"),(!_vm.statusesLoading)?_c('el-timeline',{staticClass:\"statuses\"},[_vm._l((_vm.statuses),function(status){return _c('el-timeline-item',{key:status.id},[_c('status',{attrs:{\"status\":status,\"account\":status.account,\"show-checkbox\":false,\"user-id\":_vm.user.id,\"godmode\":_vm.showPrivate}})],1)}),_vm._v(\" \"),(_vm.statuses.length === 0)?_c('p',{staticClass:\"no-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.noStatuses')))]):_vm._e()],2):_vm._e()],1)],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SecuritySettingsModal.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./SecuritySettingsModal.vue?vue&type=template&id=7fb08478&\"\nimport script from \"./SecuritySettingsModal.vue?vue&type=script&lang=js&\"\nexport * from \"./SecuritySettingsModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SecuritySettingsModal.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SecuritySettingsModal.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{staticClass:\"security-settings-modal\",attrs:{\"before-close\":_vm.close,\"title\":_vm.$t('userProfile.securitySettings.securitySettings'),\"visible\":_vm.visible}},[_c('el-form',{attrs:{\"model\":_vm.securitySettingsForm,\"label-width\":_vm.getLabelWidth}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('userProfile.securitySettings.email')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('userProfile.securitySettings.inputNewEmail')},model:{value:(_vm.securitySettingsForm.newEmail),callback:function ($$v) {_vm.$set(_vm.securitySettingsForm, \"newEmail\", $$v)},expression:\"securitySettingsForm.newEmail\"}})],1),_vm._v(\" \"),_c('el-form-item',[_c('el-button',{staticClass:\"security-settings-submit-button\",attrs:{\"loading\":_vm.securitySettingsForm.isEmailLoading,\"disabled\":!_vm.securitySettingsForm.newEmail || _vm.securitySettingsForm.newEmail === _vm.userCredentials.email,\"type\":\"primary\"},on:{\"click\":function($event){return _vm.updateEmail()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.submit'))+\"\\n \")])],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"password-input\",attrs:{\"label\":_vm.$t('userProfile.securitySettings.password')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('userProfile.securitySettings.inputNewPassword')},model:{value:(_vm.securitySettingsForm.newPassword),callback:function ($$v) {_vm.$set(_vm.securitySettingsForm, \"newPassword\", $$v)},expression:\"securitySettingsForm.newPassword\"}}),_vm._v(\" \"),_c('small',{staticClass:\"form-text\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.passwordLengthNotice', { minLength: 8 }))+\"\\n \")])],1),_vm._v(\" \"),_c('el-alert',{staticClass:\"password-alert\",attrs:{\"closable\":false,\"type\":\"warning\",\"show-icon\":\"\"}},[_c('p',[_vm._v(_vm._s(_vm.$t('userProfile.securitySettings.passwordChangeWarning1')))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('userProfile.securitySettings.passwordChangeWarning2')))])]),_vm._v(\" \"),_c('el-form-item',[_c('el-button',{staticClass:\"security-settings-submit-button\",attrs:{\"loading\":_vm.securitySettingsForm.isPasswordLoading,\"disabled\":_vm.securitySettingsForm.newPassword.length < 8,\"type\":\"primary\"},on:{\"click\":function($event){return _vm.updatePassword()}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.securitySettings.submit'))+\"\\n \")])],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./show.vue?vue&type=template&id=36e4a678&\"\nimport script from \"./show.vue?vue&type=script&lang=js&\"\nexport * from \"./show.vue?vue&type=script&lang=js&\"\nimport style0 from \"./show.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"show.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],attrs:{\"visible\":_vm.dialogOpen,\"title\":_vm.$t('users.passwordResetTokenCreated'),\"custom-class\":\"password-reset-token-dialog\"},on:{\"close\":_vm.closeResetPasswordDialog}},[_c('div',[_c('p',{staticClass:\"password-reset-token\"},[_vm._v(_vm._s(_vm.$t('users.passwordResetTokenGenerated'))+\" \"+_vm._s(_vm.passwordResetToken))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('users.linkToResetPassword'))+\"\\n \"),_c('a',{staticClass:\"reset-password-link\",attrs:{\"href\":_vm.passwordResetLink,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.passwordResetLink))])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResetPasswordDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResetPasswordDialog.vue?vue&type=script&lang=js&\"","\n\n\n\n","import { render, staticRenderFns } from \"./ResetPasswordDialog.vue?vue&type=template&id=e7d3eed4&\"\nimport script from \"./ResetPasswordDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./ResetPasswordDialog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ResetPasswordDialog.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"hide-on-click\":false,\"size\":\"small\",\"trigger\":\"click\",\"placement\":\"top-start\"},nativeOn:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',[(_vm.page === 'users')?_c('el-button',{staticClass:\"el-dropdown-link\",attrs:{\"type\":\"text\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderation'))+\"\\n \"),(_vm.isDesktop)?_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.page === 'userPage' || _vm.page === 'statusPage')?_c('el-button',{staticClass:\"moderate-user-button\"},[_c('span',{staticClass:\"moderate-user-button-container\"},[_c('span',[_c('i',{staticClass:\"el-icon-edit\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderateUser'))+\"\\n \")]),_vm._v(\" \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})])]):_vm._e()],1),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.admin ? _vm.$t('users.revokeAdmin') : _vm.$t('users.grantAdmin'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.moderator ? _vm.$t('users.revokeModerator') : _vm.$t('users.grantModerator'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id) && _vm.page !== 'statusPage')?_c('el-dropdown-item',{attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleActivation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.deactivated ? _vm.$t('users.activateAccount') : _vm.$t('users.deactivateAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id) && _vm.page !== 'statusPage')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeletion(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.handleEmailConfirmation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.confirmAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleConfirmationResend(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.resendConfirmation'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_nsfw') },attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceNsfw'))+\"\\n \"),(_vm.user.tags.includes('force_nsfw'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('strip_media') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.stripMedia'))+\"\\n \"),(_vm.user.tags.includes('strip_media'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_unlisted') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceUnlisted'))+\"\\n \"),(_vm.user.tags.includes('force_unlisted'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('sandbox') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.sandbox'))+\"\\n \"),(_vm.user.tags.includes('sandbox'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_remote_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableRemoteSubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_remote_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_any_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableAnySubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_any_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.getPasswordResetToken(_vm.user.nickname)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.getPasswordResetToken'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.requirePasswordReset(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.requirePasswordReset'))+\"\\n \")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ModerationDropdown.vue?vue&type=template&id=25dd4f14&\"\nimport script from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ModerationDropdown.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js b/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js deleted file mode 100644 index bfdf936f8..000000000 --- a/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-6b68"],{DMFV:function(t,e,r){},"O/DJ":function(t,e,r){"use strict";var n=r("DMFV");r.n(n).a},i7Kn:function(t,e,r){"use strict";var n=r("o0o1"),s=r.n(n),i=r("yXPU"),a=r.n(i),o={props:{selectedUsers:{type:Array,default:function(){return[]}}},computed:{showDropdownForMultipleUsers:function(){return this.$props.selectedUsers.length>0},isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{mappers:function(){var t=this,e=function(){var e=a()(s.a.mark(function e(r,n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n(r);case 2:t.$emit("apply-action");case 3:case"end":return e.stop()}},e)}));return function(t,r){return e.apply(this,arguments)}}();return{grantRight:function(r){return function(){var n=function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("AddRight",{users:n,right:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),i=t.selectedUsers.filter(function(e){return e.local&&!e.roles[r]&&t.$store.state.user.id!==e.id});e(i,n)}},revokeRight:function(r){return function(){var n=function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("DeleteRight",{users:n,right:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}(),i=t.selectedUsers.filter(function(e){return e.local&&e.roles[r]&&t.$store.state.user.id!==e.id});e(i,n)}},activate:function(){var r=t.selectedUsers.filter(function(e){return e.deactivated&&t.$store.state.user.id!==e.id});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("ActivateUsers",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},deactivate:function(){var r=t.selectedUsers.filter(function(e){return!e.deactivated&&t.$store.state.user.id!==e.id});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("DeactivateUsers",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},remove:function(){var r=t.selectedUsers.filter(function(e){return t.$store.state.user.id!==e.id});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("DeleteUsers",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},addTag:function(r){return function(){var n=t.selectedUsers.filter(function(t){return"disable_remote_subscription"===r||"disable_any_subscription"===r?t.local&&!t.tags.includes(r):!t.tags.includes(r)});e(n,function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("AddTag",{users:n,tag:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())}},removeTag:function(r){return a()(s.a.mark(function n(){var i;return s.a.wrap(function(n){for(;;)switch(n.prev=n.next){case 0:i=t.selectedUsers.filter(function(t){return"disable_remote_subscription"===r||"disable_any_subscription"===r?t.local&&t.tags.includes(r):t.tags.includes(r)}),e(i,function(){var e=a()(s.a.mark(function e(n){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("RemoveTag",{users:n,tag:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}());case 3:case"end":return n.stop()}},n)}))},requirePasswordReset:function(){var r=t.selectedUsers.filter(function(t){return t.local});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("RequirePasswordReset",r);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},confirmAccounts:function(){var r=t.selectedUsers.filter(function(t){return t.local&&t.confirmation_pending});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("ConfirmUsersEmail",{users:r});case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())},resendConfirmation:function(){var r=t.selectedUsers.filter(function(t){return t.local&&t.confirmation_pending});e(r,function(){var e=a()(s.a.mark(function e(r){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.$store.dispatch("ResendConfirmationEmail",r);case 2:return e.abrupt("return",e.sent);case 3:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}())}}},grantRightToMultipleUsers:function(t){var e=this.mappers().grantRight;this.confirmMessage(this.$t("users.grantRightConfirmation",{right:t}),e(t))},revokeRightFromMultipleUsers:function(t){var e=this.mappers().revokeRight;this.confirmMessage(this.$t("users.revokeRightConfirmation",{right:t}),e(t))},activateMultipleUsers:function(){var t=this.mappers().activate;this.confirmMessage(this.$t("users.activateMultipleUsersConfirmation"),t)},deactivateMultipleUsers:function(){var t=this.mappers().deactivate;this.confirmMessage(this.$t("users.deactivateMultipleUsersConfirmation"),t)},deleteMultipleUsers:function(){var t=this.mappers().remove;this.confirmMessage(this.$t("users.deleteMultipleUsersConfirmation"),t)},requirePasswordReset:function(){if(this.$store.state.user.nodeInfo.metadata.mailerEnabled){var t=this.mappers().requirePasswordReset;this.confirmMessage(this.$t("users.requirePasswordResetConfirmation"),t)}else this.$alert(this.$t("users.mailerMustBeEnabled"),"Error",{type:"error"})},addTagForMultipleUsers:function(t){var e=this.mappers().addTag;this.confirmMessage(this.$t("users.addTagForMultipleUsersConfirmation"),e(t))},removeTagFromMultipleUsers:function(t){var e=this.mappers().removeTag;this.confirmMessage(this.$t("users.removeTagFromMultipleUsersConfirmation"),e(t))},confirmAccountsForMultipleUsers:function(){var t=this.mappers().confirmAccounts;this.confirmMessage(this.$t("users.confirmAccountsConfirmation"),t)},resendConfirmationForMultipleUsers:function(){var t=this.mappers().resendConfirmation;this.confirmMessage(this.$t("users.resendEmailConfirmation"),t)},confirmMessage:function(t,e){var r=this;this.$confirm(t,{confirmButtonText:this.$t("users.ok"),cancelButtonText:this.$t("users.cancel"),type:"warning"}).then(function(){e()}).catch(function(){r.$message({type:"info",message:r.$t("users.canceled")})})}}},u=(r("O/DJ"),r("KHd+")),c=Object(u.a)(o,function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("el-dropdown",{attrs:{size:"small",trigger:"click",placement:"bottom-start"}},[t.isDesktop?r("el-button",{staticClass:"actions-button"},[r("span",{staticClass:"actions-button-container"},[r("span",[r("i",{staticClass:"el-icon-edit"}),t._v("\n "+t._s(t.$t("users.moderateUsers"))+"\n ")]),t._v(" "),r("i",{staticClass:"el-icon-arrow-down el-icon--right"})])]):t._e(),t._v(" "),t.showDropdownForMultipleUsers?r("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[r("el-dropdown-item",{nativeOn:{click:function(e){return t.grantRightToMultipleUsers("admin")}}},[t._v("\n "+t._s(t.$t("users.grantAdmin"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.revokeRightFromMultipleUsers("admin")}}},[t._v("\n "+t._s(t.$t("users.revokeAdmin"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.grantRightToMultipleUsers("moderator")}}},[t._v("\n "+t._s(t.$t("users.grantModerator"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.revokeRightFromMultipleUsers("moderator")}}},[t._v("\n "+t._s(t.$t("users.revokeModerator"))+"\n ")]),t._v(" "),r("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return t.confirmAccountsForMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.confirmAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.resendConfirmationForMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.resendConfirmation"))+"\n ")]),t._v(" "),r("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return t.activateMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.activateAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.deactivateMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.deactivateAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.deleteMultipleUsers(e)}}},[t._v("\n "+t._s(t.$t("users.deleteAccounts"))+"\n ")]),t._v(" "),r("el-dropdown-item",{nativeOn:{click:function(e){return t.requirePasswordReset(e)}}},[t._v("\n "+t._s(t.$t("users.requirePasswordReset"))+"\n ")]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover",attrs:{divided:""}},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.forceNsfw")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("force_nsfw")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("force_nsfw")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.stripMedia")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("strip_media")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("strip_media")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.forceUnlisted")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("force_unlisted")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("force_unlisted")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.sandbox")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("sandbox")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("sandbox")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.disableRemoteSubscriptionForMultiple")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("disable_remote_subscription")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("disable_remote_subscription")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)]),t._v(" "),r("el-dropdown-item",{staticClass:"no-hover"},[r("div",{staticClass:"tag-container"},[r("span",{staticClass:"tag-text"},[t._v(t._s(t.$t("users.disableAnySubscriptionForMultiple")))]),t._v(" "),r("el-button-group",{staticClass:"tag-button-group"},[r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.addTagForMultipleUsers("disable_any_subscription")}}},[t._v("\n "+t._s(t.$t("users.apply"))+"\n ")]),t._v(" "),r("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.removeTagFromMultipleUsers("disable_any_subscription")}}},[t._v("\n "+t._s(t.$t("users.remove"))+"\n ")])],1)],1)])],1):r("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[r("el-dropdown-item",[t._v("\n "+t._s(t.$t("users.selectUsers"))+"\n ")])],1)],1)},[],!1,null,"3850612b",null);c.options.__file="MultipleUsersMenu.vue";e.a=c.exports},rIUS:function(t,e,r){"use strict";var n=r("o0o1"),s=r.n(n),i=r("yXPU"),a=r.n(i),o=r("mSNy"),u={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var t=a()(s.a.mark(function t(){return s.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("RestartApplication");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:o.a.t("settings.restartSuccess")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},c=r("KHd+"),l=Object(c.a)(u,function(){var t=this.$createElement,e=this._self._c||t;return this.needReboot?e("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[e("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[e("span",[e("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);l.options.__file="index.vue";e.a=l.exports}}]); -//# sourceMappingURL=chunk-6b68.fbc0f684.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map b/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map deleted file mode 100644 index d1d728b80..000000000 --- a/priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/users/components/MultipleUsersMenu.vue?64bc","webpack:///./src/views/users/components/MultipleUsersMenu.vue?25e9","webpack:///./src/views/users/components/MultipleUsersMenu.vue?56ef","webpack:///src/views/users/components/MultipleUsersMenu.vue","webpack:///./src/views/users/components/MultipleUsersMenu.vue","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_MultipleUsersMenu_vue_vue_type_style_index_0_id_3850612b_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","components_MultipleUsersMenuvue_type_script_lang_js_","props","selectedUsers","type","Array","default","computed","showDropdownForMultipleUsers","this","$props","length","isDesktop","$store","state","app","device","methods","mappers","_this","applyAction","_ref","asyncToGenerator_default","regenerator_default","a","mark","_callee","users","dispatchAction","wrap","_context","prev","next","$emit","stop","_x","_x2","apply","arguments","grantRight","right","addRightFn","_ref2","_callee2","_context2","dispatch","abrupt","sent","_x3","filtered","filter","user","local","roles","id","revokeRight","deleteRightFn","_ref3","_callee3","_context3","_x4","activate","deactivated","_ref4","_callee4","_context4","_x5","deactivate","_ref5","_callee5","_context5","_x6","remove","_ref6","_callee6","_context6","_x7","addTag","tag","tags","includes","_ref7","_callee7","_context7","_x8","removeTag","_callee9","_context9","_ref9","_callee8","_context8","_x9","requirePasswordReset","_ref10","_callee10","_context10","_x10","confirmAccounts","confirmation_pending","_ref11","_callee11","_context11","_x11","resendConfirmation","_ref12","_callee12","_context12","_x12","grantRightToMultipleUsers","confirmMessage","$t","revokeRightFromMultipleUsers","activateMultipleUsers","deactivateMultipleUsers","deleteMultipleUsers","nodeInfo","metadata","mailerEnabled","$alert","addTagForMultipleUsers","removeTagFromMultipleUsers","confirmAccountsForMultipleUsers","resendConfirmationForMultipleUsers","message","_this2","$confirm","confirmButtonText","cancelButtonText","then","catch","$message","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","attrs","size","trigger","placement","staticClass","_v","_s","_e","slot","nativeOn","click","$event","divided","options","__file","__webpack_exports__","components_RebootButtonvue_type_script_lang_js_","name","needReboot","restartApp","_restartApp","t0","lang","t","content","on"],"mappings":"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","file":"static/js/chunk-6b68.fbc0f684.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=style&index=0&id=3850612b&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=style&index=0&id=3850612b&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"size\":\"small\",\"trigger\":\"click\",\"placement\":\"bottom-start\"}},[(_vm.isDesktop)?_c('el-button',{staticClass:\"actions-button\"},[_c('span',{staticClass:\"actions-button-container\"},[_c('span',[_c('i',{staticClass:\"el-icon-edit\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderateUsers'))+\"\\n \")]),_vm._v(\" \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})])]):_vm._e(),_vm._v(\" \"),(_vm.showDropdownForMultipleUsers)?_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.grantRightToMultipleUsers('admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.grantAdmin'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.revokeRightFromMultipleUsers('admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.revokeAdmin'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.grantRightToMultipleUsers('moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.grantModerator'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.revokeRightFromMultipleUsers('moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.revokeModerator'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.confirmAccountsForMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.confirmAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.resendConfirmationForMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.resendConfirmation'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.activateMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.activateAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deactivateMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deactivateAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deleteMultipleUsers($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccounts'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.requirePasswordReset($event)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.requirePasswordReset'))+\"\\n \")]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\",attrs:{\"divided\":\"\"}},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.forceNsfw')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.stripMedia')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.forceUnlisted')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.sandbox')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.disableRemoteSubscriptionForMultiple')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-dropdown-item',{staticClass:\"no-hover\"},[_c('div',{staticClass:\"tag-container\"},[_c('span',{staticClass:\"tag-text\"},[_vm._v(_vm._s(_vm.$t('users.disableAnySubscriptionForMultiple')))]),_vm._v(\" \"),_c('el-button-group',{staticClass:\"tag-button-group\"},[_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.addTagForMultipleUsers('disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.apply'))+\"\\n \")]),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.removeTagFromMultipleUsers('disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.remove'))+\"\\n \")])],1)],1)])],1):_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[_c('el-dropdown-item',[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.selectUsers'))+\"\\n \")])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultipleUsersMenu.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./MultipleUsersMenu.vue?vue&type=template&id=3850612b&scoped=true&\"\nimport script from \"./MultipleUsersMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./MultipleUsersMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MultipleUsersMenu.vue?vue&type=style&index=0&id=3850612b&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3850612b\",\n null\n \n)\n\ncomponent.options.__file = \"MultipleUsersMenu.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js b/priv/static/adminfe/static/js/chunk-6e81.6efb01f4.js similarity index 97% rename from priv/static/adminfe/static/js/chunk-6e81.3733ace2.js rename to priv/static/adminfe/static/js/chunk-6e81.6efb01f4.js index c888ce03f..f40d31879 100644 --- a/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js +++ b/priv/static/adminfe/static/js/chunk-6e81.6efb01f4.js @@ -1,2 +1,2 @@ (window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-6e81"],{BF41:function(t,a,i){},"UUO+":function(t,a,i){"use strict";i.r(a);var e=i("zGwZ"),s=i.n(e),r={name:"Page401",data:function(){return{errGif:s.a+"?"+ +new Date,ewizardClap:"https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646",dialogVisible:!1}},methods:{back:function(){this.$route.query.noGoBack?this.$router.push({path:"/dashboard"}):this.$router.go(-1)}}},n=(i("UrVv"),i("KHd+")),l=Object(n.a)(r,function(){var t=this,a=t.$createElement,i=t._self._c||a;return i("div",{staticClass:"errPage-container"},[i("el-button",{staticClass:"pan-back-btn",attrs:{icon:"arrow-left"},on:{click:t.back}},[t._v("返回")]),t._v(" "),i("el-row",[i("el-col",{attrs:{span:12}},[i("h1",{staticClass:"text-jumbo text-ginormous"},[t._v("Oops!")]),t._v("\n gif来源"),i("a",{attrs:{href:"https://zh.airbnb.com/",target:"_blank"}},[t._v("airbnb")]),t._v(" 页面\n "),i("h2",[t._v("你没有权限去该页面")]),t._v(" "),i("h6",[t._v("如有不满请联系你领导")]),t._v(" "),i("ul",{staticClass:"list-unstyled"},[i("li",[t._v("或者你可以去:")]),t._v(" "),i("li",{staticClass:"link-type"},[i("router-link",{attrs:{to:"/dashboard"}},[t._v("回首页")])],1),t._v(" "),i("li",{staticClass:"link-type"},[i("a",{attrs:{href:"https://www.taobao.com/"}},[t._v("随便看看")])]),t._v(" "),i("li",[i("a",{attrs:{href:"#"},on:{click:function(a){a.preventDefault(),t.dialogVisible=!0}}},[t._v("点我看图")])])])]),t._v(" "),i("el-col",{attrs:{span:12}},[i("img",{attrs:{src:t.errGif,width:"313",height:"428",alt:"Girl has dropped her ice cream."}})])],1),t._v(" "),i("el-dialog",{attrs:{visible:t.dialogVisible,title:"随便看"},on:{"update:visible":function(a){t.dialogVisible=a}}},[i("img",{staticClass:"pan-img",attrs:{src:t.ewizardClap}})])],1)},[],!1,null,"ab9be52c",null);l.options.__file="401.vue";a.default=l.exports},UrVv:function(t,a,i){"use strict";var e=i("BF41");i.n(e).a},zGwZ:function(t,a,i){t.exports=i.p+"static/img/401.089007e.gif"}}]); -//# sourceMappingURL=chunk-6e81.3733ace2.js.map \ No newline at end of file +//# sourceMappingURL=chunk-6e81.6efb01f4.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js.map b/priv/static/adminfe/static/js/chunk-6e81.6efb01f4.js.map similarity index 98% rename from priv/static/adminfe/static/js/chunk-6e81.3733ace2.js.map rename to priv/static/adminfe/static/js/chunk-6e81.6efb01f4.js.map index 63128dd67..0390c3309 100644 --- a/priv/static/adminfe/static/js/chunk-6e81.3733ace2.js.map +++ b/priv/static/adminfe/static/js/chunk-6e81.6efb01f4.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///./src/views/errorPage/401.vue?e7a2","webpack:///./src/views/errorPage/401.vue?6307","webpack:///src/views/errorPage/401.vue","webpack:///./src/views/errorPage/401.vue","webpack:///./src/views/errorPage/401.vue?2b76","webpack:///./src/assets/401_images/401.gif"],"names":["errorPage_401vue_type_script_lang_js_","name","data","errGif","_401_default","a","Date","ewizardClap","dialogVisible","methods","back","this","$route","query","noGoBack","$router","push","path","go","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","icon","on","click","_v","span","href","target","to","$event","preventDefault","src","width","height","alt","visible","title","update:visible","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_style_index_0_id_ab9be52c_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","module","exports","p"],"mappings":"sIAAA,yBCAwMA,GCgCxMC,KAAA,UACAC,KAAA,WACA,OACAC,OAAAC,EAAAC,EAAA,UAAAC,KACAC,YAAA,kEACAC,eAAA,IAGAC,SACAC,KADA,WAEAC,KAAAC,OAAAC,MAAAC,SACAH,KAAAI,QAAAC,MAAAC,KAAA,eAEAN,KAAAI,QAAAG,IAAA,8BCrCAC,EAAgBC,OAAAC,EAAA,EAAAD,CACdpB,EHTF,WAA0B,IAAAsB,EAAAX,KAAaY,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,sBAAgCF,EAAA,aAAkBE,YAAA,eAAAC,OAAkCC,KAAA,cAAoBC,IAAKC,MAAAT,EAAAZ,QAAkBY,EAAAU,GAAA,QAAAV,EAAAU,GAAA,KAAAP,EAAA,UAAAA,EAAA,UAAuDG,OAAOK,KAAA,MAAWR,EAAA,MAAWE,YAAA,8BAAwCL,EAAAU,GAAA,WAAAV,EAAAU,GAAA,iBAAAP,EAAA,KAAoDG,OAAOM,KAAA,yBAAAC,OAAA,YAAmDb,EAAAU,GAAA,YAAAV,EAAAU,GAAA,eAAAP,EAAA,MAAAH,EAAAU,GAAA,eAAAV,EAAAU,GAAA,KAAAP,EAAA,MAAAH,EAAAU,GAAA,gBAAAV,EAAAU,GAAA,KAAAP,EAAA,MAA2IE,YAAA,kBAA4BF,EAAA,MAAAH,EAAAU,GAAA,aAAAV,EAAAU,GAAA,KAAAP,EAAA,MAAoDE,YAAA,cAAwBF,EAAA,eAAoBG,OAAOQ,GAAA,gBAAmBd,EAAAU,GAAA,aAAAV,EAAAU,GAAA,KAAAP,EAAA,MAA2CE,YAAA,cAAwBF,EAAA,KAAUG,OAAOM,KAAA,6BAAkCZ,EAAAU,GAAA,YAAAV,EAAAU,GAAA,KAAAP,EAAA,MAAAA,EAAA,KAAkDG,OAAOM,KAAA,KAAWJ,IAAKC,MAAA,SAAAM,GAAyBA,EAAAC,iBAAwBhB,EAAAd,eAAA,MAAyBc,EAAAU,GAAA,gBAAAV,EAAAU,GAAA,KAAAP,EAAA,UAAkDG,OAAOK,KAAA,MAAWR,EAAA,OAAYG,OAAOW,IAAAjB,EAAAnB,OAAAqC,MAAA,MAAAC,OAAA,MAAAC,IAAA,wCAAuF,GAAApB,EAAAU,GAAA,KAAAP,EAAA,aAAoCG,OAAOe,QAAArB,EAAAd,cAAAoC,MAAA,OAA0Cd,IAAKe,iBAAA,SAAAR,GAAkCf,EAAAd,cAAA6B,MAA2BZ,EAAA,OAAYE,YAAA,UAAAC,OAA6BW,IAAAjB,EAAAf,kBAAuB,QGYl4C,EACA,KACA,WACA,MAIAY,EAAA2B,QAAAC,OAAA,UACeC,EAAA,QAAA7B,6CCpBf,IAAA8B,EAAAC,EAAA,QAAAA,EAAAC,EAAAF,GAA6e,wBCA7eG,EAAAC,QAAiBH,EAAAI,EAAuB","file":"static/js/chunk-6e81.3733ace2.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"errPage-container\"},[_c('el-button',{staticClass:\"pan-back-btn\",attrs:{\"icon\":\"arrow-left\"},on:{\"click\":_vm.back}},[_vm._v(\"返回\")]),_vm._v(\" \"),_c('el-row',[_c('el-col',{attrs:{\"span\":12}},[_c('h1',{staticClass:\"text-jumbo text-ginormous\"},[_vm._v(\"Oops!\")]),_vm._v(\"\\n gif来源\"),_c('a',{attrs:{\"href\":\"https://zh.airbnb.com/\",\"target\":\"_blank\"}},[_vm._v(\"airbnb\")]),_vm._v(\" 页面\\n \"),_c('h2',[_vm._v(\"你没有权限去该页面\")]),_vm._v(\" \"),_c('h6',[_vm._v(\"如有不满请联系你领导\")]),_vm._v(\" \"),_c('ul',{staticClass:\"list-unstyled\"},[_c('li',[_vm._v(\"或者你可以去:\")]),_vm._v(\" \"),_c('li',{staticClass:\"link-type\"},[_c('router-link',{attrs:{\"to\":\"/dashboard\"}},[_vm._v(\"回首页\")])],1),_vm._v(\" \"),_c('li',{staticClass:\"link-type\"},[_c('a',{attrs:{\"href\":\"https://www.taobao.com/\"}},[_vm._v(\"随便看看\")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.dialogVisible=true}}},[_vm._v(\"点我看图\")])])])]),_vm._v(\" \"),_c('el-col',{attrs:{\"span\":12}},[_c('img',{attrs:{\"src\":_vm.errGif,\"width\":\"313\",\"height\":\"428\",\"alt\":\"Girl has dropped her ice cream.\"}})])],1),_vm._v(\" \"),_c('el-dialog',{attrs:{\"visible\":_vm.dialogVisible,\"title\":\"随便看\"},on:{\"update:visible\":function($event){_vm.dialogVisible=$event}}},[_c('img',{staticClass:\"pan-img\",attrs:{\"src\":_vm.ewizardClap}})])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./401.vue?vue&type=template&id=ab9be52c&scoped=true&\"\nimport script from \"./401.vue?vue&type=script&lang=js&\"\nexport * from \"./401.vue?vue&type=script&lang=js&\"\nimport style0 from \"./401.vue?vue&type=style&index=0&id=ab9be52c&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ab9be52c\",\n null\n \n)\n\ncomponent.options.__file = \"401.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=style&index=0&id=ab9be52c&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=style&index=0&id=ab9be52c&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"static/img/401.089007e.gif\";"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///./src/views/errorPage/401.vue?e7a2","webpack:///./src/views/errorPage/401.vue?6307","webpack:///src/views/errorPage/401.vue","webpack:///./src/views/errorPage/401.vue","webpack:///./src/views/errorPage/401.vue?2b76","webpack:///./src/assets/401_images/401.gif"],"names":["errorPage_401vue_type_script_lang_js_","name","data","errGif","_401_default","a","Date","ewizardClap","dialogVisible","methods","back","this","$route","query","noGoBack","$router","push","path","go","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","icon","on","click","_v","span","href","target","to","$event","preventDefault","src","width","height","alt","visible","title","update:visible","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_style_index_0_id_ab9be52c_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","module","exports","p"],"mappings":"sIAAA,yBCAwMA,GCgCxMC,KAAA,UACAC,KAAA,WACA,OACAC,OAAAC,EAAAC,EAAA,UAAAC,KACAC,YAAA,kEACAC,eAAA,IAGAC,SACAC,KADA,WAEAC,KAAAC,OAAAC,MAAAC,SACAH,KAAAI,QAAAC,MAAAC,KAAA,eAEAN,KAAAI,QAAAG,IAAA,8BCrCAC,EAAgBC,OAAAC,EAAA,EAAAD,CACdpB,EHTF,WAA0B,IAAAsB,EAAAX,KAAaY,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,sBAAgCF,EAAA,aAAkBE,YAAA,eAAAC,OAAkCC,KAAA,cAAoBC,IAAKC,MAAAT,EAAAZ,QAAkBY,EAAAU,GAAA,QAAAV,EAAAU,GAAA,KAAAP,EAAA,UAAAA,EAAA,UAAuDG,OAAOK,KAAA,MAAWR,EAAA,MAAWE,YAAA,8BAAwCL,EAAAU,GAAA,WAAAV,EAAAU,GAAA,iBAAAP,EAAA,KAAoDG,OAAOM,KAAA,yBAAAC,OAAA,YAAmDb,EAAAU,GAAA,YAAAV,EAAAU,GAAA,eAAAP,EAAA,MAAAH,EAAAU,GAAA,eAAAV,EAAAU,GAAA,KAAAP,EAAA,MAAAH,EAAAU,GAAA,gBAAAV,EAAAU,GAAA,KAAAP,EAAA,MAA2IE,YAAA,kBAA4BF,EAAA,MAAAH,EAAAU,GAAA,aAAAV,EAAAU,GAAA,KAAAP,EAAA,MAAoDE,YAAA,cAAwBF,EAAA,eAAoBG,OAAOQ,GAAA,gBAAmBd,EAAAU,GAAA,aAAAV,EAAAU,GAAA,KAAAP,EAAA,MAA2CE,YAAA,cAAwBF,EAAA,KAAUG,OAAOM,KAAA,6BAAkCZ,EAAAU,GAAA,YAAAV,EAAAU,GAAA,KAAAP,EAAA,MAAAA,EAAA,KAAkDG,OAAOM,KAAA,KAAWJ,IAAKC,MAAA,SAAAM,GAAyBA,EAAAC,iBAAwBhB,EAAAd,eAAA,MAAyBc,EAAAU,GAAA,gBAAAV,EAAAU,GAAA,KAAAP,EAAA,UAAkDG,OAAOK,KAAA,MAAWR,EAAA,OAAYG,OAAOW,IAAAjB,EAAAnB,OAAAqC,MAAA,MAAAC,OAAA,MAAAC,IAAA,wCAAuF,GAAApB,EAAAU,GAAA,KAAAP,EAAA,aAAoCG,OAAOe,QAAArB,EAAAd,cAAAoC,MAAA,OAA0Cd,IAAKe,iBAAA,SAAAR,GAAkCf,EAAAd,cAAA6B,MAA2BZ,EAAA,OAAYE,YAAA,UAAAC,OAA6BW,IAAAjB,EAAAf,kBAAuB,QGYl4C,EACA,KACA,WACA,MAIAY,EAAA2B,QAAAC,OAAA,UACeC,EAAA,QAAA7B,6CCpBf,IAAA8B,EAAAC,EAAA,QAAAA,EAAAC,EAAAF,GAA6e,wBCA7eG,EAAAC,QAAiBH,EAAAI,EAAuB","file":"static/js/chunk-6e81.6efb01f4.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"errPage-container\"},[_c('el-button',{staticClass:\"pan-back-btn\",attrs:{\"icon\":\"arrow-left\"},on:{\"click\":_vm.back}},[_vm._v(\"返回\")]),_vm._v(\" \"),_c('el-row',[_c('el-col',{attrs:{\"span\":12}},[_c('h1',{staticClass:\"text-jumbo text-ginormous\"},[_vm._v(\"Oops!\")]),_vm._v(\"\\n gif来源\"),_c('a',{attrs:{\"href\":\"https://zh.airbnb.com/\",\"target\":\"_blank\"}},[_vm._v(\"airbnb\")]),_vm._v(\" 页面\\n \"),_c('h2',[_vm._v(\"你没有权限去该页面\")]),_vm._v(\" \"),_c('h6',[_vm._v(\"如有不满请联系你领导\")]),_vm._v(\" \"),_c('ul',{staticClass:\"list-unstyled\"},[_c('li',[_vm._v(\"或者你可以去:\")]),_vm._v(\" \"),_c('li',{staticClass:\"link-type\"},[_c('router-link',{attrs:{\"to\":\"/dashboard\"}},[_vm._v(\"回首页\")])],1),_vm._v(\" \"),_c('li',{staticClass:\"link-type\"},[_c('a',{attrs:{\"href\":\"https://www.taobao.com/\"}},[_vm._v(\"随便看看\")])]),_vm._v(\" \"),_c('li',[_c('a',{attrs:{\"href\":\"#\"},on:{\"click\":function($event){$event.preventDefault();_vm.dialogVisible=true}}},[_vm._v(\"点我看图\")])])])]),_vm._v(\" \"),_c('el-col',{attrs:{\"span\":12}},[_c('img',{attrs:{\"src\":_vm.errGif,\"width\":\"313\",\"height\":\"428\",\"alt\":\"Girl has dropped her ice cream.\"}})])],1),_vm._v(\" \"),_c('el-dialog',{attrs:{\"visible\":_vm.dialogVisible,\"title\":\"随便看\"},on:{\"update:visible\":function($event){_vm.dialogVisible=$event}}},[_c('img',{staticClass:\"pan-img\",attrs:{\"src\":_vm.ewizardClap}})])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./401.vue?vue&type=template&id=ab9be52c&scoped=true&\"\nimport script from \"./401.vue?vue&type=script&lang=js&\"\nexport * from \"./401.vue?vue&type=script&lang=js&\"\nimport style0 from \"./401.vue?vue&type=style&index=0&id=ab9be52c&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ab9be52c\",\n null\n \n)\n\ncomponent.options.__file = \"401.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=style&index=0&id=ab9be52c&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./401.vue?vue&type=style&index=0&id=ab9be52c&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","module.exports = __webpack_public_path__ + \"static/img/401.089007e.gif\";"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7506.a3364e53.js b/priv/static/adminfe/static/js/chunk-7506.a3364e53.js new file mode 100644 index 000000000..d4eaa356a --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-7506.a3364e53.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-7506"],{"53Av":function(s,e,t){"use strict";var a=t("lOBV");t.n(a).a},RnhZ:function(s,e,t){var a={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function r(s){var e=n(s);return t(e)}function n(s){if(!t.o(a,s)){var e=new Error("Cannot find module '"+s+"'");throw e.code="MODULE_NOT_FOUND",e}return a[s]}r.keys=function(){return Object.keys(a)},r.resolve=n,s.exports=r,r.id="RnhZ"},S3Ak:function(s,e,t){"use strict";var a=t("lGnS");t.n(a).a},WjBP:function(s,e,t){"use strict";var a={name:"ResetPasswordDialog",props:{resetPasswordDialogOpen:{type:Boolean,default:!1}},computed:{dialogOpen:function(){return this.resetPasswordDialogOpen},loading:function(){return this.$store.state.users.loading},passwordResetLink:function(){return this.$store.state.users.passwordResetToken.link},passwordResetToken:function(){return this.$store.state.users.passwordResetToken.token}},methods:{closeResetPasswordDialog:function(){this.$emit("close-reset-token-dialog")}}},r=t("KHd+"),n=Object(r.a)(a,function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("el-dialog",{directives:[{name:"loading",rawName:"v-loading",value:s.loading,expression:"loading"}],attrs:{visible:s.dialogOpen,title:s.$t("users.passwordResetTokenCreated"),"custom-class":"password-reset-token-dialog"},on:{close:s.closeResetPasswordDialog}},[t("div",[t("p",{staticClass:"password-reset-token"},[s._v(s._s(s.$t("users.passwordResetTokenGenerated"))+" "+s._s(s.passwordResetToken))]),s._v(" "),t("p",[s._v(s._s(s.$t("users.linkToResetPassword"))+"\n "),t("a",{staticClass:"reset-password-link",attrs:{href:s.passwordResetLink,target:"_blank"}},[s._v(s._s(s.passwordResetLink))])])])])},[],!1,null,null,null);n.options.__file="ResetPasswordDialog.vue";e.a=n.exports},lGnS:function(s,e,t){},lOBV:function(s,e,t){},rwwt:function(s,e,t){"use strict";t.r(e);var a=t("ot3S"),r=t("tPM3"),n=t("rIUS"),i=t("WjBP"),o={name:"StatusShow",components:{ModerationDropdown:r.a,RebootButton:n.a,ResetPasswordDialog:i.a,Status:a.a},data:function(){return{showPrivate:!1,resetPasswordDialogOpen:!1}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},loading:function(){return this.$store.state.status.loading},status:function(){return this.$store.state.status.fetchedStatus},statuses:function(){return this.$store.state.userProfile.statuses},statusesLoading:function(){return this.$store.state.userProfile.statusesLoading},user:function(){return this.$store.state.status.statusAuthor}},beforeMount:function(){this.$store.dispatch("NeedReboot"),this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("FetchStatus",this.$route.params.id)},methods:{closeResetPasswordDialog:function(){this.resetPasswordDialogOpen=!1,this.$store.dispatch("RemovePasswordToken")},onTogglePrivate:function(){this.$store.dispatch("FetchUserStatuses",{userId:this.user.id,godmode:this.showPrivate})},openResetPasswordDialog:function(){this.resetPasswordDialogOpen=!0},propertyExists:function(s,e){return s[e]}}},u=(t("S3Ak"),t("KHd+")),d=Object(u.a)(o,function(){var s=this,e=s.$createElement,t=s._self._c||e;return s.loading?s._e():t("div",{staticClass:"status-show-container"},[s.isDesktop||s.isTablet?t("header",{staticClass:"user-page-header"},[t("div",{staticClass:"avatar-name-container"},[s.propertyExists(s.user,"id")?t("router-link",{staticClass:"router-link",attrs:{to:{name:"UsersShow",params:{id:s.user.id}}}},[t("div",{staticClass:"avatar-name-header"},[s.propertyExists(s.user,"avatar")?t("el-avatar",{attrs:{src:s.user.avatar,size:"large"}}):s._e(),s._v(" "),s.propertyExists(s.user,"nickname")?t("h1",[s._v(s._s(s.user.nickname))]):t("h1",{staticClass:"invalid"},[s._v("("+s._s(s.$t("users.invalidNickname"))+")")])],1)]):s._e(),s._v(" "),s.propertyExists(s.user,"url")?t("a",{attrs:{href:s.user.url,target:"_blank"}},[t("i",{staticClass:"el-icon-top-right",attrs:{title:s.$t("userProfile.openAccountInInstance")}})]):s._e()],1),s._v(" "),t("div",{staticClass:"left-header-container"},[t("moderation-dropdown",{attrs:{user:s.user,page:"statusPage","status-id":s.status.id},on:{"open-reset-token-dialog":s.openResetPasswordDialog}}),s._v(" "),t("reboot-button")],1)]):s._e(),s._v(" "),s.isMobile?t("div",{staticClass:"status-page-header-container"},[t("header",{staticClass:"user-page-header"},[t("div",{staticClass:"avatar-name-container"},[s.propertyExists(s.user,"avatar")?t("el-avatar",{attrs:{src:s.user.avatar,size:"large"}}):s._e(),s._v(" "),s.propertyExists(s.user,"nickname")?t("h1",[s._v(s._s(s.user.nickname))]):s._e()],1),s._v(" "),t("reboot-button")],1),s._v(" "),t("moderation-dropdown",{attrs:{user:s.user,page:"userPage"},on:{"open-reset-token-dialog":s.openResetPasswordDialog}})],1):s._e(),s._v(" "),t("reset-password-dialog",{attrs:{"reset-password-dialog-open":s.resetPasswordDialogOpen},on:{"close-reset-token-dialog":s.closeResetPasswordDialog}}),s._v(" "),t("div",{staticClass:"status-container"},[t("status",{attrs:{status:s.status,account:s.user,"show-checkbox":!1,godmode:s.showPrivate}})],1),s._v(" "),t("div",{staticClass:"recent-statuses-container-show"},[s.propertyExists(s.user,"nickname")?t("h2",{staticClass:"recent-statuses"},[s._v("\n "+s._s(s.$t("userProfile.recentStatuses"))+" by "+s._s(s.user.nickname)+"\n ")]):t("h2",{staticClass:"recent-statuses"},[s._v(s._s(s.$t("userProfile.recentStatuses")))]),s._v(" "),t("el-checkbox",{staticClass:"show-private-statuses",on:{change:s.onTogglePrivate},model:{value:s.showPrivate,callback:function(e){s.showPrivate=e},expression:"showPrivate"}},[s._v("\n "+s._s(s.$t("statuses.showPrivateStatuses"))+"\n ")]),s._v(" "),s.statusesLoading?s._e():t("el-timeline",{staticClass:"statuses"},[s._l(s.statuses,function(e){return t("el-timeline-item",{key:e.id},[t("status",{attrs:{status:e,account:e.account,"show-checkbox":!1,"user-id":s.user.id,godmode:s.showPrivate}})],1)}),s._v(" "),0===s.statuses.length?t("p",{staticClass:"no-statuses"},[s._v(s._s(s.$t("userProfile.noStatuses")))]):s._e()],2)],1)],1)},[],!1,null,null,null);d.options.__file="show.vue";e.default=d.exports},tPM3:function(s,e,t){"use strict";var a={name:"ModerationDropdown",props:{user:{type:Object,default:function(){return{}}},page:{type:String,default:"users"},statusId:{type:String,default:""}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{getPasswordResetToken:function(s){this.$emit("open-reset-token-dialog"),this.$store.dispatch("GetPasswordResetToken",s)},handleConfirmationResend:function(s){this.$store.dispatch("ResendConfirmationEmail",[s])},handleDeletion:function(s){this.$store.dispatch("DeleteUsers",{users:[s],_userId:s.id})},handleEmailConfirmation:function(s){this.$store.dispatch("ConfirmUsersEmail",{users:[s],_userId:s.id,_statusId:this.statusId})},requirePasswordReset:function(s){this.$store.state.user.nodeInfo.metadata.mailerEnabled?this.$store.dispatch("RequirePasswordReset",[s]):this.$alert(this.$t("users.mailerMustBeEnabled"),"Error",{type:"error"})},showAdminAction:function(s){var e=s.local,t=s.id;return e&&this.showDeactivatedButton(t)},showDeactivatedButton:function(s){return this.$store.state.user.id!==s},toggleActivation:function(s){s.deactivated?this.$store.dispatch("ActivateUsers",{users:[s],_userId:s.id}):this.$store.dispatch("DeactivateUsers",{users:[s],_userId:s.id})},toggleTag:function(s,e){s.tags.includes(e)?this.$store.dispatch("RemoveTag",{users:[s],tag:e,_userId:s.id,_statusId:this.statusId}):this.$store.dispatch("AddTag",{users:[s],tag:e,_userId:s.id,_statusId:this.statusId})},toggleUserRight:function(s,e){s.roles[e]?this.$store.dispatch("DeleteRight",{users:[s],right:e,_userId:s.id,_statusId:this.statusId}):this.$store.dispatch("AddRight",{users:[s],right:e,_userId:s.id,_statusId:this.statusId})}}},r=(t("53Av"),t("KHd+")),n=Object(r.a)(a,function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("el-dropdown",{attrs:{"hide-on-click":!1,size:"small",trigger:"click",placement:"top-start"},nativeOn:{click:function(s){s.stopPropagation()}}},[t("div",["users"===s.page?t("el-button",{staticClass:"el-dropdown-link",attrs:{type:"text"}},[s._v("\n "+s._s(s.$t("users.moderation"))+"\n "),s.isDesktop?t("i",{staticClass:"el-icon-arrow-down el-icon--right"}):s._e()]):s._e(),s._v(" "),"userPage"===s.page||"statusPage"===s.page?t("el-button",{staticClass:"moderate-user-button"},[t("span",{staticClass:"moderate-user-button-container"},[t("span",[t("i",{staticClass:"el-icon-edit"}),s._v("\n "+s._s(s.$t("users.moderateUser"))+"\n ")]),s._v(" "),t("i",{staticClass:"el-icon-arrow-down el-icon--right"})])]):s._e()],1),s._v(" "),t("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[s.showAdminAction(s.user)?t("el-dropdown-item",{nativeOn:{click:function(e){return s.toggleUserRight(s.user,"admin")}}},[s._v("\n "+s._s(s.user.roles.admin?s.$t("users.revokeAdmin"):s.$t("users.grantAdmin"))+"\n ")]):s._e(),s._v(" "),s.showAdminAction(s.user)?t("el-dropdown-item",{nativeOn:{click:function(e){return s.toggleUserRight(s.user,"moderator")}}},[s._v("\n "+s._s(s.user.roles.moderator?s.$t("users.revokeModerator"):s.$t("users.grantModerator"))+"\n ")]):s._e(),s._v(" "),s.showDeactivatedButton(s.user.id)&&"statusPage"!==s.page?t("el-dropdown-item",{attrs:{divided:s.showAdminAction(s.user)},nativeOn:{click:function(e){return s.toggleActivation(s.user)}}},[s._v("\n "+s._s(s.user.deactivated?s.$t("users.activateAccount"):s.$t("users.deactivateAccount"))+"\n ")]):s._e(),s._v(" "),s.showDeactivatedButton(s.user.id)&&"statusPage"!==s.page?t("el-dropdown-item",{nativeOn:{click:function(e){return s.handleDeletion(s.user)}}},[s._v("\n "+s._s(s.$t("users.deleteAccount"))+"\n ")]):s._e(),s._v(" "),s.user.local&&s.user.confirmation_pending?t("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return s.handleEmailConfirmation(s.user)}}},[s._v("\n "+s._s(s.$t("users.confirmAccount"))+"\n ")]):s._e(),s._v(" "),s.user.local&&s.user.confirmation_pending?t("el-dropdown-item",{nativeOn:{click:function(e){return s.handleConfirmationResend(s.user)}}},[s._v("\n "+s._s(s.$t("users.resendConfirmation"))+"\n ")]):s._e(),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("force_nsfw")},attrs:{divided:s.showAdminAction(s.user)},nativeOn:{click:function(e){return s.toggleTag(s.user,"force_nsfw")}}},[s._v("\n "+s._s(s.$t("users.forceNsfw"))+"\n "),s.user.tags.includes("force_nsfw")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("strip_media")},nativeOn:{click:function(e){return s.toggleTag(s.user,"strip_media")}}},[s._v("\n "+s._s(s.$t("users.stripMedia"))+"\n "),s.user.tags.includes("strip_media")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("force_unlisted")},nativeOn:{click:function(e){return s.toggleTag(s.user,"force_unlisted")}}},[s._v("\n "+s._s(s.$t("users.forceUnlisted"))+"\n "),s.user.tags.includes("force_unlisted")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("sandbox")},nativeOn:{click:function(e){return s.toggleTag(s.user,"sandbox")}}},[s._v("\n "+s._s(s.$t("users.sandbox"))+"\n "),s.user.tags.includes("sandbox")?t("i",{staticClass:"el-icon-check"}):s._e()]),s._v(" "),s.user.local?t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("disable_remote_subscription")},nativeOn:{click:function(e){return s.toggleTag(s.user,"disable_remote_subscription")}}},[s._v("\n "+s._s(s.$t("users.disableRemoteSubscription"))+"\n "),s.user.tags.includes("disable_remote_subscription")?t("i",{staticClass:"el-icon-check"}):s._e()]):s._e(),s._v(" "),s.user.local?t("el-dropdown-item",{class:{"active-tag":s.user.tags.includes("disable_any_subscription")},nativeOn:{click:function(e){return s.toggleTag(s.user,"disable_any_subscription")}}},[s._v("\n "+s._s(s.$t("users.disableAnySubscription"))+"\n "),s.user.tags.includes("disable_any_subscription")?t("i",{staticClass:"el-icon-check"}):s._e()]):s._e(),s._v(" "),s.user.local?t("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(e){return s.getPasswordResetToken(s.user.nickname)}}},[s._v("\n "+s._s(s.$t("users.getPasswordResetToken"))+"\n ")]):s._e(),s._v(" "),s.user.local?t("el-dropdown-item",{nativeOn:{click:function(e){return s.requirePasswordReset(s.user)}}},[s._v("\n "+s._s(s.$t("users.requirePasswordReset"))+"\n ")]):s._e()],1)],1)},[],!1,null,null,null);n.options.__file="ModerationDropdown.vue";e.a=n.exports}}]); +//# sourceMappingURL=chunk-7506.a3364e53.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7506.a3364e53.js.map b/priv/static/adminfe/static/js/chunk-7506.a3364e53.js.map new file mode 100644 index 000000000..c8e9db8e0 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-7506.a3364e53.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/users/components/ModerationDropdown.vue?e3f0","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/views/statuses/show.vue?2896","webpack:///./src/views/users/components/ResetPasswordDialog.vue?0b2b","webpack:///./src/views/users/components/ResetPasswordDialog.vue?31da","webpack:///src/views/users/components/ResetPasswordDialog.vue","webpack:///./src/views/users/components/ResetPasswordDialog.vue","webpack:///./src/views/statuses/show.vue?82c4","webpack:///./src/views/statuses/show.vue?6fdf","webpack:///src/views/statuses/show.vue","webpack:///./src/views/statuses/show.vue","webpack:///./src/views/users/components/ModerationDropdown.vue?ff75","webpack:///./src/views/users/components/ModerationDropdown.vue?676e","webpack:///src/views/users/components/ModerationDropdown.vue","webpack:///./src/views/users/components/ModerationDropdown.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ModerationDropdown_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","id","webpackContextResolve","o","e","Error","code","keys","Object","resolve","module","exports","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_show_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","components_ResetPasswordDialogvue_type_script_lang_js_","name","props","resetPasswordDialogOpen","type","Boolean","default","computed","dialogOpen","this","loading","$store","state","users","passwordResetLink","passwordResetToken","link","token","methods","closeResetPasswordDialog","$emit","component","componentNormalizer","_vm","_h","$createElement","_c","_self","directives","rawName","value","expression","attrs","visible","title","$t","custom-class","on","close","staticClass","_v","_s","href","target","options","__file","__webpack_exports__","statuses_showvue_type_script_lang_js_","components","ModerationDropdown","RebootButton","ResetPasswordDialog","Status","data","showPrivate","isDesktop","app","device","isMobile","isTablet","status","fetchedStatus","statuses","userProfile","statusesLoading","user","statusAuthor","beforeMount","dispatch","$route","params","onTogglePrivate","userId","godmode","openResetPasswordDialog","propertyExists","account","property","_e","to","src","avatar","size","nickname","url","page","status-id","open-reset-token-dialog","reset-password-dialog-open","close-reset-token-dialog","show-checkbox","change","model","callback","$$v","_l","key","user-id","length","components_ModerationDropdownvue_type_script_lang_js_","String","statusId","getPasswordResetToken","handleConfirmationResend","handleDeletion","_userId","handleEmailConfirmation","_statusId","requirePasswordReset","nodeInfo","metadata","mailerEnabled","$alert","showAdminAction","_ref","local","showDeactivatedButton","toggleActivation","deactivated","toggleTag","tag","tags","includes","toggleUserRight","right","roles","hide-on-click","trigger","placement","nativeOn","click","$event","stopPropagation","slot","admin","moderator","divided","confirmation_pending","class","active-tag"],"mappings":"wGAAA,IAAAA,EAAAC,EAAA,QAAAA,EAAAC,EAAAF,GAAsf,wBCAtf,IAAAG,GACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,O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","file":"static/js/chunk-7506.a3364e53.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],attrs:{\"visible\":_vm.dialogOpen,\"title\":_vm.$t('users.passwordResetTokenCreated'),\"custom-class\":\"password-reset-token-dialog\"},on:{\"close\":_vm.closeResetPasswordDialog}},[_c('div',[_c('p',{staticClass:\"password-reset-token\"},[_vm._v(_vm._s(_vm.$t('users.passwordResetTokenGenerated'))+\" \"+_vm._s(_vm.passwordResetToken))]),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('users.linkToResetPassword'))+\"\\n \"),_c('a',{staticClass:\"reset-password-link\",attrs:{\"href\":_vm.passwordResetLink,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.passwordResetLink))])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResetPasswordDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ResetPasswordDialog.vue?vue&type=script&lang=js&\"","\n\n\n\n","import { render, staticRenderFns } from \"./ResetPasswordDialog.vue?vue&type=template&id=e7d3eed4&\"\nimport script from \"./ResetPasswordDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./ResetPasswordDialog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ResetPasswordDialog.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"status-show-container\"},[(_vm.isDesktop || _vm.isTablet)?_c('header',{staticClass:\"user-page-header\"},[_c('div',{staticClass:\"avatar-name-container\"},[(_vm.propertyExists(_vm.user, 'id'))?_c('router-link',{staticClass:\"router-link\",attrs:{\"to\":{ name: 'UsersShow', params: { id: _vm.user.id }}}},[_c('div',{staticClass:\"avatar-name-header\"},[(_vm.propertyExists(_vm.user, 'avatar'))?_c('el-avatar',{attrs:{\"src\":_vm.user.avatar,\"size\":\"large\"}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'nickname'))?_c('h1',[_vm._v(_vm._s(_vm.user.nickname))]):_c('h1',{staticClass:\"invalid\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")])],1)]):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'url'))?_c('a',{attrs:{\"href\":_vm.user.url,\"target\":\"_blank\"}},[_c('i',{staticClass:\"el-icon-top-right\",attrs:{\"title\":_vm.$t('userProfile.openAccountInInstance')}})]):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"left-header-container\"},[_c('moderation-dropdown',{attrs:{\"user\":_vm.user,\"page\":'statusPage',\"status-id\":_vm.status.id},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}}),_vm._v(\" \"),_c('reboot-button')],1)]):_vm._e(),_vm._v(\" \"),(_vm.isMobile)?_c('div',{staticClass:\"status-page-header-container\"},[_c('header',{staticClass:\"user-page-header\"},[_c('div',{staticClass:\"avatar-name-container\"},[(_vm.propertyExists(_vm.user, 'avatar'))?_c('el-avatar',{attrs:{\"src\":_vm.user.avatar,\"size\":\"large\"}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.user, 'nickname'))?_c('h1',[_vm._v(_vm._s(_vm.user.nickname))]):_vm._e()],1),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('moderation-dropdown',{attrs:{\"user\":_vm.user,\"page\":'userPage'},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}})],1):_vm._e(),_vm._v(\" \"),_c('reset-password-dialog',{attrs:{\"reset-password-dialog-open\":_vm.resetPasswordDialogOpen},on:{\"close-reset-token-dialog\":_vm.closeResetPasswordDialog}}),_vm._v(\" \"),_c('div',{staticClass:\"status-container\"},[_c('status',{attrs:{\"status\":_vm.status,\"account\":_vm.user,\"show-checkbox\":false,\"godmode\":_vm.showPrivate}})],1),_vm._v(\" \"),_c('div',{staticClass:\"recent-statuses-container-show\"},[(_vm.propertyExists(_vm.user, 'nickname'))?_c('h2',{staticClass:\"recent-statuses\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.recentStatuses'))+\" by \"+_vm._s(_vm.user.nickname)+\"\\n \")]):_c('h2',{staticClass:\"recent-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.recentStatuses')))]),_vm._v(\" \"),_c('el-checkbox',{staticClass:\"show-private-statuses\",on:{\"change\":_vm.onTogglePrivate},model:{value:(_vm.showPrivate),callback:function ($$v) {_vm.showPrivate=$$v},expression:\"showPrivate\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.showPrivateStatuses'))+\"\\n \")]),_vm._v(\" \"),(!_vm.statusesLoading)?_c('el-timeline',{staticClass:\"statuses\"},[_vm._l((_vm.statuses),function(status){return _c('el-timeline-item',{key:status.id},[_c('status',{attrs:{\"status\":status,\"account\":status.account,\"show-checkbox\":false,\"user-id\":_vm.user.id,\"godmode\":_vm.showPrivate}})],1)}),_vm._v(\" \"),(_vm.statuses.length === 0)?_c('p',{staticClass:\"no-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.noStatuses')))]):_vm._e()],2):_vm._e()],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./show.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./show.vue?vue&type=template&id=30447ae0&\"\nimport script from \"./show.vue?vue&type=script&lang=js&\"\nexport * from \"./show.vue?vue&type=script&lang=js&\"\nimport style0 from \"./show.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"show.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"hide-on-click\":false,\"size\":\"small\",\"trigger\":\"click\",\"placement\":\"top-start\"},nativeOn:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',[(_vm.page === 'users')?_c('el-button',{staticClass:\"el-dropdown-link\",attrs:{\"type\":\"text\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderation'))+\"\\n \"),(_vm.isDesktop)?_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.page === 'userPage' || _vm.page === 'statusPage')?_c('el-button',{staticClass:\"moderate-user-button\"},[_c('span',{staticClass:\"moderate-user-button-container\"},[_c('span',[_c('i',{staticClass:\"el-icon-edit\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderateUser'))+\"\\n \")]),_vm._v(\" \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})])]):_vm._e()],1),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.admin ? _vm.$t('users.revokeAdmin') : _vm.$t('users.grantAdmin'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.moderator ? _vm.$t('users.revokeModerator') : _vm.$t('users.grantModerator'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id) && _vm.page !== 'statusPage')?_c('el-dropdown-item',{attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleActivation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.deactivated ? _vm.$t('users.activateAccount') : _vm.$t('users.deactivateAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id) && _vm.page !== 'statusPage')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeletion(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.handleEmailConfirmation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.confirmAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleConfirmationResend(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.resendConfirmation'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_nsfw') },attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceNsfw'))+\"\\n \"),(_vm.user.tags.includes('force_nsfw'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('strip_media') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.stripMedia'))+\"\\n \"),(_vm.user.tags.includes('strip_media'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_unlisted') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceUnlisted'))+\"\\n \"),(_vm.user.tags.includes('force_unlisted'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('sandbox') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.sandbox'))+\"\\n \"),(_vm.user.tags.includes('sandbox'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_remote_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableRemoteSubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_remote_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_any_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableAnySubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_any_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.getPasswordResetToken(_vm.user.nickname)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.getPasswordResetToken'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.requirePasswordReset(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.requirePasswordReset'))+\"\\n \")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ModerationDropdown.vue?vue&type=template&id=25dd4f14&\"\nimport script from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ModerationDropdown.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js b/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js deleted file mode 100644 index b38644b98..000000000 --- a/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-7637"],{"/dtF":function(t,e,s){"use strict";var n=s("qxvU");s.n(n).a},"9/5/":function(t,e,s){(function(e){var s="Expected a function",n=NaN,r="[object Symbol]",a=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,c=/^0o[0-7]+$/i,l=parseInt,u="object"==typeof e&&e&&e.Object===Object&&e,j="object"==typeof self&&self&&self.Object===Object&&self,d=u||j||Function("return this")(),h=Object.prototype.toString,p=Math.max,f=Math.min,m=function(){return d.Date.now()};function g(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function v(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&h.call(t)==r}(t))return n;if(g(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=g(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(a,"");var s=i.test(t);return s||c.test(t)?l(t.slice(2),s?2:8):o.test(t)?n:+t}t.exports=function(t,e,n){var r,a,o,i,c,l,u=0,j=!1,d=!1,h=!0;if("function"!=typeof t)throw new TypeError(s);function b(e){var s=r,n=a;return r=a=void 0,u=e,i=t.apply(n,s)}function y(t){var s=t-l;return void 0===l||s>=e||s<0||d&&t-u>=o}function k(){var t=m();if(y(t))return x(t);c=setTimeout(k,function(t){var s=e-(t-l);return d?f(s,o-(t-u)):s}(t))}function x(t){return c=void 0,h&&r?b(t):(r=a=void 0,i)}function z(){var t=m(),s=y(t);if(r=arguments,a=this,l=t,s){if(void 0===c)return function(t){return u=t,c=setTimeout(k,e),j?b(t):i}(l);if(d)return c=setTimeout(k,e),b(l)}return void 0===c&&(c=setTimeout(k,e)),i}return e=v(e)||0,g(n)&&(j=!!n.leading,o=(d="maxWait"in n)?p(v(n.maxWait)||0,e):o,h="trailing"in n?!!n.trailing:h),z.cancel=function(){void 0!==c&&clearTimeout(c),u=0,r=l=a=c=void 0},z.flush=function(){return void 0===c?i:x(m())},z}}).call(this,s("yLpj"))},CmY0:function(t,e,s){"use strict";s.r(e);var n=s("wd/R"),r=s.n(n),a=s("LvDl"),o=s.n(a),i=s("9/5/"),c=s.n(i),l={components:{RebootButton:s("rIUS").a},data:function(){return{dateRange:"",search:"",user:"",currentPage:1}},computed:{isMobile:function(){return"mobile"===this.$store.state.app.device},loading:function(){return this.$store.state.moderationLog.logLoading&&this.$store.state.moderationLog.adminsLoading},log:function(){return this.$store.state.moderationLog.fetchedLog},total:function(){return this.$store.state.moderationLog.logItemsCount},users:function(){return[{label:"Admins",options:this.$store.state.moderationLog.admins.users},{label:"Moderators",options:this.$store.state.moderationLog.moderators.users}]}},created:function(){var t=this;this.handleDebounceSearchInput=c()(function(e){t.fetchLogWithFilters()},500)},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchModerationLog"),this.$store.dispatch("FetchAdmins")},methods:{normalizeTimestamp:function(t){return r()(1e3*t).format("YYYY-MM-DD HH:mm")},fetchLogWithFilters:function(){var t=o.a.omitBy({start_date:this.dateRange?this.dateRange[0].toISOString():null,end_date:this.dateRange?this.dateRange[1].toISOString():null,user_id:this.user,search:this.search,page:this.currentPage},function(t){return""===t||null===t});this.$store.dispatch("FetchModerationLog",t)}}},u=(s("/dtF"),s("KHd+")),j=Object(u.a)(l,function(){var t=this,e=t.$createElement,s=t._self._c||e;return t.loading?t._e():s("div",{staticClass:"moderation-log-container"},[s("div",{staticClass:"moderation-log-header-container"},[s("h1",[t._v(t._s(t.$t("moderationLog.moderationLog")))]),t._v(" "),s("reboot-button")],1),t._v(" "),s("div",{staticClass:"moderation-log-nav-container"},[s("el-select",{staticClass:"moderation-log-user-select",attrs:{clearable:"",placeholder:"Filter by admin/moderator"},on:{change:t.fetchLogWithFilters},model:{value:t.user,callback:function(e){t.user=e},expression:"user"}},t._l(t.users,function(e){return s("el-option-group",{key:e.label,attrs:{label:e.label}},t._l(e.options,function(t){return s("el-option",{key:t.id,attrs:{label:t.nickname,value:t.id}})}),1)}),1),t._v(" "),s("el-input",{staticClass:"moderation-log-search",attrs:{placeholder:"Search logs",clearable:""},on:{input:t.handleDebounceSearchInput},model:{value:t.search,callback:function(e){t.search=e},expression:"search"}})],1),t._v(" "),s("el-date-picker",{staticClass:"moderation-log-date-panel",attrs:{"default-time":["00:00:00","23:59:59"],type:"daterange","start-placeholder":"Start date","end-placeholder":"End date","unlink-panels":""},on:{change:t.fetchLogWithFilters},model:{value:t.dateRange,callback:function(e){t.dateRange=e},expression:"dateRange"}}),t._v(" "),s("el-timeline",t._l(t.log,function(e,n){return s("el-timeline-item",{key:n,attrs:{timestamp:t.normalizeTimestamp(e.time)}},[t._v("\n "+t._s(e.message)+"\n ")])}),1),t._v(" "),s("div",{staticClass:"pagination"},[s("el-pagination",{attrs:{"current-page":t.currentPage,"hide-on-single-page":!0,"page-size":50,total:t.total,small:t.isMobile,layout:"prev, pager, next"},on:{"update:currentPage":function(e){t.currentPage=e},"update:current-page":function(e){t.currentPage=e},"current-change":t.fetchLogWithFilters}})],1)],1)},[],!1,null,"103bba83",null);j.options.__file="index.vue";e.default=j.exports},RnhZ:function(t,e,s){var n={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function r(t){var e=a(t);return s(e)}function a(t){if(!s.o(n,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return n[t]}r.keys=function(){return Object.keys(n)},r.resolve=a,t.exports=r,r.id="RnhZ"},qxvU:function(t,e,s){},rIUS:function(t,e,s){"use strict";var n=s("o0o1"),r=s.n(n),a=s("yXPU"),o=s.n(a),i=s("mSNy"),c={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var t=o()(r.a.mark(function t(){return r.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("RestartApplication");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:i.a.t("settings.restartSuccess")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},l=s("KHd+"),u=Object(l.a)(c,function(){var t=this.$createElement,e=this._self._c||t;return this.needReboot?e("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[e("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[e("span",[e("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);u.options.__file="index.vue";e.a=u.exports}}]); -//# sourceMappingURL=chunk-7637.8f5fb36e.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map b/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map deleted file mode 100644 index ddd53f1cd..000000000 --- a/priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/moderation_log/index.vue?2234","webpack:///./node_modules/lodash.debounce/index.js","webpack:///./src/views/moderation_log/index.vue?478d","webpack:///./src/views/moderation_log/index.vue?bce9","webpack:///src/views/moderation_log/index.vue","webpack:///./src/views/moderation_log/index.vue","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_103bba83_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","global","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","Object","freeSelf","self","root","Function","objectToString","prototype","toString","nativeMax","Math","max","nativeMin","min","now","Date","isObject","value","type","toNumber","isObjectLike","call","isSymbol","other","valueOf","replace","isBinary","test","slice","module","exports","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","undefined","apply","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","remainingWait","debounced","isInvoking","arguments","this","leadingEdge","cancel","clearTimeout","flush","views_moderation_logvue_type_script_lang_js_","components","RebootButton","data","dateRange","search","user","currentPage","computed","isMobile","$store","state","app","device","loading","moderationLog","logLoading","adminsLoading","log","fetchedLog","total","logItemsCount","users","label","admins","moderators","created","_this","handleDebounceSearchInput","lodash_debounce_default","query","fetchLogWithFilters","mounted","dispatch","methods","normalizeTimestamp","timestamp","moment_default","format","filters","lodash_default","a","omitBy","start_date","toISOString","end_date","user_id","page","val","component","componentNormalizer","_vm","_h","$createElement","_c","_self","_e","staticClass","_v","_s","$t","attrs","clearable","placeholder","on","change","model","callback","$$v","expression","_l","group","key","item","id","nickname","input","default-time","start-placeholder","end-placeholder","unlink-panels","logEntry","index","message","current-page","hide-on-single-page","page-size","small","layout","update:currentPage","$event","update:current-page","current-change","__file","__webpack_exports__","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","resolve","components_RebootButtonvue_type_script_lang_js_","name","needReboot","restartApp","_restartApp","asyncToGenerator_default","regenerator_default","mark","_callee","wrap","_context","prev","next","t0","abrupt","$message","lang","t","stop","content","placement","click"],"mappings":"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A,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,QAAA,OACAC,WAAA,OACAC,OAAA,OACAC,UAAA,OACAC,QAAA,OACAC,WAAA,OACAC,QAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,WAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,YAAA,OACAC,eAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,QAIA,SAAAC,EAAAC,GACA,IAAArR,EAAAsR,EAAAD,GACA,OAAA5a,EAAAuJ,GAEA,SAAAsR,EAAAD,GACA,IAAA5a,EAAA8a,EAAAlQ,EAAAgQ,GAAA,CACA,IAAAG,EAAA,IAAAC,MAAA,uBAAAJ,EAAA,KAEA,MADAG,EAAAE,KAAA,mBACAF,EAEA,OAAAnQ,EAAAgQ,GAEAD,EAAAO,KAAA,WACA,OAAAra,OAAAqa,KAAAtQ,IAEA+P,EAAAQ,QAAAN,EACApY,EAAAC,QAAAiY,EACAA,EAAApR,GAAA,iECnRA,0DCA0M6R,GCe1MC,KAAA,eACAhW,UACAiW,WADA,WAEA,OAAA9W,KAAAe,OAAAC,MAAAC,IAAA6V,aAGAvU,SACAwU,WADA,eAAAC,EAAAC,IAAAC,EAAApU,EAAAqU,KAAA,SAAAC,IAAA,OAAAF,EAAApU,EAAAuU,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAAAF,EAAAC,KAAA,EAAAD,EAAAE,KAAA,EAGAxX,KAAAe,OAAAuB,SAAA,sBAHA,OAAAgV,EAAAE,KAAA,sBAAAF,EAAAC,KAAA,EAAAD,EAAAG,GAAAH,EAAA,SAAAA,EAAAI,OAAA,iBAOA1X,KAAA2X,UACAra,KAAA,UACAkI,QAAAoS,EAAA,EAAAC,EAAA,6BATA,wBAAAP,EAAAQ,SAAAV,EAAApX,OAAA,mCAAAgX,EAAA1X,MAAAU,KAAAD,YAAA,iBCdAuD,EAAgBjH,OAAAkH,EAAA,EAAAlH,CACdua,EHRF,WAA0B,IAAanT,EAAbzD,KAAa0D,eAA0BC,EAAvC3D,KAAuC4D,MAAAD,IAAAF,EAAwB,OAA/DzD,KAA+D,WAAA2D,EAAA,cAAyCO,OAAO6T,QAA/G/X,KAA+GiE,GAAA,uBAAA+T,UAAA,gBAAkErU,EAAA,aAAkBG,YAAA,gBAAAI,OAAmC5G,KAAA,WAAiB+G,IAAK4T,MAA5PjY,KAA4P+W,cAAwBpT,EAAA,QAAAA,EAAA,KAAqBG,YAAA,oBAAzS9D,KAAuU+D,GAAA,WAAvU/D,KAAuUgE,GAAvUhE,KAAuUiE,GAAA,8CAAvUjE,KAAuU6D,UGWjW,EACA,KACA,KACA,MAIAP,EAAAjF,QAAA6H,OAAA,YACeC,EAAA,EAAA7C","file":"static/js/chunk-7637.8f5fb36e.js","sourcesContent":["import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=103bba83&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=103bba83&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loading)?_c('div',{staticClass:\"moderation-log-container\"},[_c('div',{staticClass:\"moderation-log-header-container\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('moderationLog.moderationLog')))]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"moderation-log-nav-container\"},[_c('el-select',{staticClass:\"moderation-log-user-select\",attrs:{\"clearable\":\"\",\"placeholder\":\"Filter by admin/moderator\"},on:{\"change\":_vm.fetchLogWithFilters},model:{value:(_vm.user),callback:function ($$v) {_vm.user=$$v},expression:\"user\"}},_vm._l((_vm.users),function(group){return _c('el-option-group',{key:group.label,attrs:{\"label\":group.label}},_vm._l((group.options),function(item){return _c('el-option',{key:item.id,attrs:{\"label\":item.nickname,\"value\":item.id}})}),1)}),1),_vm._v(\" \"),_c('el-input',{staticClass:\"moderation-log-search\",attrs:{\"placeholder\":\"Search logs\",\"clearable\":\"\"},on:{\"input\":_vm.handleDebounceSearchInput},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1),_vm._v(\" \"),_c('el-date-picker',{staticClass:\"moderation-log-date-panel\",attrs:{\"default-time\":['00:00:00', '23:59:59'],\"type\":\"daterange\",\"start-placeholder\":\"Start date\",\"end-placeholder\":\"End date\",\"unlink-panels\":\"\"},on:{\"change\":_vm.fetchLogWithFilters},model:{value:(_vm.dateRange),callback:function ($$v) {_vm.dateRange=$$v},expression:\"dateRange\"}}),_vm._v(\" \"),_c('el-timeline',_vm._l((_vm.log),function(logEntry,index){return _c('el-timeline-item',{key:index,attrs:{\"timestamp\":_vm.normalizeTimestamp(logEntry.time)}},[_vm._v(\"\\n \"+_vm._s(logEntry.message)+\"\\n \")])}),1),_vm._v(\" \"),_c('div',{staticClass:\"pagination\"},[_c('el-pagination',{attrs:{\"current-page\":_vm.currentPage,\"hide-on-single-page\":true,\"page-size\":50,\"total\":_vm.total,\"small\":_vm.isMobile,\"layout\":\"prev, pager, next\"},on:{\"update:currentPage\":function($event){_vm.currentPage=$event},\"update:current-page\":function($event){_vm.currentPage=$event},\"current-change\":_vm.fetchLogWithFilters}})],1)],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=103bba83&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=103bba83&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"103bba83\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-0778.b17650df.js b/priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js similarity index 83% rename from priv/static/adminfe/static/js/chunk-0778.b17650df.js rename to priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js index 1a174cc1e..27478ddb1 100644 --- a/priv/static/adminfe/static/js/chunk-0778.b17650df.js +++ b/priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js @@ -1,2 +1,2 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-0778"],{HMof:function(e,t,i){"use strict";i.r(t);var n=i("o0o1"),s=i.n(n),a=i("yXPU"),o=i.n(a),r=i("MVZn"),l=i.n(r),c=i("rIUS"),v=i("L2JU"),u=i("9i3r"),m={components:{RebootButton:c.a},data:function(){return{rules:{email:[{validator:this.validateEmail,trigger:"blur"}]},newTokenForm:{maxUse:1,expiresAt:""},inviteUserForm:{email:"",name:""},createTokenDialogVisible:!1,inviteUserDialogVisible:!1}},computed:l()({},Object(v.b)(["authHost"]),{getLabelWidth:function(){return this.isDesktop?"100px":"80px"},inviteLink:function(){return"".concat(Object(u.a)(this.authHost),"/registration/").concat(this.newToken.token)},isDesktop:function(){return"desktop"===this.$store.state.app.device},loading:function(){return this.$store.state.invites.loading},newToken:function(){return this.$store.state.invites.newToken},tokens:function(){return this.$store.state.invites.inviteTokens}}),mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchInviteTokens")},methods:{closeDialogWindow:function(){this.inviteUserDialogVisible=!1,this.createTokenDialogVisible=!1,this.$store.dispatch("RemoveNewToken"),this.$data.inviteUserForm.email="",this.$data.inviteUserForm.name=""},createToken:function(){this.$store.dispatch("GenerateInviteToken",this.$data.newTokenForm)},inviteUserViaEmail:function(){var e=o()(s.a.mark(function e(){var t=this;return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:this.$refs.inviteUserForm.validate(function(){var e=o()(s.a.mark(function e(i){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!i){e.next=6;break}return e.next=3,t.$store.dispatch("InviteUserViaEmail",t.$data.inviteUserForm);case 3:t.closeDialogWindow(),e.next=8;break;case 6:return t.$message({type:"error",message:t.$t("invites.submitFormError")}),e.abrupt("return",!1);case 8:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}());case 1:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}(),revokeInviteToken:function(e){this.$store.dispatch("RevokeToken",e)},validateEmail:function(e,t,i){return""===t?i(new Error(this.$t("invites.emptyEmailError"))):this.validEmail(t)?i():i(new Error(this.$t("invites.invalidEmailError")))},validEmail:function(e){return/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(e)}}},p=(i("ObxI"),i("KHd+")),d=Object(p.a)(m,function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"invites-container"},[i("div",{staticClass:"invites-header-container"},[i("h1",[e._v(e._s(e.$t("invites.inviteTokens")))]),e._v(" "),i("reboot-button")],1),e._v(" "),i("div",{staticClass:"actions-container"},[i("el-button",{staticClass:"create-invite-token",on:{click:function(t){e.createTokenDialogVisible=!0}}},[i("span",[i("i",{staticClass:"icon el-icon-plus"}),e._v("\n "+e._s(e.$t("invites.createInviteToken"))+"\n ")])]),e._v(" "),i("el-button",{staticClass:"invite-via-email",on:{click:function(t){e.inviteUserDialogVisible=!0}}},[i("span",[i("i",{staticClass:"icon el-icon-message"}),e._v("\n "+e._s(e.$t("invites.inviteUserViaEmail"))+"\n ")])])],1),e._v(" "),i("el-dialog",{attrs:{visible:e.createTokenDialogVisible,"show-close":!1,title:e.$t("invites.createInviteToken"),"custom-class":"create-new-token-dialog"},on:{"update:visible":function(t){e.createTokenDialogVisible=t}}},[i("el-form",{ref:"newTokenForm",attrs:{model:e.newTokenForm,"label-width":e.getLabelWidth,"status-icon":""}},[i("el-form-item",{attrs:{label:e.$t("invites.maxUse")}},[i("el-input-number",{attrs:{min:0,size:e.isDesktop?"medium":"small",name:"maxUse"},model:{value:e.newTokenForm.maxUse,callback:function(t){e.$set(e.newTokenForm,"maxUse",t)},expression:"newTokenForm.maxUse"}})],1),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.expiresAt")}},[i("el-date-picker",{staticClass:"pick-date",attrs:{placeholder:e.$t("invites.pickDate"),type:"date",name:"date","value-format":"yyyy-MM-dd"},model:{value:e.newTokenForm.expiresAt,callback:function(t){e.$set(e.newTokenForm,"expiresAt",t)},expression:"newTokenForm.expiresAt"}})],1)],1),e._v(" "),i("span",{attrs:{slot:"footer"},slot:"footer"},[i("el-button",{staticClass:"invites-close-dialog",on:{click:e.closeDialogWindow}},[e._v(e._s(e.$t("invites.cancel")))]),e._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:e.createToken}},[e._v(e._s(e.$t("invites.create")))])],1),e._v(" "),"token"in e.newToken?i("el-card",[i("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[i("span",[e._v(e._s(e.$t("invites.tokenCreated")))])]),e._v(" "),i("el-form",{staticClass:"new-token-card",attrs:{"label-width":"80px"}},[i("el-form-item",{attrs:{label:e.$t("invites.inviteLink")}},[i("el-link",{attrs:{href:e.inviteLink,underline:!1,target:"_blank"}},[e._v("\n "+e._s(e.inviteLink)+"\n ")])],1),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.token")}},[e._v("\n "+e._s(e.newToken.token)+"\n ")]),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.maxUse")}},[e._v("\n "+e._s(e.newToken.maxUse)+"\n ")]),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.expiresAt")}},[e._v("\n "+e._s(e.newToken.expiresAt||"(not set)")+"\n ")])],1)],1):e._e()],1),e._v(" "),i("el-dialog",{attrs:{visible:e.inviteUserDialogVisible,"show-close":!1,title:e.$t("invites.sendRegistration"),"custom-class":"invite-via-email-dialog"},on:{"update:visible":function(t){e.inviteUserDialogVisible=t}}},[i("div",[i("p",{staticClass:"info"},[e._v(e._s(e.$t("invites.inviteViaEmailAlert")))]),e._v(" "),i("el-form",{ref:"inviteUserForm",attrs:{model:e.inviteUserForm,rules:e.rules,"label-width":e.getLabelWidth,"status-icon":""}},[i("el-form-item",{attrs:{label:e.$t("invites.email"),prop:"email"}},[i("el-input",{attrs:{name:"email",type:"email",autofocus:""},model:{value:e.inviteUserForm.email,callback:function(t){e.$set(e.inviteUserForm,"email",t)},expression:"inviteUserForm.email"}})],1),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.name"),prop:"name"}},[i("el-input",{attrs:{name:"name"},model:{value:e.inviteUserForm.name,callback:function(t){e.$set(e.inviteUserForm,"name",t)},expression:"inviteUserForm.name"}})],1)],1)],1),e._v(" "),i("span",{attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:e.closeDialogWindow}},[e._v(e._s(e.$t("invites.cancel")))]),e._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:e.inviteUserViaEmail}},[e._v(e._s(e.$t("invites.create")))])],1)]),e._v(" "),i("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticClass:"invite-token-table",attrs:{data:e.tokens,"default-sort":{prop:"used",order:"ascending"}}},[e.isDesktop?i("el-table-column",{attrs:{label:e.$t("invites.id"),"min-width":"60",prop:"id",sortable:""}}):e._e(),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.token"),"min-width":e.isDesktop?320:120,prop:"token"}}),e._v(" "),e.isDesktop?i("el-table-column",{attrs:{label:e.$t("invites.expiresAt"),align:"center","header-align":"center","min-width":"110",prop:"expires_at",sortable:""}}):e._e(),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.maxUse"),align:"center","header-align":"center","min-width":"60",prop:"max_use",sortable:""}}),e._v(" "),e.isDesktop?i("el-table-column",{attrs:{label:e.$t("invites.uses"),align:"center","header-align":"center","min-width":"60",prop:"uses"}}):e._e(),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.used"),"min-width":e.isDesktop?60:50,align:"center","header-align":"center",prop:"used",sortable:""},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-tag",{attrs:{type:t.row.used?"danger":"success","disable-transitions":""}},[e._v("\n "+e._s(t.row.used?e.$t("invites.used"):e.$t("invites.active"))+"\n ")])]}}])}),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.actions"),"min-width":e.isDesktop?100:50,align:"center","header-align":"center"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-button",{attrs:{type:"text",size:"small"},nativeOn:{click:function(i){return e.revokeInviteToken(t.row.token)}}},[e._v("\n "+e._s(e.$t("invites.revoke"))+"\n ")])]}}])})],1)],1)},[],!1,null,null,null);d.options.__file="index.vue";t.default=d.exports},ObxI:function(e,t,i){"use strict";var n=i("Tykb");i.n(n).a},Tykb:function(e,t,i){},rIUS:function(e,t,i){"use strict";var n=i("o0o1"),s=i.n(n),a=i("yXPU"),o=i.n(a),r=i("mSNy"),l={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var e=o()(s.a.mark(function e(){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this.$store.dispatch("RestartApplication");case 3:e.next=8;break;case 5:return e.prev=5,e.t0=e.catch(0),e.abrupt("return");case 8:this.$message({type:"success",message:r.a.t("settings.restartSuccess")});case 9:case"end":return e.stop()}},e,this,[[0,5]])}));return function(){return e.apply(this,arguments)}}()}},c=i("KHd+"),v=Object(c.a)(l,function(){var e=this.$createElement,t=this._self._c||e;return this.needReboot?t("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[t("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[t("span",[t("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);v.options.__file="index.vue";t.a=v.exports}}]); -//# sourceMappingURL=chunk-0778.b17650df.js.map \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-7c6b"],{HMof:function(e,t,i){"use strict";i.r(t);var n=i("o0o1"),s=i.n(n),a=i("yXPU"),o=i.n(a),r=i("MVZn"),l=i.n(r),c=i("rIUS"),v=i("L2JU"),m=i("9i3r"),u={components:{RebootButton:c.a},data:function(){return{rules:{email:[{validator:this.validateEmail,trigger:"blur"}]},newTokenForm:{maxUse:1,expiresAt:""},inviteUserForm:{email:"",name:""},createTokenDialogVisible:!1,inviteUserDialogVisible:!1}},computed:l()({},Object(v.b)(["authHost"]),{getLabelWidth:function(){return this.isDesktop?"100px":"80px"},inviteLink:function(){return"".concat(Object(m.a)(this.authHost),"/registration/").concat(this.newToken.token)},isDesktop:function(){return"desktop"===this.$store.state.app.device},loading:function(){return this.$store.state.invites.loading},newToken:function(){return this.$store.state.invites.newToken},tokens:function(){return this.$store.state.invites.inviteTokens}}),mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchInviteTokens")},methods:{closeDialogWindow:function(){this.inviteUserDialogVisible=!1,this.createTokenDialogVisible=!1,this.$store.dispatch("RemoveNewToken"),this.$data.inviteUserForm.email="",this.$data.inviteUserForm.name=""},createToken:function(){this.$store.dispatch("GenerateInviteToken",this.$data.newTokenForm)},inviteUserViaEmail:function(){var e=o()(s.a.mark(function e(){var t=this;return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:this.$refs.inviteUserForm.validate(function(){var e=o()(s.a.mark(function e(i){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!i){e.next=6;break}return e.next=3,t.$store.dispatch("InviteUserViaEmail",t.$data.inviteUserForm);case 3:t.closeDialogWindow(),e.next=8;break;case 6:return t.$message({type:"error",message:t.$t("invites.submitFormError")}),e.abrupt("return",!1);case 8:case"end":return e.stop()}},e)}));return function(t){return e.apply(this,arguments)}}());case 1:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}(),revokeInviteToken:function(e){this.$store.dispatch("RevokeToken",e)},validateEmail:function(e,t,i){return""===t?i(new Error(this.$t("invites.emptyEmailError"))):this.validEmail(t)?i():i(new Error(this.$t("invites.invalidEmailError")))},validEmail:function(e){return/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(e)}}},d=(i("ObxI"),i("KHd+")),p=Object(d.a)(u,function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"invites-container"},[i("div",{staticClass:"invites-header-container"},[i("h1",[e._v(e._s(e.$t("invites.inviteTokens")))]),e._v(" "),i("reboot-button")],1),e._v(" "),i("div",{staticClass:"actions-container"},[i("el-button",{staticClass:"create-invite-token",on:{click:function(t){e.createTokenDialogVisible=!0}}},[i("span",[i("i",{staticClass:"icon el-icon-plus"}),e._v("\n "+e._s(e.$t("invites.createInviteToken"))+"\n ")])]),e._v(" "),i("el-button",{staticClass:"invite-via-email",on:{click:function(t){e.inviteUserDialogVisible=!0}}},[i("span",[i("i",{staticClass:"icon el-icon-message"}),e._v("\n "+e._s(e.$t("invites.inviteUserViaEmail"))+"\n ")])])],1),e._v(" "),i("el-dialog",{attrs:{visible:e.createTokenDialogVisible,"show-close":!1,title:e.$t("invites.createInviteToken"),"custom-class":"create-new-token-dialog"},on:{"update:visible":function(t){e.createTokenDialogVisible=t}}},[i("el-form",{ref:"newTokenForm",attrs:{model:e.newTokenForm,"label-width":e.getLabelWidth,"status-icon":""}},[i("el-form-item",{attrs:{label:e.$t("invites.maxUse")}},[i("el-input-number",{attrs:{min:0,size:e.isDesktop?"medium":"small",name:"maxUse"},model:{value:e.newTokenForm.maxUse,callback:function(t){e.$set(e.newTokenForm,"maxUse",t)},expression:"newTokenForm.maxUse"}})],1),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.expiresAt")}},[i("el-date-picker",{staticClass:"pick-date",attrs:{placeholder:e.$t("invites.pickDate"),type:"date",name:"date","value-format":"yyyy-MM-dd"},model:{value:e.newTokenForm.expiresAt,callback:function(t){e.$set(e.newTokenForm,"expiresAt",t)},expression:"newTokenForm.expiresAt"}})],1)],1),e._v(" "),i("span",{attrs:{slot:"footer"},slot:"footer"},[i("el-button",{staticClass:"invites-close-dialog",on:{click:e.closeDialogWindow}},[e._v(e._s(e.$t("invites.cancel")))]),e._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:e.createToken}},[e._v(e._s(e.$t("invites.create")))])],1),e._v(" "),"token"in e.newToken?i("el-card",[i("div",{staticClass:"clearfix",attrs:{slot:"header"},slot:"header"},[i("span",[e._v(e._s(e.$t("invites.tokenCreated")))])]),e._v(" "),i("el-form",{staticClass:"new-token-card",attrs:{"label-width":"80px"}},[i("el-form-item",{attrs:{label:e.$t("invites.inviteLink")}},[i("el-link",{attrs:{href:e.inviteLink,underline:!1,target:"_blank"}},[e._v("\n "+e._s(e.inviteLink)+"\n ")])],1),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.token")}},[e._v("\n "+e._s(e.newToken.token)+"\n ")]),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.maxUse")}},[e._v("\n "+e._s(e.newToken.maxUse)+"\n ")]),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.expiresAt")}},[e._v("\n "+e._s(e.newToken.expiresAt||"(not set)")+"\n ")])],1)],1):e._e()],1),e._v(" "),i("el-dialog",{attrs:{visible:e.inviteUserDialogVisible,"show-close":!1,title:e.$t("invites.sendRegistration"),"custom-class":"invite-via-email-dialog"},on:{"update:visible":function(t){e.inviteUserDialogVisible=t}}},[i("div",[i("p",{staticClass:"info"},[e._v(e._s(e.$t("invites.inviteViaEmailAlert")))]),e._v(" "),i("el-form",{ref:"inviteUserForm",attrs:{model:e.inviteUserForm,rules:e.rules,"label-width":e.getLabelWidth,"status-icon":""}},[i("el-form-item",{attrs:{label:e.$t("invites.email"),prop:"email"}},[i("el-input",{attrs:{name:"email",type:"email",autofocus:""},model:{value:e.inviteUserForm.email,callback:function(t){e.$set(e.inviteUserForm,"email",t)},expression:"inviteUserForm.email"}})],1),e._v(" "),i("el-form-item",{attrs:{label:e.$t("invites.name"),prop:"name"}},[i("el-input",{attrs:{name:"name"},model:{value:e.inviteUserForm.name,callback:function(t){e.$set(e.inviteUserForm,"name",t)},expression:"inviteUserForm.name"}})],1)],1)],1),e._v(" "),i("span",{attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:e.closeDialogWindow}},[e._v(e._s(e.$t("invites.cancel")))]),e._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:e.inviteUserViaEmail}},[e._v(e._s(e.$t("invites.create")))])],1)]),e._v(" "),i("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],staticClass:"invite-token-table",attrs:{data:e.tokens,"default-sort":{prop:"used",order:"ascending"}}},[e.isDesktop?i("el-table-column",{attrs:{label:e.$t("invites.id"),"min-width":"60",prop:"id",sortable:""}}):e._e(),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.token"),"min-width":e.isDesktop?320:120,prop:"token"}}),e._v(" "),e.isDesktop?i("el-table-column",{attrs:{label:e.$t("invites.expiresAt"),align:"center","header-align":"center","min-width":"110",prop:"expires_at",sortable:""}}):e._e(),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.maxUse"),align:"center","header-align":"center","min-width":"60",prop:"max_use",sortable:""}}),e._v(" "),e.isDesktop?i("el-table-column",{attrs:{label:e.$t("invites.uses"),align:"center","header-align":"center","min-width":"60",prop:"uses"}}):e._e(),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.used"),"min-width":e.isDesktop?60:50,align:"center","header-align":"center",prop:"used",sortable:""},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-tag",{attrs:{type:t.row.used?"danger":"success","disable-transitions":""}},[e._v("\n "+e._s(t.row.used?e.$t("invites.used"):e.$t("invites.active"))+"\n ")])]}}])}),e._v(" "),i("el-table-column",{attrs:{label:e.$t("invites.actions"),"min-width":e.isDesktop?100:50,align:"center","header-align":"center"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-button",{attrs:{type:"text",size:"small"},nativeOn:{click:function(i){return e.revokeInviteToken(t.row.token)}}},[e._v("\n "+e._s(e.$t("invites.revoke"))+"\n ")])]}}])})],1)],1)},[],!1,null,null,null);p.options.__file="index.vue";t.default=p.exports},ObxI:function(e,t,i){"use strict";var n=i("Tykb");i.n(n).a},Tykb:function(e,t,i){}}]); +//# sourceMappingURL=chunk-7c6b.e63ae1da.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js.map b/priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js.map new file mode 100644 index 000000000..2114a3c52 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/invites/index.vue?8ebd","webpack:///./src/views/invites/index.vue?b523","webpack:///src/views/invites/index.vue","webpack:///./src/views/invites/index.vue","webpack:///./src/views/invites/index.vue?0fc1"],"names":["views_invitesvue_type_script_lang_js_","components","RebootButton","data","rules","email","validator","this","validateEmail","trigger","newTokenForm","maxUse","expiresAt","inviteUserForm","name","createTokenDialogVisible","inviteUserDialogVisible","computed","objectSpread_default","Object","vuex_esm","getLabelWidth","isDesktop","inviteLink","concat","utils","authHost","newToken","token","$store","state","app","device","loading","invites","tokens","inviteTokens","mounted","dispatch","methods","closeDialogWindow","$data","createToken","inviteUserViaEmail","_inviteUserViaEmail","asyncToGenerator_default","regenerator_default","a","mark","_callee2","_this","wrap","_context2","prev","next","$refs","validate","_ref","_callee","valid","_context","$message","type","message","$t","abrupt","stop","_x","apply","arguments","revokeInviteToken","rule","value","callback","Error","validEmail","test","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","_v","_s","on","click","$event","attrs","visible","show-close","title","custom-class","update:visible","ref","model","label-width","status-icon","label","min","size","$$v","$set","expression","placeholder","value-format","slot","href","underline","target","_e","prop","autofocus","directives","rawName","default-sort","order","min-width","sortable","align","header-align","scopedSlots","_u","key","fn","scope","row","used","disable-transitions","nativeOn","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n"],"mappings":"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","file":"static/js/chunk-7c6b.e63ae1da.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"invites-container\"},[_c('div',{staticClass:\"invites-header-container\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('invites.inviteTokens')))]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"actions-container\"},[_c('el-button',{staticClass:\"create-invite-token\",on:{\"click\":function($event){_vm.createTokenDialogVisible = true}}},[_c('span',[_c('i',{staticClass:\"icon el-icon-plus\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('invites.createInviteToken'))+\"\\n \")])]),_vm._v(\" \"),_c('el-button',{staticClass:\"invite-via-email\",on:{\"click\":function($event){_vm.inviteUserDialogVisible = true}}},[_c('span',[_c('i',{staticClass:\"icon el-icon-message\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('invites.inviteUserViaEmail'))+\"\\n \")])])],1),_vm._v(\" \"),_c('el-dialog',{attrs:{\"visible\":_vm.createTokenDialogVisible,\"show-close\":false,\"title\":_vm.$t('invites.createInviteToken'),\"custom-class\":\"create-new-token-dialog\"},on:{\"update:visible\":function($event){_vm.createTokenDialogVisible=$event}}},[_c('el-form',{ref:\"newTokenForm\",attrs:{\"model\":_vm.newTokenForm,\"label-width\":_vm.getLabelWidth,\"status-icon\":\"\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.maxUse')}},[_c('el-input-number',{attrs:{\"min\":0,\"size\":_vm.isDesktop ? 'medium' : 'small',\"name\":\"maxUse\"},model:{value:(_vm.newTokenForm.maxUse),callback:function ($$v) {_vm.$set(_vm.newTokenForm, \"maxUse\", $$v)},expression:\"newTokenForm.maxUse\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.expiresAt')}},[_c('el-date-picker',{staticClass:\"pick-date\",attrs:{\"placeholder\":_vm.$t('invites.pickDate'),\"type\":\"date\",\"name\":\"date\",\"value-format\":\"yyyy-MM-dd\"},model:{value:(_vm.newTokenForm.expiresAt),callback:function ($$v) {_vm.$set(_vm.newTokenForm, \"expiresAt\", $$v)},expression:\"newTokenForm.expiresAt\"}})],1)],1),_vm._v(\" \"),_c('span',{attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{staticClass:\"invites-close-dialog\",on:{\"click\":_vm.closeDialogWindow}},[_vm._v(_vm._s(_vm.$t('invites.cancel')))]),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.createToken}},[_vm._v(_vm._s(_vm.$t('invites.create')))])],1),_vm._v(\" \"),('token' in _vm.newToken)?_c('el-card',[_c('div',{staticClass:\"clearfix\",attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('span',[_vm._v(_vm._s(_vm.$t('invites.tokenCreated')))])]),_vm._v(\" \"),_c('el-form',{staticClass:\"new-token-card\",attrs:{\"label-width\":\"80px\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.inviteLink')}},[_c('el-link',{attrs:{\"href\":_vm.inviteLink,\"underline\":false,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.inviteLink)+\"\\n \")])],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.token')}},[_vm._v(\"\\n \"+_vm._s(_vm.newToken.token)+\"\\n \")]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.maxUse')}},[_vm._v(\"\\n \"+_vm._s(_vm.newToken.maxUse)+\"\\n \")]),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.expiresAt')}},[_vm._v(\"\\n \"+_vm._s(_vm.newToken.expiresAt || '(not set)')+\"\\n \")])],1)],1):_vm._e()],1),_vm._v(\" \"),_c('el-dialog',{attrs:{\"visible\":_vm.inviteUserDialogVisible,\"show-close\":false,\"title\":_vm.$t('invites.sendRegistration'),\"custom-class\":\"invite-via-email-dialog\"},on:{\"update:visible\":function($event){_vm.inviteUserDialogVisible=$event}}},[_c('div',[_c('p',{staticClass:\"info\"},[_vm._v(_vm._s(_vm.$t('invites.inviteViaEmailAlert')))]),_vm._v(\" \"),_c('el-form',{ref:\"inviteUserForm\",attrs:{\"model\":_vm.inviteUserForm,\"rules\":_vm.rules,\"label-width\":_vm.getLabelWidth,\"status-icon\":\"\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.email'),\"prop\":\"email\"}},[_c('el-input',{attrs:{\"name\":\"email\",\"type\":\"email\",\"autofocus\":\"\"},model:{value:(_vm.inviteUserForm.email),callback:function ($$v) {_vm.$set(_vm.inviteUserForm, \"email\", $$v)},expression:\"inviteUserForm.email\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('invites.name'),\"prop\":\"name\"}},[_c('el-input',{attrs:{\"name\":\"name\"},model:{value:(_vm.inviteUserForm.name),callback:function ($$v) {_vm.$set(_vm.inviteUserForm, \"name\", $$v)},expression:\"inviteUserForm.name\"}})],1)],1)],1),_vm._v(\" \"),_c('span',{attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":_vm.closeDialogWindow}},[_vm._v(_vm._s(_vm.$t('invites.cancel')))]),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.inviteUserViaEmail}},[_vm._v(_vm._s(_vm.$t('invites.create')))])],1)]),_vm._v(\" \"),_c('el-table',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],staticClass:\"invite-token-table\",attrs:{\"data\":_vm.tokens,\"default-sort\":{prop: 'used', order: 'ascending'}}},[(_vm.isDesktop)?_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.id'),\"min-width\":\"60\",\"prop\":\"id\",\"sortable\":\"\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.token'),\"min-width\":_vm.isDesktop ? 320 : 120,\"prop\":\"token\"}}),_vm._v(\" \"),(_vm.isDesktop)?_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.expiresAt'),\"align\":\"center\",\"header-align\":\"center\",\"min-width\":\"110\",\"prop\":\"expires_at\",\"sortable\":\"\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.maxUse'),\"align\":\"center\",\"header-align\":\"center\",\"min-width\":\"60\",\"prop\":\"max_use\",\"sortable\":\"\"}}),_vm._v(\" \"),(_vm.isDesktop)?_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.uses'),\"align\":\"center\",\"header-align\":\"center\",\"min-width\":\"60\",\"prop\":\"uses\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.used'),\"min-width\":_vm.isDesktop ? 60 : 50,\"align\":\"center\",\"header-align\":\"center\",\"prop\":\"used\",\"sortable\":\"\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.used ? 'danger' : 'success',\"disable-transitions\":\"\"}},[_vm._v(\"\\n \"+_vm._s(scope.row.used ? _vm.$t('invites.used') : _vm.$t('invites.active'))+\"\\n \")])]}}])}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('invites.actions'),\"min-width\":_vm.isDesktop ? 100 : 50,\"align\":\"center\",\"header-align\":\"center\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-button',{attrs:{\"type\":\"text\",\"size\":\"small\"},nativeOn:{\"click\":function($event){return _vm.revokeInviteToken(scope.row.token)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('invites.revoke'))+\"\\n \")])]}}])})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=1ca5df66&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\""],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-970d.2457e066.js b/priv/static/adminfe/static/js/chunk-970d.2457e066.js deleted file mode 100644 index 0f99d835e..000000000 --- a/priv/static/adminfe/static/js/chunk-970d.2457e066.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-970d"],{"07OA":function(t,e,s){"use strict";var a=s("51EY");s.n(a).a},"51EY":function(t,e,s){},"8rU9":function(t,e,s){},Eg1M:function(t,e,s){"use strict";var a=s("8rU9");s.n(a).a},"G/Mk":function(t,e,s){"use strict";var a=s("xdcp");s.n(a).a},Kw8l:function(t,e,s){"use strict";var a=s("cRgN");s.n(a).a},Lbbz:function(t,e,s){"use strict";var a=s("Sxb/");s.n(a).a},RnhZ:function(t,e,s){var a={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function n(t){var e=r(t);return s(e)}function r(t){if(!s.o(a,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return a[t]}n.keys=function(){return Object.keys(a)},n.resolve=r,t.exports=n,n.id="RnhZ"},"Sxb/":function(t,e,s){},cEOe:function(t,e,s){"use strict";s.r(e);var a=s("ZhIB"),n=s.n(a),r=s("wd/R"),o=s.n(r),i={name:"NoteCard",props:{report:{type:Object,required:!0},note:{type:Object,required:!0}},methods:{parseTimestamp:function(t){return o()(t).format("YYYY-MM-DD HH:mm")},handleNoteDeletion:function(t,e){this.$store.dispatch("DeleteReportNote",{noteID:t,reportID:e})}}},c=(s("G/Mk"),s("KHd+")),l=Object(c.a)(i,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("el-card",{staticClass:"note-card"},[s("div",{attrs:{slot:"header"},slot:"header"},[s("div",{staticClass:"note-header"},[s("div",{staticClass:"note-actor-container"},[s("div",{staticClass:"note-actor"},[s("img",{staticClass:"note-avatar-img",attrs:{src:t.note.user.avatar}}),t._v(" "),s("h3",{staticClass:"note-actor-name"},[t._v(t._s(t.note.user.display_name))])]),t._v(" "),s("a",{attrs:{href:t.note.user.url,target:"_blank"}},[t._v("\n @"+t._s(t.note.user.display_name)+"\n ")])]),t._v(" "),s("div",[s("el-popconfirm",{attrs:{title:"Are you sure to delete this?","confirm-button-text":"Yes","cancel-button-text":"No"},on:{onConfirm:function(e){return t.handleNoteDeletion(t.note.id,t.report.id)}}},[s("el-button",{attrs:{slot:"reference",size:"mini"},slot:"reference"},[t._v("\n "+t._s(t.$t("reports.deleteNote"))+"\n ")])],1)],1)])]),t._v(" "),s("div",{staticClass:"note-body"},[s("span",{staticClass:"note-content",domProps:{innerHTML:t._s(t.note.content)}}),t._v("\n "+t._s(t.parseTimestamp(t.note.created_at))+"\n ")])])},[],!1,null,null,null);l.options.__file="NoteCard.vue";var u=l.exports,d=s("ot3S"),p={name:"ModerateUserDropdown",props:{account:{type:Object,required:!0}},computed:{tags:function(){return this.account.tags||[]}},methods:{handleDeactivation:function(t){var e=t.nickname;this.$store.dispatch("ToggleUserActivation",e)},handleDeletion:function(t){this.$store.dispatch("DeleteUser",t)},showDeactivatedButton:function(t){return this.$store.state.user.id!==t},toggleTag:function(t,e){t.tags.includes(e)?this.$store.dispatch("RemoveTag",{users:[t],tag:e}):this.$store.dispatch("AddTag",{users:[t],tag:e})}}},v=Object(c.a)(p,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("el-dropdown",{attrs:{trigger:"click"}},[s("el-button",{attrs:{disabled:!t.account.id,plain:"",size:"small",icon:"el-icon-files"}},[t._v(t._s(t.$t("reports.moderateUser"))+"\n "),s("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),s("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[t.showDeactivatedButton(t.account)?s("el-dropdown-item",{nativeOn:{click:function(e){return t.handleDeactivation(t.account)}}},[t._v("\n "+t._s(t.account.deactivated?t.$t("users.activateAccount"):t.$t("users.deactivateAccount"))+"\n ")]):t._e(),t._v(" "),t.showDeactivatedButton(t.account.id)?s("el-dropdown-item",{nativeOn:{click:function(e){return t.handleDeletion(t.account.id)}}},[t._v("\n "+t._s(t.$t("users.deleteAccount"))+"\n ")]):t._e(),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("force_nsfw")},attrs:{divided:!0},nativeOn:{click:function(e){return t.toggleTag(t.account,"force_nsfw")}}},[t._v("\n "+t._s(t.$t("users.forceNsfw"))+"\n "),t.tags.includes("force_nsfw")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("strip_media")},nativeOn:{click:function(e){return t.toggleTag(t.account,"strip_media")}}},[t._v("\n "+t._s(t.$t("users.stripMedia"))+"\n "),t.tags.includes("strip_media")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("force_unlisted")},nativeOn:{click:function(e){return t.toggleTag(t.account,"force_unlisted")}}},[t._v("\n "+t._s(t.$t("users.forceUnlisted"))+"\n "),t.tags.includes("force_unlisted")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("sandbox")},nativeOn:{click:function(e){return t.toggleTag(t.account,"sandbox")}}},[t._v("\n "+t._s(t.$t("users.sandbox"))+"\n "),t.tags.includes("sandbox")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),t.account.local?s("el-dropdown-item",{class:{"active-tag":t.tags.includes("disable_remote_subscription")},nativeOn:{click:function(e){return t.toggleTag(t.account,"disable_remote_subscription")}}},[t._v("\n "+t._s(t.$t("users.disableRemoteSubscription"))+"\n "),t.tags.includes("disable_remote_subscription")?s("i",{staticClass:"el-icon-check"}):t._e()]):t._e(),t._v(" "),t.account.local?s("el-dropdown-item",{class:{"active-tag":t.tags.includes("disable_any_subscription")},nativeOn:{click:function(e){return t.toggleTag(t.account,"disable_any_subscription")}}},[t._v("\n "+t._s(t.$t("users.disableAnySubscription"))+"\n "),t.tags.includes("disable_any_subscription")?s("i",{staticClass:"el-icon-check"}):t._e()]):t._e()],1)],1)},[],!1,null,null,null);v.options.__file="ModerateUserDropdown.vue";var _=v.exports,h={name:"Report",components:{Status:d.a,ModerateUserDropdown:_,NoteCard:u},props:{reports:{type:Array,required:!0}},data:function(){return{notes:{}}},computed:{loading:function(){return this.$store.state.reports.loading},pageSize:function(){return this.$store.state.reports.pageSize},totalReportsCount:function(){return this.$store.state.reports.totalReportsCount},currentPage:function(){return this.$store.state.reports.currentPage}},methods:{accountExists:function(t,e){return t[e]},changeReportState:function(t,e){this.$store.dispatch("ChangeReportState",[{state:t,id:e}])},capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},getStateType:function(t){switch(t){case"closed":return"info";case"resolved":return"success";default:return"primary"}},getStatusesTitle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return"Reported statuses: ".concat(t.length," item(s)")},getNotesTitle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return"Notes: ".concat(t.length," item(s)")},handleNewNote:function(t){this.$store.dispatch("CreateReportNote",{content:this.notes[t],reportID:t}),this.notes[t]=""},handlePageChange:function(t){this.$store.dispatch("FetchReports",t)},parseTimestamp:function(t){return o()(t).format("L HH:mm")},showStatuses:function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).length>0}}},m=(s("07OA"),Object(c.a)(h,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[s("el-timeline",{staticClass:"reports-timeline"},t._l(t.reports,function(e){return s("el-timeline-item",{key:e.id,staticClass:"timeline-item-container",attrs:{timestamp:t.parseTimestamp(e.created_at),placement:"top"}},[s("el-card",{staticClass:"report"},[s("div",{staticClass:"report-header-container"},[s("div",{staticClass:"title-container"},[t.accountExists(e.account,"display_name")?s("h3",{staticClass:"report-title"},[t._v(t._s(t.$t("reports.reportOn"))+" "+t._s(e.account.display_name))]):s("h3",{staticClass:"report-title"},[t._v(t._s(t.$t("reports.report")))]),t._v(" "),s("h5",{staticClass:"id"},[t._v(t._s(t.$t("reports.id"))+": "+t._s(e.id))])]),t._v(" "),s("div",[s("el-tag",{staticClass:"report-tag",attrs:{type:t.getStateType(e.state),size:"large"}},[t._v(t._s(t.capitalizeFirstLetter(e.state)))]),t._v(" "),s("el-dropdown",{attrs:{trigger:"click"}},[s("el-button",{staticClass:"report-actions-button",attrs:{plain:"",size:"small",icon:"el-icon-edit"}},[t._v(t._s(t.$t("reports.changeState"))),s("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),s("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},["resolved"!==e.state?s("el-dropdown-item",{nativeOn:{click:function(s){return t.changeReportState("resolved",e.id)}}},[t._v(t._s(t.$t("reports.resolve")))]):t._e(),t._v(" "),"open"!==e.state?s("el-dropdown-item",{nativeOn:{click:function(s){return t.changeReportState("open",e.id)}}},[t._v(t._s(t.$t("reports.reopen")))]):t._e(),t._v(" "),"closed"!==e.state?s("el-dropdown-item",{nativeOn:{click:function(s){return t.changeReportState("closed",e.id)}}},[t._v(t._s(t.$t("reports.close")))]):t._e()],1)],1),t._v(" "),s("moderate-user-dropdown",{attrs:{account:e.account}})],1)]),t._v(" "),s("div",[s("el-divider",{staticClass:"divider"}),t._v(" "),s("span",{staticClass:"report-row-key"},[t._v(t._s(t.$t("reports.account"))+":")]),t._v(" "),t.accountExists(e.account,"avatar")&&t.accountExists(e.account,"display_name")?s("span",[s("img",{staticClass:"avatar-img",attrs:{src:e.account.avatar,alt:"avatar"}}),t._v(" "),e.account.deactivated?s("span",[t._v("\n "+t._s(e.account.display_name)+"\n "),s("span",{staticClass:"deactivated"},[t._v(" (deactivated)")])]):s("a",{staticClass:"account",attrs:{href:e.account.url,target:"_blank"}},[s("span",[t._v(t._s(e.account.display_name))])])]):s("span",{staticClass:"deactivated"},[t._v("("+t._s(t.$t("reports.notFound"))+")")])],1),t._v(" "),e.content&&e.content.length>0?s("div",[s("el-divider",{staticClass:"divider"}),t._v(" "),s("span",{staticClass:"report-row-key"},[t._v(t._s(t.$t("reports.content"))+":\n "),s("span",[t._v(t._s(e.content))])])],1):t._e(),t._v(" "),s("div",{style:t.showStatuses(e.statuses)?"":"margin-bottom:15px"},[s("el-divider",{staticClass:"divider"}),t._v(" "),s("span",{staticClass:"report-row-key"},[t._v(t._s(t.$t("reports.actor"))+":")]),t._v(" "),t.accountExists(e.actor,"avatar")&&t.accountExists(e.actor,"display_name")?s("span",[s("img",{staticClass:"avatar-img",attrs:{src:e.actor.avatar,alt:"avatar"}}),t._v(" "),s("a",{staticClass:"account",attrs:{href:e.actor.url,target:"_blank"}},[s("span",[t._v(t._s(e.actor.display_name))])])]):s("span",{staticClass:"deactivated"},[t._v("("+t._s(t.$t("reports.notFound"))+")")])],1),t._v(" "),t.showStatuses(e.statuses)?s("div",{staticClass:"statuses"},[s("el-collapse",[s("el-collapse-item",{attrs:{title:t.getStatusesTitle(e.statuses)}},t._l(e.statuses,function(a){return s("div",{key:a.id},[s("status",{attrs:{status:a,account:a.account.display_name?a.account:e.account,"show-checkbox":!1,page:t.currentPage}})],1)}),0)],1)],1):t._e(),t._v(" "),s("div",{staticClass:"report-notes"},[s("el-collapse",[s("el-collapse-item",{attrs:{title:t.getNotesTitle(e.notes)}},t._l(e.notes,function(t,a){return s("note-card",{key:a,attrs:{note:t,report:e}})}),1)],1),t._v(" "),s("div",{staticClass:"report-note-form"},[s("el-input",{attrs:{placeholder:t.$t("reports.leaveNote"),type:"textarea",rows:"2"},model:{value:t.notes[e.id],callback:function(s){t.$set(t.notes,e.id,s)},expression:"notes[report.id]"}}),t._v(" "),s("div",{staticClass:"report-post-note"},[s("el-button",{on:{click:function(s){return t.handleNewNote(e.id)}}},[t._v(t._s(t.$t("reports.postNote")))])],1)],1)],1)])],1)}),1),t._v(" "),t.loading?t._e():s("div",{staticClass:"reports-pagination"},[s("el-pagination",{attrs:{total:t.totalReportsCount,"current-page":t.currentPage,"page-size":t.pageSize,background:"",layout:"prev, pager, next"},on:{"current-change":t.handlePageChange}})],1)],1)},[],!1,null,null,null));m.options.__file="Report.vue";var g=m.exports,f=s("mSNy"),j={data:function(){return{filter:"open",options:[{value:"open",label:f.a.t("reportsFilter.open")},{value:"closed",label:f.a.t("reportsFilter.closed")},{value:"resolved",label:f.a.t("reportsFilter.resolved")}]}},created:function(){this.$store.dispatch("SetFilter",this.$data.filter)},methods:{toggleFilters:function(){this.$store.dispatch("SetFilter",this.$data.filter),this.$store.dispatch("ClearFetchedReports"),this.$store.dispatch("FetchReports",1)}}},b=(s("Eg1M"),Object(c.a)(j,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("el-select",{staticClass:"select-field",attrs:{placeholder:t.$t("reportsFilter.inputPlaceholder"),clearable:"","value-key":"value"},on:{change:t.toggleFilters},model:{value:t.filter,callback:function(e){t.filter=e},expression:"filter"}},t._l(t.options,function(e){return s("el-option",{key:e.value,attrs:{label:e.label,value:e.value}},[t._v(t._s(e.label))])}),1)},[],!1,null,"ecc36f5a",null));b.options.__file="ReportsFilter.vue";var C=b.exports,y={components:{RebootButton:s("rIUS").a,Report:g,ReportsFilter:C},computed:{loading:function(){return this.$store.state.reports.loading},normalizedReportsCount:function(){return n()(this.$store.state.reports.totalReportsCount).format("0a")},reports:function(){return this.$store.state.reports.fetchedReports}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchReports",1)}},k=(s("Lbbz"),Object(c.a)(y,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"reports-container"},[s("div",{staticClass:"reports-header-container"},[s("h1",[t._v("\n "+t._s(t.$t("reports.reports"))+"\n "),s("span",{staticClass:"report-count"},[t._v("("+t._s(t.normalizedReportsCount)+")")])]),t._v(" "),s("reboot-button")],1),t._v(" "),s("div",{staticClass:"reports-filter-container"},[s("reports-filter")],1),t._v(" "),s("div",{staticClass:"block"},[s("report",{directives:[{name:"loading",rawName:"v-loading",value:t.loading,expression:"loading"}],attrs:{reports:t.reports}}),t._v(" "),0===t.reports.length?s("div",{staticClass:"no-reports-message"},[s("p",[t._v("There are no reports to display")])]):t._e()],1)])},[],!1,null,"fa601560",null));k.options.__file="index.vue";e.default=k.exports},cRgN:function(t,e,s){},ot3S:function(t,e,s){"use strict";var a=s("wd/R"),n=s.n(a),r={name:"Status",props:{account:{type:Object,required:!1,default:function(){return{}}},fetchStatusesByInstance:{type:Boolean,required:!1,default:!1},showCheckbox:{type:Boolean,required:!0,default:!1},status:{type:Object,required:!0},page:{type:Number,required:!1,default:0},userId:{type:String,required:!1,default:""},godmode:{type:Boolean,required:!1,default:!1}},data:function(){return{showHiddenStatus:!1}},methods:{capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},changeStatus:function(t,e,s){this.$store.dispatch("ChangeStatusScope",{statusId:t,isSensitive:e,visibility:s,reportCurrentPage:this.page,userId:this.userId,godmode:this.godmode,fetchStatusesByInstance:this.fetchStatusesByInstance})},deleteStatus:function(t){var e=this;this.$confirm("Are you sure you want to delete this status?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){e.$store.dispatch("DeleteStatus",{statusId:t,reportCurrentPage:e.page,userId:e.userId,godmode:e.godmode,fetchStatusesByInstance:e.fetchStatusesByInstance}),e.$message({type:"success",message:"Delete completed"})}).catch(function(){e.$message({type:"info",message:"Delete canceled"})})},optionPercent:function(t,e){var s=t.options.reduce(function(t,e){return t+e.votes_count},0);return 0===s?0:+(e.votes_count/s*100).toFixed(1)},parseTimestamp:function(t){return n()(t).format("YYYY-MM-DD HH:mm")},handleStatusSelection:function(t){this.$emit("status-selection",t)}}},o=(s("Kw8l"),s("KHd+")),i=Object(o.a)(r,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[t.status.deleted?s("el-card",{staticClass:"status-card"},[s("div",{attrs:{slot:"header"},slot:"header"},[s("div",{staticClass:"status-header"},[s("div",{staticClass:"status-account-container"},[s("div",{staticClass:"status-account"},[s("h4",{staticClass:"status-deleted"},[t._v(t._s(t.$t("reports.statusDeleted")))])])])])]),t._v(" "),s("div",{staticClass:"status-body"},[t.status.content?s("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}):s("span",{staticClass:"status-without-content"},[t._v("no content")])]),t._v(" "),t.status.created_at?s("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"}},[t._v("\n "+t._s(t.parseTimestamp(t.status.created_at))+"\n ")]):t._e()]):s("el-card",{staticClass:"status-card"},[s("div",{attrs:{slot:"header"},slot:"header"},[s("div",{staticClass:"status-header"},[s("div",{staticClass:"status-account-container"},[s("div",{staticClass:"status-account"},[t.showCheckbox?s("el-checkbox",{staticClass:"status-checkbox",on:{change:function(e){return t.handleStatusSelection(t.account)}}}):t._e(),t._v(" "),s("img",{staticClass:"status-avatar-img",attrs:{src:t.account.avatar}}),t._v(" "),t.account.deactivated?s("span",[s("h3",{staticClass:"status-account-name"},[t._v(t._s(t.account.display_name))]),t._v(" "),s("h3",{staticClass:"status-account-name deactivated"},[t._v(" (deactivated)")])]):s("a",{staticClass:"account",attrs:{href:t.account.url,target:"_blank"}},[s("h3",{staticClass:"status-account-name"},[t._v(t._s(t.account.display_name))])])],1)]),t._v(" "),s("div",{staticClass:"status-actions"},[t.status.sensitive?s("el-tag",{attrs:{type:"warning",size:"large"}},[t._v(t._s(t.$t("reports.sensitive")))]):t._e(),t._v(" "),s("el-tag",{attrs:{size:"large"}},[t._v(t._s(t.capitalizeFirstLetter(t.status.visibility)))]),t._v(" "),s("el-dropdown",{attrs:{trigger:"click"}},[s("el-button",{staticClass:"status-actions-button",attrs:{plain:"",size:"small",icon:"el-icon-edit"}},[t._v("\n "+t._s(t.$t("reports.changeScope"))),s("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),s("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[t.status.sensitive?t._e():s("el-dropdown-item",{nativeOn:{click:function(e){return t.changeStatus(t.status.id,!0,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.addSensitive"))+"\n ")]),t._v(" "),t.status.sensitive?s("el-dropdown-item",{nativeOn:{click:function(e){return t.changeStatus(t.status.id,!1,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.removeSensitive"))+"\n ")]):t._e(),t._v(" "),"public"!==t.status.visibility?s("el-dropdown-item",{nativeOn:{click:function(e){return t.changeStatus(t.status.id,t.status.sensitive,"public")}}},[t._v("\n "+t._s(t.$t("reports.public"))+"\n ")]):t._e(),t._v(" "),"private"!==t.status.visibility?s("el-dropdown-item",{nativeOn:{click:function(e){return t.changeStatus(t.status.id,t.status.sensitive,"private")}}},[t._v("\n "+t._s(t.$t("reports.private"))+"\n ")]):t._e(),t._v(" "),"unlisted"!==t.status.visibility?s("el-dropdown-item",{nativeOn:{click:function(e){return t.changeStatus(t.status.id,t.status.sensitive,"unlisted")}}},[t._v("\n "+t._s(t.$t("reports.unlisted"))+"\n ")]):t._e(),t._v(" "),s("el-dropdown-item",{nativeOn:{click:function(e){return t.deleteStatus(t.status.id)}}},[t._v("\n "+t._s(t.$t("reports.deleteStatus"))+"\n ")])],1)],1)],1)])]),t._v(" "),s("div",{staticClass:"status-body"},[t.status.spoiler_text?s("div",[s("strong",[t._v(t._s(t.status.spoiler_text))]),t._v(" "),t.showHiddenStatus?t._e():s("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(e){t.showHiddenStatus=!0}}},[t._v("Show more")]),t._v(" "),t.showHiddenStatus?s("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(e){t.showHiddenStatus=!1}}},[t._v("Show less")]):t._e(),t._v(" "),t.showHiddenStatus?s("div",[s("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?s("div",{staticClass:"poll"},[s("ul",t._l(t.status.poll.options,function(e,a){return s("li",{key:a},[t._v("\n "+t._s(e.title)+"\n "),s("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,e)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,e){return s("div",{key:e,staticClass:"image"},[s("img",{attrs:{src:t.preview_url}})])})],2):t._e()],1):t._e(),t._v(" "),t.status.spoiler_text?t._e():s("div",[s("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?s("div",{staticClass:"poll"},[s("ul",t._l(t.status.poll.options,function(e,a){return s("li",{key:a},[t._v("\n "+t._s(e.title)+"\n "),s("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,e)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,e){return s("div",{key:e,staticClass:"image"},[s("img",{attrs:{src:t.preview_url}})])})],2),t._v(" "),s("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"}},[t._v("\n "+t._s(t.parseTimestamp(t.status.created_at))+"\n ")])])])],1)},[],!1,null,null,null);i.options.__file="index.vue";e.a=i.exports},rIUS:function(t,e,s){"use strict";var a=s("o0o1"),n=s.n(a),r=s("yXPU"),o=s.n(r),i=s("mSNy"),c={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var t=o()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("RestartApplication");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:i.a.t("settings.restartSuccess")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},l=s("KHd+"),u=Object(l.a)(c,function(){var t=this.$createElement,e=this._self._c||t;return this.needReboot?e("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[e("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[e("span",[e("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);u.options.__file="index.vue";e.a=u.exports},xdcp:function(t,e,s){}}]); -//# sourceMappingURL=chunk-970d.2457e066.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-970d.2457e066.js.map b/priv/static/adminfe/static/js/chunk-970d.2457e066.js.map deleted file mode 100644 index 6896407b0..000000000 --- a/priv/static/adminfe/static/js/chunk-970d.2457e066.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/reports/components/Report.vue?ad5f","webpack:///./src/views/reports/components/ReportsFilter.vue?a490","webpack:///./src/views/reports/components/NoteCard.vue?b93a","webpack:///./src/components/Status/index.vue?aecc","webpack:///./src/views/reports/index.vue?cda2","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/views/reports/index.vue?43f7","webpack:///./src/views/reports/components/NoteCard.vue?6205","webpack:///src/views/reports/components/NoteCard.vue","webpack:///./src/views/reports/components/NoteCard.vue","webpack:///./src/views/reports/components/NoteCard.vue?b0ed","webpack:///./src/views/reports/components/ModerateUserDropdown.vue?6745","webpack:///src/views/reports/components/ModerateUserDropdown.vue","webpack:///./src/views/reports/components/ModerateUserDropdown.vue","webpack:///./src/views/reports/components/ModerateUserDropdown.vue?65ad","webpack:///./src/views/reports/components/Report.vue?a764","webpack:///src/views/reports/components/Report.vue","webpack:///./src/views/reports/components/Report.vue","webpack:///./src/views/reports/components/Report.vue?b7da","webpack:///./src/views/reports/components/ReportsFilter.vue?e3b7","webpack:///src/views/reports/components/ReportsFilter.vue","webpack:///./src/views/reports/components/ReportsFilter.vue","webpack:///./src/views/reports/components/ReportsFilter.vue?f6ad","webpack:///./src/views/reports/index.vue?3bcc","webpack:///src/views/reports/index.vue","webpack:///./src/views/reports/index.vue","webpack:///./src/components/Status/index.vue?f9b2","webpack:///./src/components/Status/index.vue?6071","webpack:///src/components/Status/index.vue","webpack:///./src/components/Status/index.vue","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Report_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ReportsFilter_vue_vue_type_style_index_0_id_ecc36f5a_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_NoteCard_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_fa601560_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","id","webpackContextResolve","o","e","Error","code","keys","Object","resolve","module","exports","components_NoteCardvue_type_script_lang_js_","name","props","report","type","required","note","methods","parseTimestamp","timestamp","moment_default","format","handleNoteDeletion","noteID","reportID","this","$store","dispatch","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","slot","src","user","avatar","_v","_s","display_name","href","url","target","title","confirm-button-text","cancel-button-text","on","onConfirm","$event","size","$t","domProps","innerHTML","content","created_at","options","__file","NoteCard","components_ModerateUserDropdownvue_type_script_lang_js_","account","computed","tags","handleDeactivation","_ref","nickname","handleDeletion","showDeactivatedButton","state","toggleTag","tag","includes","users","ModerateUserDropdown_component","trigger","disabled","plain","icon","nativeOn","click","deactivated","_e","class","active-tag","divided","ModerateUserDropdown","components_Reportvue_type_script_lang_js_","components","Status","reports","Array","data","notes","loading","pageSize","totalReportsCount","currentPage","accountExists","key","changeReportState","capitalizeFirstLetter","str","charAt","toUpperCase","slice","getStateType","getStatusesTitle","statuses","arguments","length","undefined","concat","getNotesTitle","handleNewNote","handlePageChange","page","showStatuses","Report_component","_l","placement","alt","style","actor","status","show-checkbox","index","placeholder","rows","model","value","callback","$$v","$set","expression","total","current-page","page-size","background","layout","current-change","Report","components_ReportsFiltervue_type_script_lang_js_","filter","label","lang","t","created","$data","toggleFilters","ReportsFilter_component","clearable","value-key","change","item","ReportsFilter","views_reportsvue_type_script_lang_js_","RebootButton","normalizedReportsCount","numeral_default","fetchedReports","mounted","reports_component","directives","rawName","__webpack_exports__","components_Statusvue_type_script_lang_js_","default","fetchStatusesByInstance","Boolean","showCheckbox","Number","userId","String","godmode","showHiddenStatus","changeStatus","statusId","isSensitive","visibility","reportCurrentPage","deleteStatus","_this","$confirm","confirmButtonText","cancelButtonText","then","$message","message","catch","optionPercent","poll","pollOption","allVotes","reduce","acc","option","votes_count","toFixed","handleStatusSelection","$emit","deleted","sensitive","spoiler_text","percentage","attachment","preview_url","components_RebootButtonvue_type_script_lang_js_","needReboot","app","restartApp","_restartApp","asyncToGenerator_default","regenerator_default","a","mark","_callee","wrap","_context","prev","next","t0","abrupt","stop","apply"],"mappings":"wGAAA,IAAAA,EAAAC,EAAA,QAAAA,EAAAC,EAAAF,GAA0e,uFCA1e,IAAAG,EAAAF,EAAA,QAAAA,EAAAC,EAAAC,GAAygB,uCCAzgB,IAAAC,EAAAH,EAAA,QAAAA,EAAAC,EAAAE,GAA4e,qCCA5e,IAAAC,EAAAJ,EAAA,QAAAA,EAAAC,EAAAG,GAAud,qCCAvd,IAAAC,EAAAL,EAAA,QAAAA,EAAAC,EAAAI,GAA+e,wBCA/e,IAAAC,GACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,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","file":"static/js/chunk-970d.2457e066.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=style&index=0&id=ecc36f5a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=style&index=0&id=ecc36f5a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=fa601560&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=fa601560&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"reports-container\"},[_c('div',{staticClass:\"reports-header-container\"},[_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.reports'))+\"\\n \"),_c('span',{staticClass:\"report-count\"},[_vm._v(\"(\"+_vm._s(_vm.normalizedReportsCount)+\")\")])]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"reports-filter-container\"},[_c('reports-filter')],1),_vm._v(\" \"),_c('div',{staticClass:\"block\"},[_c('report',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],attrs:{\"reports\":_vm.reports}}),_vm._v(\" \"),(_vm.reports.length === 0)?_c('div',{staticClass:\"no-reports-message\"},[_c('p',[_vm._v(\"There are no reports to display\")])]):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./NoteCard.vue?vue&type=template&id=3e6c4f7e&\"\nimport script from \"./NoteCard.vue?vue&type=script&lang=js&\"\nexport * from \"./NoteCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NoteCard.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"NoteCard.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-card',{staticClass:\"note-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"note-header\"},[_c('div',{staticClass:\"note-actor-container\"},[_c('div',{staticClass:\"note-actor\"},[_c('img',{staticClass:\"note-avatar-img\",attrs:{\"src\":_vm.note.user.avatar}}),_vm._v(\" \"),_c('h3',{staticClass:\"note-actor-name\"},[_vm._v(_vm._s(_vm.note.user.display_name))])]),_vm._v(\" \"),_c('a',{attrs:{\"href\":_vm.note.user.url,\"target\":\"_blank\"}},[_vm._v(\"\\n @\"+_vm._s(_vm.note.user.display_name)+\"\\n \")])]),_vm._v(\" \"),_c('div',[_c('el-popconfirm',{attrs:{\"title\":\"Are you sure to delete this?\",\"confirm-button-text\":\"Yes\",\"cancel-button-text\":\"No\"},on:{\"onConfirm\":function($event){return _vm.handleNoteDeletion(_vm.note.id, _vm.report.id)}}},[_c('el-button',{attrs:{\"slot\":\"reference\",\"size\":\"mini\"},slot:\"reference\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.deleteNote'))+\"\\n \")])],1)],1)])]),_vm._v(\" \"),_c('div',{staticClass:\"note-body\"},[_c('span',{staticClass:\"note-content\",domProps:{\"innerHTML\":_vm._s(_vm.note.content)}}),_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.note.created_at))+\"\\n \")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerateUserDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerateUserDropdown.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./ModerateUserDropdown.vue?vue&type=template&id=bcf0134c&\"\nimport script from \"./ModerateUserDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./ModerateUserDropdown.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ModerateUserDropdown.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"trigger\":\"click\"}},[_c('el-button',{attrs:{\"disabled\":!_vm.account.id,\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-files\"}},[_vm._v(_vm._s(_vm.$t('reports.moderateUser'))+\"\\n \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(_vm.showDeactivatedButton(_vm.account))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeactivation(_vm.account)}}},[_vm._v(\"\\n \"+_vm._s(_vm.account.deactivated ? _vm.$t('users.activateAccount') : _vm.$t('users.deactivateAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.account.id))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeletion(_vm.account.id)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('force_nsfw') },attrs:{\"divided\":true},nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceNsfw'))+\"\\n \"),(_vm.tags.includes('force_nsfw'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('strip_media') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.stripMedia'))+\"\\n \"),(_vm.tags.includes('strip_media'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('force_unlisted') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceUnlisted'))+\"\\n \"),(_vm.tags.includes('force_unlisted'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('sandbox') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.sandbox'))+\"\\n \"),(_vm.tags.includes('sandbox'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),(_vm.account.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('disable_remote_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableRemoteSubscription'))+\"\\n \"),(_vm.tags.includes('disable_remote_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.account.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('disable_any_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableAnySubscription'))+\"\\n \"),(_vm.tags.includes('disable_any_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Report.vue?vue&type=template&id=2161c30a&\"\nimport script from \"./Report.vue?vue&type=script&lang=js&\"\nexport * from \"./Report.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Report.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Report.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('el-timeline',{staticClass:\"reports-timeline\"},_vm._l((_vm.reports),function(report){return _c('el-timeline-item',{key:report.id,staticClass:\"timeline-item-container\",attrs:{\"timestamp\":_vm.parseTimestamp(report.created_at),\"placement\":\"top\"}},[_c('el-card',{staticClass:\"report\"},[_c('div',{staticClass:\"report-header-container\"},[_c('div',{staticClass:\"title-container\"},[(_vm.accountExists(report.account, 'display_name'))?_c('h3',{staticClass:\"report-title\"},[_vm._v(_vm._s(_vm.$t('reports.reportOn'))+\" \"+_vm._s(report.account.display_name))]):_c('h3',{staticClass:\"report-title\"},[_vm._v(_vm._s(_vm.$t('reports.report')))]),_vm._v(\" \"),_c('h5',{staticClass:\"id\"},[_vm._v(_vm._s(_vm.$t('reports.id'))+\": \"+_vm._s(report.id))])]),_vm._v(\" \"),_c('div',[_c('el-tag',{staticClass:\"report-tag\",attrs:{\"type\":_vm.getStateType(report.state),\"size\":\"large\"}},[_vm._v(_vm._s(_vm.capitalizeFirstLetter(report.state)))]),_vm._v(\" \"),_c('el-dropdown',{attrs:{\"trigger\":\"click\"}},[_c('el-button',{staticClass:\"report-actions-button\",attrs:{\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-edit\"}},[_vm._v(_vm._s(_vm.$t('reports.changeState'))),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(report.state !== 'resolved')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeReportState('resolved', report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.resolve')))]):_vm._e(),_vm._v(\" \"),(report.state !== 'open')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeReportState('open', report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.reopen')))]):_vm._e(),_vm._v(\" \"),(report.state !== 'closed')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeReportState('closed', report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.close')))]):_vm._e()],1)],1),_vm._v(\" \"),_c('moderate-user-dropdown',{attrs:{\"account\":report.account}})],1)]),_vm._v(\" \"),_c('div',[_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('span',{staticClass:\"report-row-key\"},[_vm._v(_vm._s(_vm.$t('reports.account'))+\":\")]),_vm._v(\" \"),(_vm.accountExists(report.account, 'avatar') && _vm.accountExists(report.account, 'display_name'))?_c('span',[_c('img',{staticClass:\"avatar-img\",attrs:{\"src\":report.account.avatar,\"alt\":\"avatar\"}}),_vm._v(\" \"),(!report.account.deactivated)?_c('a',{staticClass:\"account\",attrs:{\"href\":report.account.url,\"target\":\"_blank\"}},[_c('span',[_vm._v(_vm._s(report.account.display_name))])]):_c('span',[_vm._v(\"\\n \"+_vm._s(report.account.display_name)+\"\\n \"),_c('span',{staticClass:\"deactivated\"},[_vm._v(\" (deactivated)\")])])]):_c('span',{staticClass:\"deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('reports.notFound'))+\")\")])],1),_vm._v(\" \"),(report.content && report.content.length > 0)?_c('div',[_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('span',{staticClass:\"report-row-key\"},[_vm._v(_vm._s(_vm.$t('reports.content'))+\":\\n \"),_c('span',[_vm._v(_vm._s(report.content))])])],1):_vm._e(),_vm._v(\" \"),_c('div',{style:(_vm.showStatuses(report.statuses) ? '' : 'margin-bottom:15px')},[_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('span',{staticClass:\"report-row-key\"},[_vm._v(_vm._s(_vm.$t('reports.actor'))+\":\")]),_vm._v(\" \"),(_vm.accountExists(report.actor, 'avatar') && _vm.accountExists(report.actor, 'display_name'))?_c('span',[_c('img',{staticClass:\"avatar-img\",attrs:{\"src\":report.actor.avatar,\"alt\":\"avatar\"}}),_vm._v(\" \"),_c('a',{staticClass:\"account\",attrs:{\"href\":report.actor.url,\"target\":\"_blank\"}},[_c('span',[_vm._v(_vm._s(report.actor.display_name))])])]):_c('span',{staticClass:\"deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('reports.notFound'))+\")\")])],1),_vm._v(\" \"),(_vm.showStatuses(report.statuses))?_c('div',{staticClass:\"statuses\"},[_c('el-collapse',[_c('el-collapse-item',{attrs:{\"title\":_vm.getStatusesTitle(report.statuses)}},_vm._l((report.statuses),function(status){return _c('div',{key:status.id},[_c('status',{attrs:{\"status\":status,\"account\":status.account.display_name ? status.account : report.account,\"show-checkbox\":false,\"page\":_vm.currentPage}})],1)}),0)],1)],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"report-notes\"},[_c('el-collapse',[_c('el-collapse-item',{attrs:{\"title\":_vm.getNotesTitle(report.notes)}},_vm._l((report.notes),function(note,index){return _c('note-card',{key:index,attrs:{\"note\":note,\"report\":report}})}),1)],1),_vm._v(\" \"),_c('div',{staticClass:\"report-note-form\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('reports.leaveNote'),\"type\":\"textarea\",\"rows\":\"2\"},model:{value:(_vm.notes[report.id]),callback:function ($$v) {_vm.$set(_vm.notes, report.id, $$v)},expression:\"notes[report.id]\"}}),_vm._v(\" \"),_c('div',{staticClass:\"report-post-note\"},[_c('el-button',{on:{\"click\":function($event){return _vm.handleNewNote(report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.postNote')))])],1)],1)],1)])],1)}),1),_vm._v(\" \"),(!_vm.loading)?_c('div',{staticClass:\"reports-pagination\"},[_c('el-pagination',{attrs:{\"total\":_vm.totalReportsCount,\"current-page\":_vm.currentPage,\"page-size\":_vm.pageSize,\"background\":\"\",\"layout\":\"prev, pager, next\"},on:{\"current-change\":_vm.handlePageChange}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ReportsFilter.vue?vue&type=template&id=ecc36f5a&scoped=true&\"\nimport script from \"./ReportsFilter.vue?vue&type=script&lang=js&\"\nexport * from \"./ReportsFilter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ReportsFilter.vue?vue&type=style&index=0&id=ecc36f5a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ecc36f5a\",\n null\n \n)\n\ncomponent.options.__file = \"ReportsFilter.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-select',{staticClass:\"select-field\",attrs:{\"placeholder\":_vm.$t('reportsFilter.inputPlaceholder'),\"clearable\":\"\",\"value-key\":\"value\"},on:{\"change\":_vm.toggleFilters},model:{value:(_vm.filter),callback:function ($$v) {_vm.filter=$$v},expression:\"filter\"}},_vm._l((_vm.options),function(item){return _c('el-option',{key:item.value,attrs:{\"label\":item.label,\"value\":item.value}},[_vm._v(_vm._s(item.label))])}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=fa601560&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=fa601560&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"fa601560\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(!_vm.status.deleted)?_c('el-card',{staticClass:\"status-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[(_vm.showCheckbox)?_c('el-checkbox',{staticClass:\"status-checkbox\",on:{\"change\":function($event){return _vm.handleStatusSelection(_vm.account)}}}):_vm._e(),_vm._v(\" \"),_c('img',{staticClass:\"status-avatar-img\",attrs:{\"src\":_vm.account.avatar}}),_vm._v(\" \"),(!_vm.account.deactivated)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.account.url,\"target\":\"_blank\"}},[_c('h3',{staticClass:\"status-account-name\"},[_vm._v(_vm._s(_vm.account.display_name))])]):_c('span',[_c('h3',{staticClass:\"status-account-name\"},[_vm._v(_vm._s(_vm.account.display_name))]),_vm._v(\" \"),_c('h3',{staticClass:\"status-account-name deactivated\"},[_vm._v(\" (deactivated)\")])])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"status-actions\"},[(_vm.status.sensitive)?_c('el-tag',{attrs:{\"type\":\"warning\",\"size\":\"large\"}},[_vm._v(_vm._s(_vm.$t('reports.sensitive')))]):_vm._e(),_vm._v(\" \"),_c('el-tag',{attrs:{\"size\":\"large\"}},[_vm._v(_vm._s(_vm.capitalizeFirstLetter(_vm.status.visibility)))]),_vm._v(\" \"),_c('el-dropdown',{attrs:{\"trigger\":\"click\"}},[_c('el-button',{staticClass:\"status-actions-button\",attrs:{\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-edit\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.changeScope'))),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(!_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, true, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.addSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, false, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.removeSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'public')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'public')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.public'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'private')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'private')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.private'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'unlisted')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.unlisted'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deleteStatus(_vm.status.id)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.deleteStatus'))+\"\\n \")])],1)],1)],1)])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.spoiler_text)?_c('div',[_c('strong',[_vm._v(_vm._s(_vm.status.spoiler_text))]),_vm._v(\" \"),(!_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = true}}},[_vm._v(\"Show more\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = false}}},[_vm._v(\"Show less\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.status.spoiler_text)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e(),_vm._v(\" \"),_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.status.created_at))+\"\\n \")])])]):_c('el-card',{staticClass:\"status-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[_c('h4',{staticClass:\"status-deleted\"},[_vm._v(_vm._s(_vm.$t('reports.statusDeleted')))])])])])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.content)?_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}):_c('span',{staticClass:\"status-without-content\"},[_vm._v(\"no content\")])]),_vm._v(\" \"),(_vm.status.created_at)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.status.created_at))+\"\\n \")]):_vm._e()])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=0fdc1bba&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-c5f4.304479e7.js b/priv/static/adminfe/static/js/chunk-c5f4.304479e7.js new file mode 100644 index 000000000..4220621be --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-c5f4.304479e7.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-c5f4"],{"26YS":function(e,t,a){"use strict";a.r(t);var o=a("o0o1"),s=a.n(o),i=a("yXPU"),c=a.n(i),l=a("MVZn"),n=a.n(l),r=a("mm8V"),m={props:{host:{type:String,required:!0},packName:{type:String,required:!0},shortcode:{type:String,required:!0},file:{type:String,required:!0},isLocal:{type:Boolean,required:!0}},data:function(){return{newShortcode:null,newFile:null,copyToLocalPackName:null,copyPopoverVisible:!1,copyToShortcode:"",copyToFilename:""}},computed:{emojiName:{get:function(){return null!==this.newShortcode?this.newShortcode:this.shortcode},set:function(e){this.newShortcode=e}},emojiFile:{get:function(){return null!==this.newFile?this.newFile:this.file},set:function(e){this.newFile=e}},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},localPacks:function(){return this.$store.state.emojiPacks.localPacks},remoteInstance:function(){return new URL(this.$store.state.emojiPacks.remoteInstance).host}},methods:{update:function(){var e=c()(s.a.mark(function e(){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0,this.$store.dispatch("UpdateEmojiFile",{packName:this.packName,shortcode:this.shortcode,newShortcode:this.emojiName,newFilename:this.emojiFile,force:!0}),e.next=7;break;case 4:return e.prev=4,e.t0=e.catch(0),e.abrupt("return");case 7:this.newShortcode=null,this.newFile=null,this.$store.dispatch("ReloadEmoji");case 10:case"end":return e.stop()}},e,this,[[0,4]])}));return function(){return e.apply(this,arguments)}}(),remove:function(){var e=this;this.$confirm("This will delete the emoji, are you sure?","Warning",{confirmButtonText:"Yes, delete the emoji",cancelButtonText:"No, leave it be",type:"warning"}).then(function(){e.$store.dispatch("DeleteEmojiFile",{packName:e.packName,shortcode:e.shortcode}).then(function(){e.newShortcode=null,e.newFile=null,e.$store.dispatch("ReloadEmoji")})})},copyToLocal:function(){try{this.$store.dispatch("AddNewEmojiFile",{packName:this.copyToLocalPackName,file:this.addressOfEmojiInPack(this.remoteInstance,this.packName,this.file),shortcode:""!==this.copyToShortcode.trim()?this.copyToShortcode.trim():this.shortcode,filename:""!==this.copyToFilename.trim()?this.copyToFilename.trim():this.file})}catch(e){return}this.copyToLocalPackName=null,this.copyToLocalVisible=!1,this.copyToShortcode="",this.copyToFilename="",this.$store.dispatch("ReloadEmoji")},addressOfEmojiInPack:r.b}},p=(a("4ySm"),a("KHd+")),d=Object(p.a)(m,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[e.isLocal?a("div",{class:e.isMobile?"emoji-container-flex":"emoji-container-grid"},[a("img",{staticClass:"emoji-preview-img",attrs:{src:e.addressOfEmojiInPack(e.host,e.packName,e.file)}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{placeholder:e.$t("emoji.shortcode")},model:{value:e.emojiName,callback:function(t){e.emojiName=t},expression:"emojiName"}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{placeholder:e.$t("emoji.file")},model:{value:e.emojiFile,callback:function(t){e.emojiFile=t},expression:"emojiFile"}}),e._v(" "),a("div",{staticClass:"emoji-buttons"},[a("el-button",{attrs:{type:"primary"},on:{click:e.update}},[e._v(e._s(e.$t("emoji.update")))]),e._v(" "),a("el-button",{staticClass:"remove-emoji-button",on:{click:e.remove}},[e._v(e._s(e.$t("emoji.remove")))])],1)],1):e._e(),e._v(" "),e.isLocal?e._e():a("div",{class:e.isMobile?"emoji-container-flex":"remote-emoji-container-grid"},[a("img",{staticClass:"emoji-preview-img",attrs:{src:e.addressOfEmojiInPack(e.remoteInstance,e.packName,e.file)}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{value:e.emojiName,placeholder:e.$t("emoji.shortcode")}}),e._v(" "),a("el-input",{staticClass:"emoji-info",attrs:{value:e.emojiFile,placeholder:e.$t("emoji.file")}}),e._v(" "),a("el-popover",{staticClass:"copy-pack-container",attrs:{placement:"left-start","popper-class":"copy-popover"},model:{value:e.copyPopoverVisible,callback:function(t){e.copyPopoverVisible=t},expression:"copyPopoverVisible"}},[a("p",[e._v(e._s(e.$t("emoji.selectLocalPack")))]),e._v(" "),a("el-select",{staticClass:"copy-pack-select",attrs:{placeholder:e.$t("emoji.localPack")},model:{value:e.copyToLocalPackName,callback:function(t){e.copyToLocalPackName=t},expression:"copyToLocalPackName"}},e._l(e.localPacks,function(e,t){return a("el-option",{key:t,attrs:{label:t,value:t}})}),1),e._v(" "),a("p",[e._v(e._s(e.$t("emoji.specifyShortcode")))]),e._v(" "),a("el-input",{attrs:{placeholder:e.$t("emoji.leaveEmptyShortcode")},model:{value:e.copyToShortcode,callback:function(t){e.copyToShortcode=t},expression:"copyToShortcode"}}),e._v(" "),a("p",[e._v(e._s(e.$t("emoji.specifyFilename")))]),e._v(" "),a("el-input",{attrs:{placeholder:e.$t("emoji.leaveEmptyFilename")},model:{value:e.copyToFilename,callback:function(t){e.copyToFilename=t},expression:"copyToFilename"}}),e._v(" "),a("el-button",{staticClass:"copy-to-local-pack-button",attrs:{disabled:!e.copyToLocalPackName,type:"primary"},on:{click:e.copyToLocal}},[e._v(e._s(e.$t("emoji.copy")))]),e._v(" "),a("el-button",{staticClass:"emoji-button",attrs:{slot:"reference",type:"primary"},slot:"reference"},[e._v(e._s(e.$t("emoji.copyToLocalPack")))])],1)],1)])},[],!1,null,null,null);d.options.__file="SingleEmojiEditor.vue";var u=d.exports,h={props:{packName:{type:String,required:!0}},data:function(){return{shortcode:"",imageUploadURL:"",customFileName:""}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device}},methods:{uploadEmoji:function(){var e=c()(s.a.mark(function e(t){var a;return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:a=t.file,e.prev=1,this.$store.dispatch("AddNewEmojiFile",{packName:this.packName,file:a||this.imageUploadURL,shortcode:this.shortcode,filename:this.customFileName}),e.next=8;break;case 5:return e.prev=5,e.t0=e.catch(1),e.abrupt("return");case 8:this.shortcode="",this.imageUploadURL="",this.customFileName="",this.$store.dispatch("ReloadEmoji");case 12:case"end":return e.stop()}},e,this,[[1,5]])}));return function(t){return e.apply(this,arguments)}}()}},k=(a("IVv3"),Object(p.a)(h,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("el-form",{staticClass:"new-emoji-uploader-form",attrs:{"label-position":e.isMobile?"top":"left","label-width":"130px",size:"small"}},[a("el-form-item",{attrs:{label:e.$t("emoji.shortcode")}},[a("el-input",{attrs:{placeholder:e.$t("emoji.optional")},model:{value:e.shortcode,callback:function(t){e.shortcode=t},expression:"shortcode"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.customFilename")}},[a("el-input",{attrs:{placeholder:e.$t("emoji.optional")},model:{value:e.customFileName,callback:function(t){e.customFileName=t},expression:"customFileName"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.uploadFile")}},[a("div",{staticClass:"upload-file-url"},[a("el-input",{attrs:{placeholder:e.$t("emoji.url")},model:{value:e.imageUploadURL,callback:function(t){e.imageUploadURL=t},expression:"imageUploadURL"}}),e._v(" "),a("el-button",{staticClass:"upload-button",attrs:{type:"primary"},on:{click:e.uploadEmoji}},[e._v(e._s(e.$t("emoji.upload")))])],1),e._v(" "),a("div",{staticClass:"upload-container"},[a("p",{staticClass:"text"},[e._v("or")]),e._v(" "),a("el-upload",{attrs:{"http-request":e.uploadEmoji,multiple:!1,"show-file-list":!1,action:"add"}},[a("el-button",{attrs:{type:"primary"}},[e._v(e._s(e.$t("emoji.clickToUpload")))])],1)],1)])],1)},[],!1,null,null,null));k.options.__file="NewEmojiUploader.vue";var f={components:{SingleEmojiEditor:u,NewEmojiUploader:k.exports},props:{name:{type:String,required:!0},pack:{type:Object,required:!0},host:{type:String,required:!0},isLocal:{type:Boolean,required:!0}},data:function(){return{showPackContent:[]}},computed:{isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"90px":(this.isTablet,"155px")},share:{get:function(){return this.pack.pack["share-files"]},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"share-files",value:e})}},homepage:{get:function(){return this.pack.pack.homepage},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"homepage",value:e})}},description:{get:function(){return this.pack.pack.description},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"description",value:e})}},license:{get:function(){return this.pack.pack.license},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"license",value:e})}},fallbackSrc:{get:function(){return this.pack.pack["fallback-src"]},set:function(e){""!==e.trim()?this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:e}):(this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:null}),this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src-sha256",value:null}))}}},methods:{deletePack:function(){var e=this;this.$confirm("This will delete the pack, are you sure?","Warning",{confirmButtonText:"Yes, delete the pack",cancelButtonText:"No, leave it be",type:"warning"}).then(function(){e.$store.dispatch("DeletePack",{name:e.name}).then(function(){return e.$store.dispatch("ReloadEmoji")}).then(function(){return e.$store.dispatch("SetLocalEmojiPacks")})}).catch(function(){})},savePackMetadata:function(){this.$store.dispatch("SavePackMetadata",{packName:this.name})}}},v=(a("LE4i"),Object(p.a)(f,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("el-collapse-item",{staticClass:"has-background",attrs:{title:e.name,name:e.name}},[a("el-form",{staticClass:"emoji-pack-metadata",attrs:{"label-width":e.labelWidth,"label-position":"left",size:"small"}},[a("el-form-item",{attrs:{label:e.$t("emoji.sharePack")}},[a("el-switch",{model:{value:e.share,callback:function(t){e.share=t},expression:"share"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.homepage")}},[a("el-input",{model:{value:e.homepage,callback:function(t){e.homepage=t},expression:"homepage"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.description")}},[a("el-input",{attrs:{type:"textarea"},model:{value:e.description,callback:function(t){e.description=t},expression:"description"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.license")}},[a("el-input",{model:{value:e.license,callback:function(t){e.license=t},expression:"license"}})],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrc")}},[a("el-input",{model:{value:e.fallbackSrc,callback:function(t){e.fallbackSrc=t},expression:"fallbackSrc"}})],1),e._v(" "),e.fallbackSrc&&""!==e.fallbackSrc.trim()?a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrcSha")}},[e._v("\n "+e._s(e.pack.pack["fallback-src-sha256"])+"\n ")]):e._e()],1),e._v(" "),a("div",{staticClass:"pack-button-container"},[a("div",{staticClass:"save-pack-button-container"},[a("el-button",{staticClass:"save-pack-button",attrs:{type:"primary"},on:{click:e.savePackMetadata}},[e._v(e._s(e.$t("emoji.saveMetadata")))]),e._v(" "),a("el-button",{staticClass:"delete-pack-button",on:{click:e.deletePack}},[e._v(e._s(e.$t("emoji.deletePack")))])],1),e._v(" "),a("div",{staticClass:"download-pack-button-container"},[e.pack.pack["can-download"]?a("el-link",{attrs:{href:"//"+e.host+"/api/pleroma/emoji/packs/"+e.name+"/download_shared",underline:!1,type:"primary",target:"_blank"}},[a("el-button",{staticClass:"download-archive"},[e._v(e._s(e.$t("emoji.downloadPackArchive")))])],1):e._e()],1)]),e._v(" "),a("el-collapse",{staticClass:"contents-collapse",model:{value:e.showPackContent,callback:function(t){e.showPackContent=t},expression:"showPackContent"}},[e.isLocal?a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.addNewEmoji"),name:"addEmoji"}},[a("new-emoji-uploader",{attrs:{"pack-name":e.name}})],1):e._e(),e._v(" "),e.pack.files.length>0?a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.manageEmoji"),name:"manageEmoji"}},e._l(e.pack.files,function(t){var o=t[0],s=t[1];return a("single-emoji-editor",{key:o,attrs:{host:e.host,"pack-name":e.name,shortcode:o,file:s,"is-local":e.isLocal}})}),1):e._e()],1)],1)},[],!1,null,null,null));v.options.__file="LocalEmojiPack.vue";var b=v.exports,j={components:{SingleEmojiEditor:u},props:{name:{type:String,required:!0},pack:{type:Object,required:!0},host:{type:String,required:!0},isLocal:{type:Boolean,required:!0}},data:function(){return{showPackContent:[],downloadSharedAs:""}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"90px":(this.isTablet,"120px")},loadRemotePack:function(){return this.$store.state.emojiPacks.activeCollapseItems.includes(this.name)},remoteInstanceAddress:function(){return this.$store.state.emojiPacks.remoteInstance},share:{get:function(){return this.pack.pack["share-files"]},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"share-files",value:e})}},homepage:{get:function(){return this.pack.pack.homepage},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"homepage",value:e})}},description:{get:function(){return this.pack.pack.description},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"description",value:e})}},license:{get:function(){return this.pack.pack.license},set:function(e){this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"license",value:e})}},fallbackSrc:{get:function(){return this.pack.pack["fallback-src"]},set:function(e){""!==e.trim()?this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:e}):(this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src",value:null}),this.$store.dispatch("UpdateLocalPackVal",{name:this.name,key:"fallback-src-sha256",value:null}))}}},methods:{downloadFromInstance:function(){var e=this;this.$store.dispatch("DownloadFrom",{instanceAddress:this.remoteInstanceAddress,packName:this.name,as:this.downloadSharedAs}).then(function(){return e.$store.dispatch("ReloadEmoji")}).then(function(){return e.$store.dispatch("SetLocalEmojiPacks")})}}},_=(a("Zd0x"),Object(p.a)(j,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("el-collapse-item",{staticClass:"has-background",attrs:{title:e.name,name:e.name}},[e.loadRemotePack?a("div",[a("el-form",{staticClass:"emoji-pack-metadata remote-pack-metadata",attrs:{"label-width":e.labelWidth,"label-position":"left",size:"small"}},[a("el-form-item",{attrs:{label:e.$t("emoji.sharePack")}},[a("el-switch",{attrs:{disabled:""},model:{value:e.share,callback:function(t){e.share=t},expression:"share"}})],1),e._v(" "),e.homepage?a("el-form-item",{attrs:{label:e.$t("emoji.homepage")}},[a("span",[e._v(e._s(e.homepage))])]):e._e(),e._v(" "),e.description?a("el-form-item",{attrs:{label:e.$t("emoji.description")}},[a("span",[e._v(e._s(e.description))])]):e._e(),e._v(" "),e.license?a("el-form-item",{attrs:{label:e.$t("emoji.license")}},[a("span",[e._v(e._s(e.license))])]):e._e(),e._v(" "),e.fallbackSrc?a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrc")}},[a("span",[e._v(e._s(e.fallbackSrc))])]):e._e(),e._v(" "),e.fallbackSrc&&""!==e.fallbackSrc.trim()?a("el-form-item",{attrs:{label:e.$t("emoji.fallbackSrcSha")}},[e._v("\n "+e._s(e.pack.pack["fallback-src-sha256"])+"\n ")]):e._e(),e._v(" "),a("el-form-item",[e.pack.pack["can-download"]?a("el-link",{attrs:{href:e.pack.pack["fallback-src"],underline:!1,type:"primary",target:"_blank"}},[a("el-button",{staticClass:"download-archive"},[e._v(e._s(e.$t("emoji.downloadPackArchive")))])],1):e._e()],1)],1),e._v(" "),a("el-collapse",{staticClass:"contents-collapse",model:{value:e.showPackContent,callback:function(t){e.showPackContent=t},expression:"showPackContent"}},[e.pack.files.length>0?a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.manageEmoji"),name:"manageEmoji"}},e._l(e.pack.files,function(t){var o=t[0],s=t[1];return a("single-emoji-editor",{key:o,attrs:{host:e.host,"pack-name":e.name,shortcode:o,file:s,"is-local":e.isLocal}})}),1):e._e(),e._v(" "),a("el-collapse-item",{staticClass:"no-background",attrs:{title:e.$t("emoji.downloadPack"),name:"downloadPack"}},[a("p",[e._v("\n "+e._s(e.$t("emoji.thisWillDownload"))+' "'+e._s(e.name)+'" '+e._s(e.$t("emoji.downloadToCurrentInstance"))+'\n "'+e._s(""===e.downloadSharedAs.trim()?e.name:e.downloadSharedAs)+'" ('+e._s(e.$t("emoji.canBeChanged"))+").\n "+e._s(e.$t("emoji.willBeUsable"))+".\n ")]),e._v(" "),a("div",{staticClass:"download-shared-pack"},[a("el-input",{attrs:{placeholder:e.$t("emoji.downloadAsOptional")},model:{value:e.downloadSharedAs,callback:function(t){e.downloadSharedAs=t},expression:"downloadSharedAs"}}),e._v(" "),a("el-button",{staticClass:"download-shared-pack-button",attrs:{type:"primary"},on:{click:e.downloadFromInstance}},[e._v("\n "+e._s(e.isDesktop?e.$t("emoji.downloadSharedPack"):e.$t("emoji.downloadSharedPackMobile"))+"\n ")])],1)])],1)],1):e._e()])},[],!1,null,null,null));_.options.__file="RemoteEmojiPack.vue";var $=_.exports,P=a("mSNy"),y={components:{LocalEmojiPack:b,RebootButton:a("rIUS").a,RemoteEmojiPack:$},data:function(){return{newPackName:"",activeLocalPack:[],activeRemotePack:[],fullscreenLoading:!1}},computed:{isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},labelWidth:function(){return this.isMobile?"105px":this.isTablet?"180px":"240px"},localPacks:function(){return this.$store.state.emojiPacks.localPacks},remoteInstanceAddress:{get:function(){return this.$store.state.emojiPacks.remoteInstance},set:function(e){this.$store.dispatch("SetRemoteInstance",e)}},remotePacks:function(){return this.$store.state.emojiPacks.remotePacks}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.refreshLocalPacks()},methods:{createLocalPack:function(){var e=this;this.$store.dispatch("CreatePack",{name:this.newPackName}).then(function(){e.newPackName="",e.$store.dispatch("SetLocalEmojiPacks"),e.$store.dispatch("ReloadEmoji")})},importFromFS:function(){var e=this;this.$store.dispatch("ImportFromFS").then(function(){e.$store.dispatch("SetLocalEmojiPacks"),e.$store.dispatch("ReloadEmoji")})},sortPack:function(e){var t=Object.keys(e.files).sort(function(e,t){return e.localeCompare(t)}).map(function(t){return[t,e.files[t]]});return n()({},e,{files:t})},refreshLocalPacks:function(){try{this.$store.dispatch("SetLocalEmojiPacks")}catch(e){return}this.$message({type:"success",message:P.a.t("emoji.refreshed")})},refreshRemotePacks:function(){var e=c()(s.a.mark(function e(){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return this.fullscreenLoading=!0,e.next=3,this.$store.dispatch("SetRemoteEmojiPacks",{remoteInstance:this.remoteInstanceAddress});case 3:this.fullscreenLoading=!1;case 4:case"end":return e.stop()}},e,this)}));return function(){return e.apply(this,arguments)}}(),reloadEmoji:function(){var e=c()(s.a.mark(function e(){return s.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:e.prev=0,this.$store.dispatch("ReloadEmoji"),e.next=7;break;case 4:return e.prev=4,e.t0=e.catch(0),e.abrupt("return");case 7:this.$message({type:"success",message:P.a.t("emoji.reloaded")});case 8:case"end":return e.stop()}},e,this,[[0,4]])}));return function(){return e.apply(this,arguments)}}(),setActiveCollapseItems:function(e){var t=Array.isArray(e)?e:[e];this.$store.dispatch("SetActiveCollapseItems",t)}}},w=(a("smuD"),Object(p.a)(y,function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"emoji-packs"},[a("div",{staticClass:"emoji-packs-header"},[a("h1",[e._v(e._s(e.$t("emoji.emojiPacks")))]),e._v(" "),a("reboot-button")],1),e._v(" "),a("div",{staticClass:"emoji-header-container"},[a("div",{staticClass:"emoji-packs-header-button-container"},[a("el-button",{staticClass:"reload-emoji-button",attrs:{type:"primary"},on:{click:e.reloadEmoji}},[e._v(e._s(e.$t("emoji.reloadEmoji")))]),e._v(" "),a("el-tooltip",{attrs:{content:e.$t("emoji.importEmojiTooltip"),effects:"dark",placement:"bottom","popper-class":"import-pack-button"}},[a("el-button",{attrs:{type:"primary"},on:{click:e.importFromFS}},[e._v("\n "+e._s(e.$t("emoji.importPacks"))+"\n ")])],1)],1)]),e._v(" "),a("el-divider",{staticClass:"divider"}),e._v(" "),a("el-form",{staticClass:"emoji-packs-form",attrs:{"label-width":e.labelWidth}},[a("el-form-item",{attrs:{label:e.$t("emoji.localPacks")}},[a("el-button",{attrs:{type:"primary"},on:{click:e.refreshLocalPacks}},[e._v(e._s(e.$t("emoji.refreshLocalPacks")))])],1),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.createLocalPack")}},[a("div",{staticClass:"create-pack"},[a("el-input",{attrs:{placeholder:e.$t("users.name")},model:{value:e.newPackName,callback:function(t){e.newPackName=t},expression:"newPackName"}}),e._v(" "),a("el-button",{staticClass:"create-pack-button",attrs:{disabled:""===e.newPackName.trim()},on:{click:e.createLocalPack}},[e._v("\n "+e._s(e.$t("users.create"))+"\n ")])],1)]),e._v(" "),Object.keys(e.localPacks).length>0?a("el-form-item",{attrs:{label:e.$t("emoji.packs")}},e._l(e.localPacks,function(t,o){return a("el-collapse",{key:o,model:{value:e.activeLocalPack,callback:function(t){e.activeLocalPack=t},expression:"activeLocalPack"}},[a("local-emoji-pack",{attrs:{name:o,pack:e.sortPack(t),host:e.$store.getters.authHost,"is-local":!0}})],1)}),1):e._e(),e._v(" "),a("el-divider",{staticClass:"divider"}),e._v(" "),a("el-form-item",{attrs:{label:e.$t("emoji.remotePacks")}},[a("div",{staticClass:"create-pack"},[a("el-input",{attrs:{placeholder:e.$t("emoji.remoteInstanceAddress")},model:{value:e.remoteInstanceAddress,callback:function(t){e.remoteInstanceAddress=t},expression:"remoteInstanceAddress"}}),e._v(" "),a("el-button",{directives:[{name:"loading",rawName:"v-loading.fullscreen.lock",value:e.fullscreenLoading,expression:"fullscreenLoading",modifiers:{fullscreen:!0,lock:!0}}],staticClass:"create-pack-button",attrs:{disabled:""===e.remoteInstanceAddress.trim()},on:{click:e.refreshRemotePacks}},[e._v("\n "+e._s(e.$t("emoji.refreshRemote"))+"\n ")])],1)]),e._v(" "),Object.keys(e.remotePacks).length>0?a("el-form-item",{attrs:{label:e.$t("emoji.packs")}},e._l(e.remotePacks,function(t,o){return a("el-collapse",{key:o,on:{change:e.setActiveCollapseItems},model:{value:e.activeRemotePack,callback:function(t){e.activeRemotePack=t},expression:"activeRemotePack"}},[a("remote-emoji-pack",{attrs:{name:o,pack:e.sortPack(t),host:e.$store.getters.authHost,"is-local":!1}})],1)}),1):e._e()],1)],1)},[],!1,null,null,null));w.options.__file="index.vue";t.default=w.exports},"4ySm":function(e,t,a){"use strict";var o=a("n6gr");a.n(o).a},"6lYW":function(e,t,a){},HBNe:function(e,t,a){},IVv3:function(e,t,a){"use strict";var o=a("6lYW");a.n(o).a},LE4i:function(e,t,a){"use strict";var o=a("HBNe");a.n(o).a},QZC8:function(e,t,a){},Zd0x:function(e,t,a){"use strict";var o=a("eDOw");a.n(o).a},eDOw:function(e,t,a){},n6gr:function(e,t,a){},smuD:function(e,t,a){"use strict";var o=a("QZC8");a.n(o).a}}]); +//# sourceMappingURL=chunk-c5f4.304479e7.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-c5f4.304479e7.js.map b/priv/static/adminfe/static/js/chunk-c5f4.304479e7.js.map new file mode 100644 index 000000000..2ab89731d --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-c5f4.304479e7.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/emojiPacks/index.vue?f3a6","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue?5a7e","webpack:///src/views/emojiPacks/components/SingleEmojiEditor.vue","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue?9e34","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue?1c09","webpack:///src/views/emojiPacks/components/NewEmojiUploader.vue","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue?e7aa","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue?88cd","webpack:///src/views/emojiPacks/components/LocalEmojiPack.vue","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue?a6c1","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue?4c9f","webpack:///src/views/emojiPacks/components/RemoteEmojiPack.vue","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue?d192","webpack:///./src/views/emojiPacks/index.vue?a332","webpack:///src/views/emojiPacks/index.vue","webpack:///./src/views/emojiPacks/index.vue","webpack:///./src/views/emojiPacks/components/SingleEmojiEditor.vue?bc44","webpack:///./src/views/emojiPacks/components/NewEmojiUploader.vue?d98f","webpack:///./src/views/emojiPacks/components/LocalEmojiPack.vue?2a38","webpack:///./src/views/emojiPacks/components/RemoteEmojiPack.vue?118a","webpack:///./src/views/emojiPacks/index.vue?7b86"],"names":["components_SingleEmojiEditorvue_type_script_lang_js_","props","host","type","String","required","packName","shortcode","file","isLocal","Boolean","data","newShortcode","newFile","copyToLocalPackName","copyPopoverVisible","copyToShortcode","copyToFilename","computed","emojiName","get","this","set","val","emojiFile","isDesktop","$store","state","app","device","isMobile","localPacks","emojiPacks","remoteInstance","URL","methods","update","_update","asyncToGenerator_default","regenerator_default","a","mark","_callee","wrap","_context","prev","next","dispatch","newFilename","force","t0","abrupt","stop","apply","arguments","remove","_this","$confirm","confirmButtonText","cancelButtonText","then","copyToLocal","addressOfEmojiInPack","trim","filename","e","copyToLocalVisible","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","class","staticClass","attrs","src","_v","placeholder","$t","model","value","callback","$$v","expression","on","click","_s","_e","placement","popper-class","_l","_pack","name","key","label","disabled","slot","options","__file","SingleEmojiEditor","components_NewEmojiUploadervue_type_script_lang_js_","imageUploadURL","customFileName","uploadEmoji","_uploadEmoji","_ref","_x","NewEmojiUploader_component","label-position","label-width","size","http-request","multiple","show-file-list","action","components_LocalEmojiPackvue_type_script_lang_js_","components","NewEmojiUploader","pack","showPackContent","isTablet","labelWidth","share","homepage","description","license","fallbackSrc","deletePack","catch","savePackMetadata","LocalEmojiPack_component","title","href","underline","target","pack-name","files","length","ref","is-local","LocalEmojiPack","components_RemoteEmojiPackvue_type_script_lang_js_","downloadSharedAs","loadRemotePack","activeCollapseItems","includes","remoteInstanceAddress","downloadFromInstance","instanceAddress","as","RemoteEmojiPack_component","RemoteEmojiPack","views_emojiPacksvue_type_script_lang_js_","RebootButton","newPackName","activeLocalPack","activeRemotePack","fullscreenLoading","instance","remotePacks","mounted","refreshLocalPacks","createLocalPack","importFromFS","_this2","sortPack","orderedFiles","keys","sort","b","localeCompare","map","objectSpread_default","$message","message","lang","t","refreshRemotePacks","_refreshRemotePacks","reloadEmoji","_reloadEmoji","_callee2","_context2","setActiveCollapseItems","activeItems","items","Array","isArray","emojiPacks_component","content","effects","getters","authHost","directives","rawName","modifiers","fullscreen","lock","change","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_SingleEmojiEditor_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_NewEmojiUploader_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_LocalEmojiPack_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_RemoteEmojiPack_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__"],"mappings":"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","file":"static/js/chunk-c5f4.304479e7.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"emoji-packs\"},[_c('div',{staticClass:\"emoji-packs-header\"},[_c('h1',[_vm._v(_vm._s(_vm.$t('emoji.emojiPacks')))]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"emoji-header-container\"},[_c('div',{staticClass:\"emoji-packs-header-button-container\"},[_c('el-button',{staticClass:\"reload-emoji-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.reloadEmoji}},[_vm._v(_vm._s(_vm.$t('emoji.reloadEmoji')))]),_vm._v(\" \"),_c('el-tooltip',{attrs:{\"content\":_vm.$t('emoji.importEmojiTooltip'),\"effects\":\"dark\",\"placement\":\"bottom\",\"popper-class\":\"import-pack-button\"}},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.importFromFS}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.importPacks'))+\"\\n \")])],1)],1)]),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('el-form',{staticClass:\"emoji-packs-form\",attrs:{\"label-width\":_vm.labelWidth}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.localPacks')}},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.refreshLocalPacks}},[_vm._v(_vm._s(_vm.$t('emoji.refreshLocalPacks')))])],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.createLocalPack')}},[_c('div',{staticClass:\"create-pack\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('users.name')},model:{value:(_vm.newPackName),callback:function ($$v) {_vm.newPackName=$$v},expression:\"newPackName\"}}),_vm._v(\" \"),_c('el-button',{staticClass:\"create-pack-button\",attrs:{\"disabled\":_vm.newPackName.trim() === ''},on:{\"click\":_vm.createLocalPack}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.create'))+\"\\n \")])],1)]),_vm._v(\" \"),(Object.keys(_vm.localPacks).length > 0)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.packs')}},_vm._l((_vm.localPacks),function(pack,name){return _c('el-collapse',{key:name,model:{value:(_vm.activeLocalPack),callback:function ($$v) {_vm.activeLocalPack=$$v},expression:\"activeLocalPack\"}},[_c('local-emoji-pack',{attrs:{\"name\":name,\"pack\":_vm.sortPack(pack),\"host\":_vm.$store.getters.authHost,\"is-local\":true}})],1)}),1):_vm._e(),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.remotePacks')}},[_c('div',{staticClass:\"create-pack\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.remoteInstanceAddress')},model:{value:(_vm.remoteInstanceAddress),callback:function ($$v) {_vm.remoteInstanceAddress=$$v},expression:\"remoteInstanceAddress\"}}),_vm._v(\" \"),_c('el-button',{directives:[{name:\"loading\",rawName:\"v-loading.fullscreen.lock\",value:(_vm.fullscreenLoading),expression:\"fullscreenLoading\",modifiers:{\"fullscreen\":true,\"lock\":true}}],staticClass:\"create-pack-button\",attrs:{\"disabled\":_vm.remoteInstanceAddress.trim() === ''},on:{\"click\":_vm.refreshRemotePacks}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.refreshRemote'))+\"\\n \")])],1)]),_vm._v(\" \"),(Object.keys(_vm.remotePacks).length > 0)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.packs')}},_vm._l((_vm.remotePacks),function(pack,name){return _c('el-collapse',{key:name,on:{\"change\":_vm.setActiveCollapseItems},model:{value:(_vm.activeRemotePack),callback:function ($$v) {_vm.activeRemotePack=$$v},expression:\"activeRemotePack\"}},[_c('remote-emoji-pack',{attrs:{\"name\":name,\"pack\":_vm.sortPack(pack),\"host\":_vm.$store.getters.authHost,\"is-local\":false}})],1)}),1):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./SingleEmojiEditor.vue?vue&type=template&id=5d2cbcfa&\"\nimport script from \"./SingleEmojiEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./SingleEmojiEditor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SingleEmojiEditor.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"SingleEmojiEditor.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.isLocal)?_c('div',{class:_vm.isMobile ? 'emoji-container-flex' : 'emoji-container-grid'},[_c('img',{staticClass:\"emoji-preview-img\",attrs:{\"src\":_vm.addressOfEmojiInPack(_vm.host, _vm.packName, _vm.file)}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"placeholder\":_vm.$t('emoji.shortcode')},model:{value:(_vm.emojiName),callback:function ($$v) {_vm.emojiName=$$v},expression:\"emojiName\"}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"placeholder\":_vm.$t('emoji.file')},model:{value:(_vm.emojiFile),callback:function ($$v) {_vm.emojiFile=$$v},expression:\"emojiFile\"}}),_vm._v(\" \"),_c('div',{staticClass:\"emoji-buttons\"},[_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":_vm.update}},[_vm._v(_vm._s(_vm.$t('emoji.update')))]),_vm._v(\" \"),_c('el-button',{staticClass:\"remove-emoji-button\",on:{\"click\":_vm.remove}},[_vm._v(_vm._s(_vm.$t('emoji.remove')))])],1)],1):_vm._e(),_vm._v(\" \"),(!_vm.isLocal)?_c('div',{class:_vm.isMobile ? 'emoji-container-flex' : 'remote-emoji-container-grid'},[_c('img',{staticClass:\"emoji-preview-img\",attrs:{\"src\":_vm.addressOfEmojiInPack(_vm.remoteInstance, _vm.packName, _vm.file)}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"value\":_vm.emojiName,\"placeholder\":_vm.$t('emoji.shortcode')}}),_vm._v(\" \"),_c('el-input',{staticClass:\"emoji-info\",attrs:{\"value\":_vm.emojiFile,\"placeholder\":_vm.$t('emoji.file')}}),_vm._v(\" \"),_c('el-popover',{staticClass:\"copy-pack-container\",attrs:{\"placement\":\"left-start\",\"popper-class\":\"copy-popover\"},model:{value:(_vm.copyPopoverVisible),callback:function ($$v) {_vm.copyPopoverVisible=$$v},expression:\"copyPopoverVisible\"}},[_c('p',[_vm._v(_vm._s(_vm.$t('emoji.selectLocalPack')))]),_vm._v(\" \"),_c('el-select',{staticClass:\"copy-pack-select\",attrs:{\"placeholder\":_vm.$t('emoji.localPack')},model:{value:(_vm.copyToLocalPackName),callback:function ($$v) {_vm.copyToLocalPackName=$$v},expression:\"copyToLocalPackName\"}},_vm._l((_vm.localPacks),function(_pack,name){return _c('el-option',{key:name,attrs:{\"label\":name,\"value\":name}})}),1),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('emoji.specifyShortcode')))]),_vm._v(\" \"),_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.leaveEmptyShortcode')},model:{value:(_vm.copyToShortcode),callback:function ($$v) {_vm.copyToShortcode=$$v},expression:\"copyToShortcode\"}}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.$t('emoji.specifyFilename')))]),_vm._v(\" \"),_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.leaveEmptyFilename')},model:{value:(_vm.copyToFilename),callback:function ($$v) {_vm.copyToFilename=$$v},expression:\"copyToFilename\"}}),_vm._v(\" \"),_c('el-button',{staticClass:\"copy-to-local-pack-button\",attrs:{\"disabled\":!_vm.copyToLocalPackName,\"type\":\"primary\"},on:{\"click\":_vm.copyToLocal}},[_vm._v(_vm._s(_vm.$t('emoji.copy')))]),_vm._v(\" \"),_c('el-button',{staticClass:\"emoji-button\",attrs:{\"slot\":\"reference\",\"type\":\"primary\"},slot:\"reference\"},[_vm._v(_vm._s(_vm.$t('emoji.copyToLocalPack')))])],1)],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./NewEmojiUploader.vue?vue&type=template&id=403a380a&\"\nimport script from \"./NewEmojiUploader.vue?vue&type=script&lang=js&\"\nexport * from \"./NewEmojiUploader.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewEmojiUploader.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"NewEmojiUploader.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-form',{staticClass:\"new-emoji-uploader-form\",attrs:{\"label-position\":_vm.isMobile ? 'top' : 'left',\"label-width\":\"130px\",\"size\":\"small\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.shortcode')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.optional')},model:{value:(_vm.shortcode),callback:function ($$v) {_vm.shortcode=$$v},expression:\"shortcode\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.customFilename')}},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.optional')},model:{value:(_vm.customFileName),callback:function ($$v) {_vm.customFileName=$$v},expression:\"customFileName\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.uploadFile')}},[_c('div',{staticClass:\"upload-file-url\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.url')},model:{value:(_vm.imageUploadURL),callback:function ($$v) {_vm.imageUploadURL=$$v},expression:\"imageUploadURL\"}}),_vm._v(\" \"),_c('el-button',{staticClass:\"upload-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.uploadEmoji}},[_vm._v(_vm._s(_vm.$t('emoji.upload')))])],1),_vm._v(\" \"),_c('div',{staticClass:\"upload-container\"},[_c('p',{staticClass:\"text\"},[_vm._v(\"or\")]),_vm._v(\" \"),_c('el-upload',{attrs:{\"http-request\":_vm.uploadEmoji,\"multiple\":false,\"show-file-list\":false,\"action\":\"add\"}},[_c('el-button',{attrs:{\"type\":\"primary\"}},[_vm._v(_vm._s(_vm.$t('emoji.clickToUpload')))])],1)],1)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./LocalEmojiPack.vue?vue&type=template&id=1f26166f&\"\nimport script from \"./LocalEmojiPack.vue?vue&type=script&lang=js&\"\nexport * from \"./LocalEmojiPack.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LocalEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"LocalEmojiPack.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-collapse-item',{staticClass:\"has-background\",attrs:{\"title\":_vm.name,\"name\":_vm.name}},[_c('el-form',{staticClass:\"emoji-pack-metadata\",attrs:{\"label-width\":_vm.labelWidth,\"label-position\":\"left\",\"size\":\"small\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.sharePack')}},[_c('el-switch',{model:{value:(_vm.share),callback:function ($$v) {_vm.share=$$v},expression:\"share\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.homepage')}},[_c('el-input',{model:{value:(_vm.homepage),callback:function ($$v) {_vm.homepage=$$v},expression:\"homepage\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.description')}},[_c('el-input',{attrs:{\"type\":\"textarea\"},model:{value:(_vm.description),callback:function ($$v) {_vm.description=$$v},expression:\"description\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.license')}},[_c('el-input',{model:{value:(_vm.license),callback:function ($$v) {_vm.license=$$v},expression:\"license\"}})],1),_vm._v(\" \"),_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrc')}},[_c('el-input',{model:{value:(_vm.fallbackSrc),callback:function ($$v) {_vm.fallbackSrc=$$v},expression:\"fallbackSrc\"}})],1),_vm._v(\" \"),(_vm.fallbackSrc && _vm.fallbackSrc.trim() !== '')?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrcSha')}},[_vm._v(\"\\n \"+_vm._s(_vm.pack.pack[\"fallback-src-sha256\"])+\"\\n \")]):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"pack-button-container\"},[_c('div',{staticClass:\"save-pack-button-container\"},[_c('el-button',{staticClass:\"save-pack-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.savePackMetadata}},[_vm._v(_vm._s(_vm.$t('emoji.saveMetadata')))]),_vm._v(\" \"),_c('el-button',{staticClass:\"delete-pack-button\",on:{\"click\":_vm.deletePack}},[_vm._v(_vm._s(_vm.$t('emoji.deletePack')))])],1),_vm._v(\" \"),_c('div',{staticClass:\"download-pack-button-container\"},[(_vm.pack.pack['can-download'])?_c('el-link',{attrs:{\"href\":(\"//\" + _vm.host + \"/api/pleroma/emoji/packs/\" + _vm.name + \"/download_shared\"),\"underline\":false,\"type\":\"primary\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"download-archive\"},[_vm._v(_vm._s(_vm.$t('emoji.downloadPackArchive')))])],1):_vm._e()],1)]),_vm._v(\" \"),_c('el-collapse',{staticClass:\"contents-collapse\",model:{value:(_vm.showPackContent),callback:function ($$v) {_vm.showPackContent=$$v},expression:\"showPackContent\"}},[(_vm.isLocal)?_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.addNewEmoji'),\"name\":\"addEmoji\"}},[_c('new-emoji-uploader',{attrs:{\"pack-name\":_vm.name}})],1):_vm._e(),_vm._v(\" \"),(_vm.pack.files.length > 0)?_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.manageEmoji'),\"name\":\"manageEmoji\"}},_vm._l((_vm.pack.files),function(ref){\nvar shortcode = ref[0];\nvar file = ref[1];\nreturn _c('single-emoji-editor',{key:shortcode,attrs:{\"host\":_vm.host,\"pack-name\":_vm.name,\"shortcode\":shortcode,\"file\":file,\"is-local\":_vm.isLocal}})}),1):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./RemoteEmojiPack.vue?vue&type=template&id=6ff625b1&\"\nimport script from \"./RemoteEmojiPack.vue?vue&type=script&lang=js&\"\nexport * from \"./RemoteEmojiPack.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RemoteEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"RemoteEmojiPack.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-collapse-item',{staticClass:\"has-background\",attrs:{\"title\":_vm.name,\"name\":_vm.name}},[(_vm.loadRemotePack)?_c('div',[_c('el-form',{staticClass:\"emoji-pack-metadata remote-pack-metadata\",attrs:{\"label-width\":_vm.labelWidth,\"label-position\":\"left\",\"size\":\"small\"}},[_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.sharePack')}},[_c('el-switch',{attrs:{\"disabled\":\"\"},model:{value:(_vm.share),callback:function ($$v) {_vm.share=$$v},expression:\"share\"}})],1),_vm._v(\" \"),(_vm.homepage)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.homepage')}},[_c('span',[_vm._v(_vm._s(_vm.homepage))])]):_vm._e(),_vm._v(\" \"),(_vm.description)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.description')}},[_c('span',[_vm._v(_vm._s(_vm.description))])]):_vm._e(),_vm._v(\" \"),(_vm.license)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.license')}},[_c('span',[_vm._v(_vm._s(_vm.license))])]):_vm._e(),_vm._v(\" \"),(_vm.fallbackSrc)?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrc')}},[_c('span',[_vm._v(_vm._s(_vm.fallbackSrc))])]):_vm._e(),_vm._v(\" \"),(_vm.fallbackSrc && _vm.fallbackSrc.trim() !== '')?_c('el-form-item',{attrs:{\"label\":_vm.$t('emoji.fallbackSrcSha')}},[_vm._v(\"\\n \"+_vm._s(_vm.pack.pack[\"fallback-src-sha256\"])+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-form-item',[(_vm.pack.pack['can-download'])?_c('el-link',{attrs:{\"href\":_vm.pack.pack['fallback-src'],\"underline\":false,\"type\":\"primary\",\"target\":\"_blank\"}},[_c('el-button',{staticClass:\"download-archive\"},[_vm._v(_vm._s(_vm.$t('emoji.downloadPackArchive')))])],1):_vm._e()],1)],1),_vm._v(\" \"),_c('el-collapse',{staticClass:\"contents-collapse\",model:{value:(_vm.showPackContent),callback:function ($$v) {_vm.showPackContent=$$v},expression:\"showPackContent\"}},[(_vm.pack.files.length > 0)?_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.manageEmoji'),\"name\":\"manageEmoji\"}},_vm._l((_vm.pack.files),function(ref){\nvar shortcode = ref[0];\nvar file = ref[1];\nreturn _c('single-emoji-editor',{key:shortcode,attrs:{\"host\":_vm.host,\"pack-name\":_vm.name,\"shortcode\":shortcode,\"file\":file,\"is-local\":_vm.isLocal}})}),1):_vm._e(),_vm._v(\" \"),_c('el-collapse-item',{staticClass:\"no-background\",attrs:{\"title\":_vm.$t('emoji.downloadPack'),\"name\":\"downloadPack\"}},[_c('p',[_vm._v(\"\\n \"+_vm._s(_vm.$t('emoji.thisWillDownload'))+\" \\\"\"+_vm._s(_vm.name)+\"\\\" \"+_vm._s(_vm.$t('emoji.downloadToCurrentInstance'))+\"\\n \\\"\"+_vm._s(_vm.downloadSharedAs.trim() === '' ? _vm.name : _vm.downloadSharedAs)+\"\\\" (\"+_vm._s(_vm.$t('emoji.canBeChanged'))+\").\\n \"+_vm._s(_vm.$t('emoji.willBeUsable'))+\".\\n \")]),_vm._v(\" \"),_c('div',{staticClass:\"download-shared-pack\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('emoji.downloadAsOptional')},model:{value:(_vm.downloadSharedAs),callback:function ($$v) {_vm.downloadSharedAs=$$v},expression:\"downloadSharedAs\"}}),_vm._v(\" \"),_c('el-button',{staticClass:\"download-shared-pack-button\",attrs:{\"type\":\"primary\"},on:{\"click\":_vm.downloadFromInstance}},[_vm._v(\"\\n \"+_vm._s(_vm.isDesktop ? _vm.$t('emoji.downloadSharedPack') : _vm.$t('emoji.downloadSharedPackMobile'))+\"\\n \")])],1)])],1)],1):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=631f1c16&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SingleEmojiEditor.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewEmojiUploader.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LocalEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RemoteEmojiPack.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\""],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-commons.5a106955.js b/priv/static/adminfe/static/js/chunk-commons.5a106955.js new file mode 100644 index 000000000..a6cf2ce52 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-commons.5a106955.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-commons"],{Kw8l:function(t,s,e){"use strict";var a=e("cRgN");e.n(a).a},cRgN:function(t,s,e){},ot3S:function(t,s,e){"use strict";var a=e("wd/R"),n=e.n(a),i={name:"Status",props:{account:{type:Object,required:!1,default:function(){return{}}},fetchStatusesByInstance:{type:Boolean,required:!1,default:!1},showCheckbox:{type:Boolean,required:!0,default:!1},status:{type:Object,required:!0},page:{type:Number,required:!1,default:0},userId:{type:String,required:!1,default:""},godmode:{type:Boolean,required:!1,default:!1}},data:function(){return{showHiddenStatus:!1}},methods:{capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},changeStatus:function(t,s,e){this.$store.dispatch("ChangeStatusScope",{statusId:t,isSensitive:s,visibility:e,reportCurrentPage:this.page,userId:this.userId,godmode:this.godmode,fetchStatusesByInstance:this.fetchStatusesByInstance})},deleteStatus:function(t){var s=this;this.$confirm("Are you sure you want to delete this status?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){s.$store.dispatch("DeleteStatus",{statusId:t,reportCurrentPage:s.page,userId:s.userId,godmode:s.godmode,fetchStatusesByInstance:s.fetchStatusesByInstance}),s.$message({type:"success",message:"Delete completed"})}).catch(function(){s.$message({type:"info",message:"Delete canceled"})})},handleStatusSelection:function(t){this.$emit("status-selection",t)},handleRouteChange:function(){this.$router.push({name:"StatusShow",params:{id:this.status.id}})},optionPercent:function(t,s){var e=t.options.reduce(function(t,s){return t+s.votes_count},0);return 0===e?0:+(s.votes_count/e*100).toFixed(1)},parseTimestamp:function(t){return n()(t).format("YYYY-MM-DD HH:mm")},propertyExists:function(t,s,e){return e?t[s]&&t[e]:t[s]}}},o=(e("Kw8l"),e("KHd+")),r=Object(o.a)(i,function(){var t=this,s=t.$createElement,e=t._self._c||s;return t.status.deleted?e("el-card",{staticClass:"status-card"},[e("div",{attrs:{slot:"header"},slot:"header"},[e("div",{staticClass:"status-header"},[e("div",{staticClass:"status-account-container"},[e("div",{staticClass:"status-account"},[e("h4",{staticClass:"status-deleted"},[t._v(t._s(t.$t("reports.statusDeleted")))])])])])]),t._v(" "),e("div",{staticClass:"status-body"},[t.status.content?e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}):e("span",{staticClass:"status-without-content"},[t._v("no content")])]),t._v(" "),e("div",{staticClass:"status-footer"},[t.status.created_at?e("span",{staticClass:"status-created-at"},[t._v(t._s(t.parseTimestamp(t.status.created_at)))]):t._e(),t._v(" "),t.status.url?e("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"},on:{click:function(t){t.stopPropagation()}}},[t._v("\n Open status in instance\n "),e("i",{staticClass:"el-icon-top-right"})]):t._e()])]):e("el-card",{staticClass:"status-card",nativeOn:{click:function(s){return t.handleRouteChange()}}},[e("div",{attrs:{slot:"header"},slot:"header"},[e("div",{staticClass:"status-header"},[e("div",{staticClass:"status-account-container"},[e("div",{staticClass:"status-account"},[t.showCheckbox?e("el-checkbox",{staticClass:"status-checkbox",on:{change:function(s){return t.handleStatusSelection(t.account)}}}):t._e(),t._v(" "),t.propertyExists(t.account,"id")?e("router-link",{staticClass:"router-link",attrs:{to:{name:"UsersShow",params:{id:t.account.id}}},nativeOn:{click:function(t){t.stopPropagation()}}},[e("div",{staticClass:"status-card-header"},[t.propertyExists(t.account,"avatar")?e("img",{staticClass:"status-avatar-img",attrs:{src:t.account.avatar}}):t._e(),t._v(" "),t.propertyExists(t.account,"nickname")?e("span",{staticClass:"status-account-name"},[t._v(t._s(t.account.nickname))]):e("span",[t.propertyExists(t.account,"nickname")?e("span",{staticClass:"status-account-name"},[t._v("\n "+t._s(t.account.nickname)+"\n ")]):e("span",{staticClass:"status-account-name deactivated"},[t._v("("+t._s(t.$t("users.invalidNickname"))+")")])])])]):t._e()],1)]),t._v(" "),e("div",{staticClass:"status-actions"},[e("div",{staticClass:"status-tags"},[t.status.sensitive?e("el-tag",{attrs:{type:"warning",size:"large"}},[t._v(t._s(t.$t("reports.sensitive")))]):t._e(),t._v(" "),e("el-tag",{attrs:{size:"large"}},[t._v(t._s(t.capitalizeFirstLetter(t.status.visibility)))])],1),t._v(" "),e("el-dropdown",{attrs:{trigger:"click"},nativeOn:{click:function(t){t.stopPropagation()}}},[e("el-button",{staticClass:"status-actions-button",attrs:{plain:"",size:"small",icon:"el-icon-edit"}},[t._v("\n "+t._s(t.$t("reports.changeScope"))),e("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),e("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[t.status.sensitive?t._e():e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,!0,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.addSensitive"))+"\n ")]),t._v(" "),t.status.sensitive?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,!1,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.removeSensitive"))+"\n ")]):t._e(),t._v(" "),"public"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"public")}}},[t._v("\n "+t._s(t.$t("reports.public"))+"\n ")]):t._e(),t._v(" "),"private"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"private")}}},[t._v("\n "+t._s(t.$t("reports.private"))+"\n ")]):t._e(),t._v(" "),"unlisted"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"unlisted")}}},[t._v("\n "+t._s(t.$t("reports.unlisted"))+"\n ")]):t._e(),t._v(" "),e("el-dropdown-item",{nativeOn:{click:function(s){return t.deleteStatus(t.status.id)}}},[t._v("\n "+t._s(t.$t("reports.deleteStatus"))+"\n ")])],1)],1)],1)])]),t._v(" "),e("div",{staticClass:"status-body"},[t.status.spoiler_text?e("div",[e("strong",[t._v(t._s(t.status.spoiler_text))]),t._v(" "),t.showHiddenStatus?t._e():e("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(s){t.showHiddenStatus=!0}}},[t._v("Show more")]),t._v(" "),t.showHiddenStatus?e("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(s){t.showHiddenStatus=!1}}},[t._v("Show less")]):t._e(),t._v(" "),t.showHiddenStatus?e("div",[e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?e("div",{staticClass:"poll"},[e("ul",t._l(t.status.poll.options,function(s,a){return e("li",{key:a},[t._v("\n "+t._s(s.title)+"\n "),e("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,s)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,s){return e("div",{key:s,staticClass:"image"},[e("img",{attrs:{src:t.preview_url}})])})],2):t._e()],1):t._e(),t._v(" "),t.status.spoiler_text?t._e():e("div",[e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?e("div",{staticClass:"poll"},[e("ul",t._l(t.status.poll.options,function(s,a){return e("li",{key:a},[t._v("\n "+t._s(s.title)+"\n "),e("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,s)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,s){return e("div",{key:s,staticClass:"image"},[e("img",{attrs:{src:t.preview_url}})])})],2),t._v(" "),e("div",{staticClass:"status-footer"},[e("span",{staticClass:"status-created-at"},[t._v(t._s(t.parseTimestamp(t.status.created_at)))]),t._v(" "),t.status.url?e("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"},on:{click:function(t){t.stopPropagation()}}},[t._v("\n "+t._s(t.$t("statuses.openStatusInInstance"))+"\n "),e("i",{staticClass:"el-icon-top-right"})]):t._e()])])])},[],!1,null,null,null);r.options.__file="index.vue";s.a=r.exports},rIUS:function(t,s,e){"use strict";var a=e("o0o1"),n=e.n(a),i=e("yXPU"),o=e.n(i),r=e("mSNy"),c={name:"RebootButton",computed:{needReboot:function(){return this.$store.state.app.needReboot}},methods:{restartApp:function(){var t=o()(n.a.mark(function t(){return n.a.wrap(function(t){for(;;)switch(t.prev=t.next){case 0:return t.prev=0,t.next=3,this.$store.dispatch("RestartApplication");case 3:t.next=8;break;case 5:return t.prev=5,t.t0=t.catch(0),t.abrupt("return");case 8:this.$message({type:"success",message:r.a.t("settings.restartSuccess")});case 9:case"end":return t.stop()}},t,this,[[0,5]])}));return function(){return t.apply(this,arguments)}}()}},u=e("KHd+"),l=Object(u.a)(c,function(){var t=this.$createElement,s=this._self._c||t;return this.needReboot?s("el-tooltip",{attrs:{content:this.$t("settings.restartApp"),placement:"bottom-end"}},[s("el-button",{staticClass:"reboot-button",attrs:{type:"warning"},on:{click:this.restartApp}},[s("span",[s("i",{staticClass:"el-icon-refresh"}),this._v("\n "+this._s(this.$t("settings.instanceReboot"))+"\n ")])])],1):this._e()},[],!1,null,null,null);l.options.__file="index.vue";s.a=l.exports}}]); +//# sourceMappingURL=chunk-commons.5a106955.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-commons.5a106955.js.map b/priv/static/adminfe/static/js/chunk-commons.5a106955.js.map new file mode 100644 index 000000000..d924490e5 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-commons.5a106955.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/Status/index.vue?aecc","webpack:///./src/components/Status/index.vue?b843","webpack:///./src/components/Status/index.vue?6071","webpack:///src/components/Status/index.vue","webpack:///./src/components/Status/index.vue","webpack:///./src/components/RebootButton/index.vue?8db4","webpack:///./src/components/RebootButton/index.vue?2f45","webpack:///src/components/RebootButton/index.vue","webpack:///./src/components/RebootButton/index.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","components_Statusvue_type_script_lang_js_","name","props","account","type","Object","required","default","fetchStatusesByInstance","Boolean","showCheckbox","status","page","Number","userId","String","godmode","data","showHiddenStatus","methods","capitalizeFirstLetter","str","charAt","toUpperCase","slice","changeStatus","statusId","isSensitive","visibility","this","$store","dispatch","reportCurrentPage","deleteStatus","_this","$confirm","confirmButtonText","cancelButtonText","then","$message","message","catch","handleStatusSelection","$emit","handleRouteChange","$router","push","params","id","optionPercent","poll","pollOption","allVotes","options","reduce","acc","option","votes_count","toFixed","parseTimestamp","timestamp","moment_default","format","propertyExists","property","_secondProperty","component","componentNormalizer","_vm","_h","$createElement","_c","_self","deleted","staticClass","attrs","slot","_v","_s","$t","domProps","innerHTML","content","created_at","_e","href","url","target","on","click","$event","stopPropagation","nativeOn","change","to","src","avatar","nickname","size","trigger","plain","icon","sensitive","spoiler_text","_l","index","key","title","percentage","attachment","preview_url","__file","__webpack_exports__","components_RebootButtonvue_type_script_lang_js_","computed","needReboot","state","app","restartApp","_restartApp","asyncToGenerator_default","regenerator_default","a","mark","_callee","wrap","_context","prev","next","t0","abrupt","lang","t","stop","apply","arguments","placement"],"mappings":"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","file":"static/js/chunk-commons.5a106955.js","sourcesContent":["import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.status.deleted)?_c('el-card',{staticClass:\"status-card\",nativeOn:{\"click\":function($event){return _vm.handleRouteChange()}}},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[(_vm.showCheckbox)?_c('el-checkbox',{staticClass:\"status-checkbox\",on:{\"change\":function($event){return _vm.handleStatusSelection(_vm.account)}}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.account, 'id'))?_c('router-link',{staticClass:\"router-link\",attrs:{\"to\":{ name: 'UsersShow', params: { id: _vm.account.id }}},nativeOn:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"status-card-header\"},[(_vm.propertyExists(_vm.account, 'avatar'))?_c('img',{staticClass:\"status-avatar-img\",attrs:{\"src\":_vm.account.avatar}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.account, 'nickname'))?_c('span',{staticClass:\"status-account-name\"},[_vm._v(_vm._s(_vm.account.nickname))]):_c('span',[(_vm.propertyExists(_vm.account, 'nickname'))?_c('span',{staticClass:\"status-account-name\"},[_vm._v(\"\\n \"+_vm._s(_vm.account.nickname)+\"\\n \")]):_c('span',{staticClass:\"status-account-name deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")])])])]):_vm._e()],1)]),_vm._v(\" \"),_c('div',{staticClass:\"status-actions\"},[_c('div',{staticClass:\"status-tags\"},[(_vm.status.sensitive)?_c('el-tag',{attrs:{\"type\":\"warning\",\"size\":\"large\"}},[_vm._v(_vm._s(_vm.$t('reports.sensitive')))]):_vm._e(),_vm._v(\" \"),_c('el-tag',{attrs:{\"size\":\"large\"}},[_vm._v(_vm._s(_vm.capitalizeFirstLetter(_vm.status.visibility)))])],1),_vm._v(\" \"),_c('el-dropdown',{attrs:{\"trigger\":\"click\"},nativeOn:{\"click\":function($event){$event.stopPropagation();}}},[_c('el-button',{staticClass:\"status-actions-button\",attrs:{\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-edit\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.changeScope'))),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(!_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, true, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.addSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, false, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.removeSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'public')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'public')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.public'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'private')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'private')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.private'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'unlisted')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.unlisted'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deleteStatus(_vm.status.id)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.deleteStatus'))+\"\\n \")])],1)],1)],1)])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.spoiler_text)?_c('div',[_c('strong',[_vm._v(_vm._s(_vm.status.spoiler_text))]),_vm._v(\" \"),(!_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = true}}},[_vm._v(\"Show more\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = false}}},[_vm._v(\"Show less\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.status.spoiler_text)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"status-footer\"},[_c('span',{staticClass:\"status-created-at\"},[_vm._v(_vm._s(_vm.parseTimestamp(_vm.status.created_at)))]),_vm._v(\" \"),(_vm.status.url)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"},on:{\"click\":function($event){$event.stopPropagation();}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.openStatusInInstance'))+\"\\n \"),_c('i',{staticClass:\"el-icon-top-right\"})]):_vm._e()])])]):_c('el-card',{staticClass:\"status-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[_c('h4',{staticClass:\"status-deleted\"},[_vm._v(_vm._s(_vm.$t('reports.statusDeleted')))])])])])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.content)?_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}):_c('span',{staticClass:\"status-without-content\"},[_vm._v(\"no content\")])]),_vm._v(\" \"),_c('div',{staticClass:\"status-footer\"},[(_vm.status.created_at)?_c('span',{staticClass:\"status-created-at\"},[_vm._v(_vm._s(_vm.parseTimestamp(_vm.status.created_at)))]):_vm._e(),_vm._v(\" \"),(_vm.status.url)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"},on:{\"click\":function($event){$event.stopPropagation();}}},[_vm._v(\"\\n Open status in instance\\n \"),_c('i',{staticClass:\"el-icon-top-right\"})]):_vm._e()])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=69419e6d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.needReboot)?_c('el-tooltip',{attrs:{\"content\":_vm.$t('settings.restartApp'),\"placement\":\"bottom-end\"}},[_c('el-button',{staticClass:\"reboot-button\",attrs:{\"type\":\"warning\"},on:{\"click\":_vm.restartApp}},[_c('span',[_c('i',{staticClass:\"el-icon-refresh\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('settings.instanceReboot'))+\"\\n \")])])],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=53cfaf1d&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-d38a.a851004a.js b/priv/static/adminfe/static/js/chunk-d38a.a851004a.js deleted file mode 100644 index c302af310..000000000 --- a/priv/static/adminfe/static/js/chunk-d38a.a851004a.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-d38a"],{"53Av":function(e,t,s){"use strict";var r=s("lOBV");s.n(r).a},"6eCR":function(e,t,s){"use strict";var r=s("Jdpf");s.n(r).a},"9/5/":function(e,t,s){(function(t){var s="Expected a function",r=NaN,n="[object Symbol]",i=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof t&&t&&t.Object===Object&&t,d="object"==typeof self&&self&&self.Object===Object&&self,p=l||d||Function("return this")(),v=Object.prototype.toString,f=Math.max,m=Math.min,h=function(){return p.Date.now()};function g(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function _(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&v.call(e)==n}(e))return r;if(g(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=g(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(i,"");var s=a.test(e);return s||c.test(e)?u(e.slice(2),s?2:8):o.test(e)?r:+e}e.exports=function(e,t,r){var n,i,o,a,c,u,l=0,d=!1,p=!1,v=!0;if("function"!=typeof e)throw new TypeError(s);function w(t){var s=n,r=i;return n=i=void 0,l=t,a=e.apply(r,s)}function $(e){var s=e-u;return void 0===u||s>=t||s<0||p&&e-l>=o}function b(){var e=h();if($(e))return k(e);c=setTimeout(b,function(e){var s=t-(e-u);return p?m(s,o-(e-l)):s}(e))}function k(e){return c=void 0,v&&n?w(e):(n=i=void 0,a)}function y(){var e=h(),s=$(e);if(n=arguments,i=this,u=e,s){if(void 0===c)return function(e){return l=e,c=setTimeout(b,t),d?w(e):a}(u);if(p)return c=setTimeout(b,t),w(u)}return void 0===c&&(c=setTimeout(b,t)),a}return t=_(t)||0,g(r)&&(d=!!r.leading,o=(p="maxWait"in r)?f(_(r.maxWait)||0,t):o,v="trailing"in r?!!r.trailing:v),y.cancel=function(){void 0!==c&&clearTimeout(c),l=0,n=u=i=c=void 0},y.flush=function(){return void 0===c?a:k(h())},y}}).call(this,s("yLpj"))},DPTh:function(e,t,s){"use strict";var r=s("vg5t");s.n(r).a},H08Y:function(e,t,s){"use strict";var r=s("zhkl");s.n(r).a},Jdpf:function(e,t,s){},RGjw:function(e,t,s){"use strict";s.r(t);var r=s("o0o1"),n=s.n(r),i=s("yXPU"),o=s.n(i),a=s("9/5/"),c=s.n(a),u=s("ZhIB"),l=s.n(u),d=s("lSNA"),p=s.n(d),v=s("MVZn"),f=s.n(v),m={data:function(){return{value:[]}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{removeOppositeFilters:function(){var e=Object.keys(this.$store.state.users.filters).length,t=this.$data.value.slice(),s=t.indexOf("local"),r=t.indexOf("external"),n=t.indexOf("active"),i=t.indexOf("deactivated");if(t.length===e)return[];if(s>-1&&r>-1){var o=s>r?r:s;t.splice(o,1)}else if(n>-1&&i>-1){var a=n>i?i:n;t.splice(a,1)}return t},toggleFilters:function(){this.$data.value=this.removeOppositeFilters();var e=this.$data.value.reduce(function(e,t){return f()({},e,p()({},t,!0))},{});this.$store.dispatch("ToggleUsersFilter",e)}}},h=(s("H08Y"),s("KHd+")),g=Object(h.a)(m,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("el-select",{staticClass:"select-field",attrs:{clearable:e.isDesktop,placeholder:e.$t("usersFilter.inputPlaceholder"),multiple:""},on:{change:e.toggleFilters},model:{value:e.value,callback:function(t){e.value=t},expression:"value"}},[s("el-option-group",{attrs:{label:e.$t("usersFilter.byUserType")}},[s("el-option",{attrs:{value:"local"}},[e._v(e._s(e.$t("usersFilter.local")))]),e._v(" "),s("el-option",{attrs:{value:"external"}},[e._v(e._s(e.$t("usersFilter.external")))])],1),e._v(" "),s("el-option-group",{attrs:{label:e.$t("usersFilter.byStatus")}},[s("el-option",{attrs:{value:"active"}},[e._v(e._s(e.$t("usersFilter.active")))]),e._v(" "),s("el-option",{attrs:{value:"deactivated"}},[e._v(e._s(e.$t("usersFilter.deactivated")))])],1)],1)},[],!1,null,"4bc96860",null);g.options.__file="UsersFilter.vue";var _=g.exports,w=s("i7Kn"),$={name:"NewAccountDialog",props:{dialogFormVisible:{type:Boolean,default:function(){return!1}}},data:function(){return{newUserForm:{nickname:"",email:"",password:""},rules:{nickname:[{validator:this.validateUsername,trigger:"blur"}],email:[{validator:this.validateEmail,trigger:"blur"}],password:[{validator:this.validatePassword,trigger:"blur"}]}}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device},isVisible:{get:function(){return this.$props.dialogFormVisible},set:function(){this.closeDialogWindow()}},getLabelWidth:function(){return this.isDesktop?"120px":"85px"}},methods:{closeDialogWindow:function(){this.$emit("closeWindow")},resetForm:function(){var e=this;this.$nextTick(function(){e.$refs.newUserForm.resetFields()})},submitForm:function(e){var t=this;this.$refs[e].validate(function(e){if(!e)return t.$message({type:"error",message:t.$t("users.submitFormError")}),!1;t.$emit("createNewAccount",t.$data.newUserForm)})},validateEmail:function(e,t,s){return""===t?s(new Error(this.$t("users.emptyEmailError"))):this.validEmail(t)?s():s(new Error(this.$t("users.invalidEmailError")))},validatePassword:function(e,t,s){return""===t?s(new Error(this.$t("users.emptyPasswordError"))):s()},validateUsername:function(e,t,s){return""===t?s(new Error(this.$t("users.emptyNicknameError"))):this.validNickname(t)?s():s(new Error(this.$t("users.invalidNicknameError")))},validEmail:function(e){return/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(e)},validNickname:function(e){return/^[a-zA-Z\d]+$/.test(e)}}},b=(s("DPTh"),Object(h.a)($,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("el-dialog",{attrs:{visible:e.isVisible,"show-close":!1,title:e.$t("users.createAccount"),"custom-class":"create-user-dialog"},on:{"update:visible":function(t){e.isVisible=t},open:e.resetForm}},[s("el-form",{ref:"newUserForm",attrs:{model:e.newUserForm,rules:e.rules,"label-width":e.getLabelWidth,"status-icon":""}},[s("el-form-item",{staticClass:"create-account-form-item",attrs:{label:e.$t("users.username"),prop:"nickname"}},[s("el-input",{attrs:{name:"nickname",autofocus:""},model:{value:e.newUserForm.nickname,callback:function(t){e.$set(e.newUserForm,"nickname",t)},expression:"newUserForm.nickname"}})],1),e._v(" "),s("el-form-item",{staticClass:"create-account-form-item",attrs:{label:e.$t("users.email"),prop:"email"}},[s("el-input",{attrs:{name:"email",type:"email"},model:{value:e.newUserForm.email,callback:function(t){e.$set(e.newUserForm,"email",t)},expression:"newUserForm.email"}})],1),e._v(" "),s("el-form-item",{staticClass:"create-account-form-item-without-margin",attrs:{label:e.$t("users.password"),prop:"password"}},[s("el-input",{attrs:{type:"password",name:"password",autocomplete:"off"},model:{value:e.newUserForm.password,callback:function(t){e.$set(e.newUserForm,"password",t)},expression:"newUserForm.password"}})],1)],1),e._v(" "),s("span",{attrs:{slot:"footer"},slot:"footer"},[s("el-button",{on:{click:e.closeDialogWindow}},[e._v(e._s(e.$t("users.cancel")))]),e._v(" "),s("el-button",{attrs:{type:"primary"},on:{click:function(t){return e.submitForm("newUserForm")}}},[e._v(e._s(e.$t("users.create")))])],1)],1)},[],!1,null,null,null));b.options.__file="NewAccountDialog.vue";var k=b.exports,y=s("tPM3"),D=s("rIUS"),C={name:"Users",components:{NewAccountDialog:k,ModerationDropdown:y.a,MultipleUsersMenu:w.a,RebootButton:D.a,UsersFilter:_},data:function(){return{search:"",selectedUsers:[],createAccountDialogOpen:!1,resetPasswordDialogOpen:!1}},computed:{loading:function(){return this.$store.state.users.loading},normalizedUsersCount:function(){return l()(this.$store.state.users.totalUsersCount).format("0a")},users:function(){return this.$store.state.users.fetchedUsers},usersCount:function(){return this.$store.state.users.totalUsersCount},pageSize:function(){return this.$store.state.users.pageSize},passwordResetLink:function(){return this.$store.state.users.passwordResetToken.link},passwordResetToken:function(){return this.$store.state.users.passwordResetToken.token},currentPage:function(){return this.$store.state.users.currentPage},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},width:function(){return!!this.isMobile&&55}},created:function(){var e=this;this.handleDebounceSearchInput=c()(function(t){e.$store.dispatch("SearchUsers",{query:t,page:1})},500)},mounted:function(){this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchUsers",{page:1})},methods:{activationIcon:function(e){return e?"el-icon-error":"el-icon-success"},clearSelection:function(){this.$refs.usersTable.clearSelection()},closeResetPasswordDialog:function(){this.resetPasswordDialogOpen=!1,this.$store.dispatch("RemovePasswordToken")},createNewAccount:function(){var e=o()(n.a.mark(function e(t){return n.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.$store.dispatch("CreateNewAccount",t);case 2:this.createAccountDialogOpen=!1;case 3:case"end":return e.stop()}},e,this)}));return function(t){return e.apply(this,arguments)}}(),getFirstLetter:function(e){return e.charAt(0).toUpperCase()},handlePageChange:function(e){var t=this.$store.state.users.searchQuery;""===t?this.$store.dispatch("FetchUsers",{page:e}):this.$store.dispatch("SearchUsers",{query:t,page:e})},handleSelectionChange:function(e){this.$data.selectedUsers=e},openResetPasswordDialog:function(){this.resetPasswordDialogOpen=!0},showDeactivatedButton:function(e){return this.$store.state.user.id!==e}}},A=(s("6eCR"),Object(h.a)(C,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"users-container"},[s("div",{staticClass:"users-header-container"},[s("h1",[e._v("\n "+e._s(e.$t("users.users"))+"\n "),s("span",{staticClass:"user-count"},[e._v("("+e._s(e.normalizedUsersCount)+")")])]),e._v(" "),s("reboot-button")],1),e._v(" "),s("div",{staticClass:"filter-container"},[s("users-filter"),e._v(" "),s("el-input",{staticClass:"search",attrs:{placeholder:e.$t("users.search"),"prefix-icon":"el-icon-search"},on:{input:e.handleDebounceSearchInput},model:{value:e.search,callback:function(t){e.search=t},expression:"search"}})],1),e._v(" "),s("div",{staticClass:"actions-container"},[s("el-button",{staticClass:"actions-button",on:{click:function(t){e.createAccountDialogOpen=!0}}},[s("span",{staticClass:"create-account"},[s("i",{staticClass:"el-icon-plus"}),e._v("\n "+e._s(e.$t("users.createAccount"))+"\n ")])]),e._v(" "),s("multiple-users-menu",{attrs:{"selected-users":e.selectedUsers},on:{"apply-action":e.clearSelection}})],1),e._v(" "),s("new-account-dialog",{attrs:{"dialog-form-visible":e.createAccountDialogOpen},on:{createNewAccount:e.createNewAccount,closeWindow:function(t){e.createAccountDialogOpen=!1}}}),e._v(" "),s("el-table",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],ref:"usersTable",staticStyle:{width:"100%"},attrs:{data:e.users,"row-key":"id"},on:{"selection-change":e.handleSelectionChange}},[e.isDesktop?s("el-table-column",{attrs:{type:"selection","reserve-selection":"",width:"44",align:"center"}}):e._e(),e._v(" "),s("el-table-column",{attrs:{"min-width":e.width,label:e.$t("users.id"),prop:"id"}}),e._v(" "),s("el-table-column",{attrs:{label:e.$t("users.name"),prop:"nickname"},scopedSlots:e._u([{key:"default",fn:function(t){return[s("router-link",{attrs:{to:{name:"UsersShow",params:{id:t.row.id}}}},[e._v(e._s(t.row.nickname))]),e._v(" "),e.isDesktop?s("el-tag",{attrs:{type:"info",size:"mini"}},[s("span",[e._v(e._s(t.row.local?e.$t("users.local"):e.$t("users.external")))])]):e._e()]}}])}),e._v(" "),s("el-table-column",{attrs:{"min-width":e.width,label:e.$t("users.status")},scopedSlots:e._u([{key:"default",fn:function(t){return[s("el-tag",{attrs:{type:t.row.deactivated?"danger":"success"}},[e.isDesktop?s("span",[e._v(e._s(t.row.deactivated?e.$t("users.deactivated"):e.$t("users.active")))]):s("i",{class:e.activationIcon(t.row.deactivated)})]),e._v(" "),t.row.roles.admin?s("el-tag",[s("span",[e._v(e._s(e.isDesktop?e.$t("users.admin"):e.getFirstLetter(e.$t("users.admin"))))])]):e._e(),e._v(" "),t.row.roles.moderator?s("el-tag",[s("span",[e._v(e._s(e.isDesktop?e.$t("users.moderator"):e.getFirstLetter(e.$t("users.moderator"))))])]):e._e(),e._v(" "),s("el-tooltip",{attrs:{content:e.$t("users.unconfirmedEmail"),effect:"dark"}},[t.row.confirmation_pending?s("el-tag",{attrs:{type:"info"}},[e._v("\n "+e._s(e.isDesktop?e.$t("users.unconfirmed"):e.getFirstLetter(e.$t("users.unconfirmed")))+"\n ")]):e._e()],1)]}}])}),e._v(" "),s("el-table-column",{attrs:{label:e.$t("users.actions"),fixed:"right"},scopedSlots:e._u([{key:"default",fn:function(t){return[s("moderation-dropdown",{attrs:{user:t.row,page:"users"},on:{"open-reset-token-dialog":e.openResetPasswordDialog}})]}}])})],1),e._v(" "),s("el-dialog",{directives:[{name:"loading",rawName:"v-loading",value:e.loading,expression:"loading"}],attrs:{visible:e.resetPasswordDialogOpen,title:e.$t("users.passwordResetTokenCreated"),"custom-class":"password-reset-token-dialog"},on:{"update:visible":function(t){e.resetPasswordDialogOpen=t},close:e.closeResetPasswordDialog}},[s("div",[s("p",{staticClass:"password-reset-token"},[e._v("Password reset token was generated: "+e._s(e.passwordResetToken))]),e._v(" "),s("p",[e._v("You can also use this link to reset password:\n "),s("a",{staticClass:"reset-password-link",attrs:{href:e.passwordResetLink,target:"_blank"}},[e._v(e._s(e.passwordResetLink))])])])]),e._v(" "),e.loading?e._e():s("div",{staticClass:"pagination"},[s("el-pagination",{attrs:{total:e.usersCount,"current-page":e.currentPage,"page-size":e.pageSize,background:"",layout:"prev, pager, next"},on:{"current-change":e.handlePageChange}})],1)],1)},[],!1,null,null,null));A.options.__file="index.vue";t.default=A.exports},lOBV:function(e,t,s){},tPM3:function(e,t,s){"use strict";var r={name:"ModerationDropdown",props:{user:{type:Object,default:function(){return{}}},page:{type:String,default:"users"}},computed:{isDesktop:function(){return"desktop"===this.$store.state.app.device}},methods:{getPasswordResetToken:function(e){this.$emit("open-reset-token-dialog"),this.$store.dispatch("GetPasswordResetToken",e)},handleConfirmationResend:function(e){this.$store.dispatch("ResendConfirmationEmail",[e])},handleDeletion:function(e){this.$store.dispatch("DeleteUsers",{users:[e],_userId:e.id})},handleEmailConfirmation:function(e){this.$store.dispatch("ConfirmUsersEmail",{users:[e],_userId:e.id})},requirePasswordReset:function(e){this.$store.state.user.nodeInfo.metadata.mailerEnabled?this.$store.dispatch("RequirePasswordReset",[e]):this.$alert(this.$t("users.mailerMustBeEnabled"),"Error",{type:"error"})},showAdminAction:function(e){var t=e.local,s=e.id;return t&&this.showDeactivatedButton(s)},showDeactivatedButton:function(e){return this.$store.state.user.id!==e},toggleActivation:function(e){e.deactivated?this.$store.dispatch("ActivateUsers",{users:[e],_userId:e.id}):this.$store.dispatch("DeactivateUsers",{users:[e],_userId:e.id})},toggleTag:function(e,t){e.tags.includes(t)?this.$store.dispatch("RemoveTag",{users:[e],tag:t,_userId:e.id}):this.$store.dispatch("AddTag",{users:[e],tag:t,_userId:e.id})},toggleUserRight:function(e,t){e.roles[t]?this.$store.dispatch("DeleteRight",{users:[e],right:t,_userId:e.id}):this.$store.dispatch("AddRight",{users:[e],right:t,_userId:e.id})}}},n=(s("53Av"),s("KHd+")),i=Object(n.a)(r,function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("el-dropdown",{attrs:{"hide-on-click":!1,size:"small",trigger:"click"}},[s("div",["users"===e.page?s("span",{staticClass:"el-dropdown-link"},[e._v("\n "+e._s(e.$t("users.moderation"))+"\n "),e.isDesktop?s("i",{staticClass:"el-icon-arrow-down el-icon--right"}):e._e()]):e._e(),e._v(" "),"userPage"===e.page?s("el-button",{staticClass:"moderate-user-button"},[s("span",{staticClass:"moderate-user-button-container"},[s("span",[s("i",{staticClass:"el-icon-edit"}),e._v("\n "+e._s(e.$t("users.moderateUser"))+"\n ")]),e._v(" "),s("i",{staticClass:"el-icon-arrow-down el-icon--right"})])]):e._e()],1),e._v(" "),s("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[e.showAdminAction(e.user)?s("el-dropdown-item",{nativeOn:{click:function(t){return e.toggleUserRight(e.user,"admin")}}},[e._v("\n "+e._s(e.user.roles.admin?e.$t("users.revokeAdmin"):e.$t("users.grantAdmin"))+"\n ")]):e._e(),e._v(" "),e.showAdminAction(e.user)?s("el-dropdown-item",{nativeOn:{click:function(t){return e.toggleUserRight(e.user,"moderator")}}},[e._v("\n "+e._s(e.user.roles.moderator?e.$t("users.revokeModerator"):e.$t("users.grantModerator"))+"\n ")]):e._e(),e._v(" "),e.showDeactivatedButton(e.user.id)?s("el-dropdown-item",{attrs:{divided:e.showAdminAction(e.user)},nativeOn:{click:function(t){return e.toggleActivation(e.user)}}},[e._v("\n "+e._s(e.user.deactivated?e.$t("users.activateAccount"):e.$t("users.deactivateAccount"))+"\n ")]):e._e(),e._v(" "),e.showDeactivatedButton(e.user.id)?s("el-dropdown-item",{nativeOn:{click:function(t){return e.handleDeletion(e.user)}}},[e._v("\n "+e._s(e.$t("users.deleteAccount"))+"\n ")]):e._e(),e._v(" "),e.user.local&&e.user.confirmation_pending?s("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(t){return e.handleEmailConfirmation(e.user)}}},[e._v("\n "+e._s(e.$t("users.confirmAccount"))+"\n ")]):e._e(),e._v(" "),e.user.local&&e.user.confirmation_pending?s("el-dropdown-item",{nativeOn:{click:function(t){return e.handleConfirmationResend(e.user)}}},[e._v("\n "+e._s(e.$t("users.resendConfirmation"))+"\n ")]):e._e(),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("force_nsfw")},attrs:{divided:e.showAdminAction(e.user)},nativeOn:{click:function(t){return e.toggleTag(e.user,"force_nsfw")}}},[e._v("\n "+e._s(e.$t("users.forceNsfw"))+"\n "),e.user.tags.includes("force_nsfw")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("strip_media")},nativeOn:{click:function(t){return e.toggleTag(e.user,"strip_media")}}},[e._v("\n "+e._s(e.$t("users.stripMedia"))+"\n "),e.user.tags.includes("strip_media")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("force_unlisted")},nativeOn:{click:function(t){return e.toggleTag(e.user,"force_unlisted")}}},[e._v("\n "+e._s(e.$t("users.forceUnlisted"))+"\n "),e.user.tags.includes("force_unlisted")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("sandbox")},nativeOn:{click:function(t){return e.toggleTag(e.user,"sandbox")}}},[e._v("\n "+e._s(e.$t("users.sandbox"))+"\n "),e.user.tags.includes("sandbox")?s("i",{staticClass:"el-icon-check"}):e._e()]),e._v(" "),e.user.local?s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("disable_remote_subscription")},nativeOn:{click:function(t){return e.toggleTag(e.user,"disable_remote_subscription")}}},[e._v("\n "+e._s(e.$t("users.disableRemoteSubscription"))+"\n "),e.user.tags.includes("disable_remote_subscription")?s("i",{staticClass:"el-icon-check"}):e._e()]):e._e(),e._v(" "),e.user.local?s("el-dropdown-item",{class:{"active-tag":e.user.tags.includes("disable_any_subscription")},nativeOn:{click:function(t){return e.toggleTag(e.user,"disable_any_subscription")}}},[e._v("\n "+e._s(e.$t("users.disableAnySubscription"))+"\n "),e.user.tags.includes("disable_any_subscription")?s("i",{staticClass:"el-icon-check"}):e._e()]):e._e(),e._v(" "),e.user.local?s("el-dropdown-item",{attrs:{divided:""},nativeOn:{click:function(t){return e.getPasswordResetToken(e.user.nickname)}}},[e._v("\n "+e._s(e.$t("users.getPasswordResetToken"))+"\n ")]):e._e(),e._v(" "),e.user.local?s("el-dropdown-item",{nativeOn:{click:function(t){return e.requirePasswordReset(e.user)}}},[e._v("\n "+e._s(e.$t("users.requirePasswordReset"))+"\n ")]):e._e()],1)],1)},[],!1,null,null,null);i.options.__file="ModerationDropdown.vue";t.a=i.exports},vg5t:function(e,t,s){},zhkl:function(e,t,s){}}]); -//# sourceMappingURL=chunk-d38a.a851004a.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map b/priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map deleted file mode 100644 index 6779f6dc1..000000000 --- a/priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/users/components/ModerationDropdown.vue?e3f0","webpack:///./src/views/users/index.vue?1afe","webpack:///./node_modules/lodash.debounce/index.js","webpack:///./src/views/users/components/NewAccountDialog.vue?d353","webpack:///./src/views/users/components/UsersFilter.vue?b48f","webpack:///./src/views/users/index.vue?6efb","webpack:///./src/views/users/components/UsersFilter.vue?6a82","webpack:///src/views/users/components/UsersFilter.vue","webpack:///./src/views/users/components/UsersFilter.vue","webpack:///./src/views/users/components/UsersFilter.vue?6235","webpack:///./src/views/users/components/NewAccountDialog.vue?9018","webpack:///src/views/users/components/NewAccountDialog.vue","webpack:///./src/views/users/components/NewAccountDialog.vue","webpack:///./src/views/users/components/NewAccountDialog.vue?43a7","webpack:///./src/views/users/index.vue?0a29","webpack:///src/views/users/index.vue","webpack:///./src/views/users/index.vue","webpack:///./src/views/users/components/ModerationDropdown.vue?f4d5","webpack:///./src/views/users/components/ModerationDropdown.vue?676e","webpack:///src/views/users/components/ModerationDropdown.vue","webpack:///./src/views/users/components/ModerationDropdown.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ModerationDropdown_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","global","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","Object","freeSelf","self","root","Function","objectToString","prototype","toString","nativeMax","Math","max","nativeMin","min","now","Date","isObject","value","type","toNumber","isObjectLike","call","isSymbol","other","valueOf","replace","isBinary","test","slice","module","exports","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","undefined","apply","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","setTimeout","remainingWait","debounced","isInvoking","arguments","this","leadingEdge","cancel","clearTimeout","flush","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_NewAccountDialog_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_UsersFilter_vue_vue_type_style_index_0_id_4bc96860_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","components_UsersFiltervue_type_script_lang_js_","data","computed","isDesktop","$store","state","app","device","methods","removeOppositeFilters","filtersQuantity","keys","users","filters","length","currentFilters","$data","indexOfLocal","indexOf","indexOfExternal","indexOfActive","indexOfDeactivated","filterToRemove","splice","_filterToRemove","toggleFilters","reduce","acc","filter","objectSpread_default","defineProperty_default","dispatch","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","clearable","placeholder","$t","multiple","on","change","model","callback","$$v","expression","label","_v","_s","__file","UsersFilter","components_NewAccountDialogvue_type_script_lang_js_","name","props","dialogFormVisible","Boolean","default","newUserForm","nickname","email","password","rules","validator","validateUsername","trigger","validateEmail","validatePassword","isVisible","get","$props","set","closeDialogWindow","getLabelWidth","$emit","resetForm","_this","$nextTick","$refs","resetFields","submitForm","formName","_this2","validate","valid","$message","message","rule","Error","validEmail","validNickname","NewAccountDialog_component","visible","show-close","title","custom-class","update:visible","$event","open","ref","label-width","status-icon","prop","autofocus","$set","autocomplete","slot","click","NewAccountDialog","views_usersvue_type_script_lang_js_","components","ModerationDropdown","MultipleUsersMenu","RebootButton","search","selectedUsers","createAccountDialogOpen","resetPasswordDialogOpen","loading","normalizedUsersCount","numeral_default","totalUsersCount","format","fetchedUsers","usersCount","pageSize","passwordResetLink","passwordResetToken","link","token","currentPage","isMobile","width","created","handleDebounceSearchInput","lodash_debounce_default","query","page","mounted","activationIcon","status","clearSelection","usersTable","closeResetPasswordDialog","createNewAccount","_createNewAccount","asyncToGenerator_default","regenerator_default","a","mark","_callee","accountData","wrap","_context","prev","next","stop","_x","getFirstLetter","str","charAt","toUpperCase","handlePageChange","searchQuery","handleSelectionChange","openResetPasswordDialog","showDeactivatedButton","id","user","users_component","prefix-icon","input","selected-users","apply-action","dialog-form-visible","closeWindow","directives","rawName","staticStyle","row-key","selection-change","reserve-selection","align","_e","min-width","scopedSlots","_u","key","fn","scope","to","params","row","size","local","deactivated","class","roles","content","effect","fixed","open-reset-token-dialog","close","href","target","total","current-page","page-size","background","layout","current-change","__webpack_exports__","components_ModerationDropdownvue_type_script_lang_js_","String","getPasswordResetToken","handleConfirmationResend","handleDeletion","_userId","handleEmailConfirmation","requirePasswordReset","nodeInfo","metadata","mailerEnabled","$alert","showAdminAction","_ref","toggleActivation","toggleTag","tag","tags","includes","toggleUserRight","right","hide-on-click","nativeOn","admin","moderator","divided","confirmation_pending","active-tag"],"mappings":"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","file":"static/js/chunk-d38a.a851004a.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=style&index=0&id=4bc96860&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=style&index=0&id=4bc96860&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"users-container\"},[_c('div',{staticClass:\"users-header-container\"},[_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.users'))+\"\\n \"),_c('span',{staticClass:\"user-count\"},[_vm._v(\"(\"+_vm._s(_vm.normalizedUsersCount)+\")\")])]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"filter-container\"},[_c('users-filter'),_vm._v(\" \"),_c('el-input',{staticClass:\"search\",attrs:{\"placeholder\":_vm.$t('users.search'),\"prefix-icon\":\"el-icon-search\"},on:{\"input\":_vm.handleDebounceSearchInput},model:{value:(_vm.search),callback:function ($$v) {_vm.search=$$v},expression:\"search\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"actions-container\"},[_c('el-button',{staticClass:\"actions-button\",on:{\"click\":function($event){_vm.createAccountDialogOpen = true}}},[_c('span',{staticClass:\"create-account\"},[_c('i',{staticClass:\"el-icon-plus\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.createAccount'))+\"\\n \")])]),_vm._v(\" \"),_c('multiple-users-menu',{attrs:{\"selected-users\":_vm.selectedUsers},on:{\"apply-action\":_vm.clearSelection}})],1),_vm._v(\" \"),_c('new-account-dialog',{attrs:{\"dialog-form-visible\":_vm.createAccountDialogOpen},on:{\"createNewAccount\":_vm.createNewAccount,\"closeWindow\":function($event){_vm.createAccountDialogOpen = false}}}),_vm._v(\" \"),_c('el-table',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],ref:\"usersTable\",staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.users,\"row-key\":\"id\"},on:{\"selection-change\":_vm.handleSelectionChange}},[(_vm.isDesktop)?_c('el-table-column',{attrs:{\"type\":\"selection\",\"reserve-selection\":\"\",\"width\":\"44\",\"align\":\"center\"}}):_vm._e(),_vm._v(\" \"),_c('el-table-column',{attrs:{\"min-width\":_vm.width,\"label\":_vm.$t('users.id'),\"prop\":\"id\"}}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('users.name'),\"prop\":\"nickname\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('router-link',{attrs:{\"to\":{ name: 'UsersShow', params: { id: scope.row.id }}}},[_vm._v(_vm._s(scope.row.nickname))]),_vm._v(\" \"),(_vm.isDesktop)?_c('el-tag',{attrs:{\"type\":\"info\",\"size\":\"mini\"}},[_c('span',[_vm._v(_vm._s(scope.row.local ? _vm.$t('users.local') : _vm.$t('users.external')))])]):_vm._e()]}}])}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"min-width\":_vm.width,\"label\":_vm.$t('users.status')},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('el-tag',{attrs:{\"type\":scope.row.deactivated ? 'danger' : 'success'}},[(_vm.isDesktop)?_c('span',[_vm._v(_vm._s(scope.row.deactivated ? _vm.$t('users.deactivated') : _vm.$t('users.active')))]):_c('i',{class:_vm.activationIcon(scope.row.deactivated)})]),_vm._v(\" \"),(scope.row.roles.admin)?_c('el-tag',[_c('span',[_vm._v(_vm._s(_vm.isDesktop ? _vm.$t('users.admin') : _vm.getFirstLetter(_vm.$t('users.admin'))))])]):_vm._e(),_vm._v(\" \"),(scope.row.roles.moderator)?_c('el-tag',[_c('span',[_vm._v(_vm._s(_vm.isDesktop ? _vm.$t('users.moderator') : _vm.getFirstLetter(_vm.$t('users.moderator'))))])]):_vm._e(),_vm._v(\" \"),_c('el-tooltip',{attrs:{\"content\":_vm.$t('users.unconfirmedEmail'),\"effect\":\"dark\"}},[(scope.row.confirmation_pending)?_c('el-tag',{attrs:{\"type\":\"info\"}},[_vm._v(\"\\n \"+_vm._s(_vm.isDesktop ? _vm.$t('users.unconfirmed') : _vm.getFirstLetter(_vm.$t('users.unconfirmed')))+\"\\n \")]):_vm._e()],1)]}}])}),_vm._v(\" \"),_c('el-table-column',{attrs:{\"label\":_vm.$t('users.actions'),\"fixed\":\"right\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('moderation-dropdown',{attrs:{\"user\":scope.row,\"page\":'users'},on:{\"open-reset-token-dialog\":_vm.openResetPasswordDialog}})]}}])})],1),_vm._v(\" \"),_c('el-dialog',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],attrs:{\"visible\":_vm.resetPasswordDialogOpen,\"title\":_vm.$t('users.passwordResetTokenCreated'),\"custom-class\":\"password-reset-token-dialog\"},on:{\"update:visible\":function($event){_vm.resetPasswordDialogOpen=$event},\"close\":_vm.closeResetPasswordDialog}},[_c('div',[_c('p',{staticClass:\"password-reset-token\"},[_vm._v(\"Password reset token was generated: \"+_vm._s(_vm.passwordResetToken))]),_vm._v(\" \"),_c('p',[_vm._v(\"You can also use this link to reset password:\\n \"),_c('a',{staticClass:\"reset-password-link\",attrs:{\"href\":_vm.passwordResetLink,\"target\":\"_blank\"}},[_vm._v(_vm._s(_vm.passwordResetLink))])])])]),_vm._v(\" \"),(!_vm.loading)?_c('div',{staticClass:\"pagination\"},[_c('el-pagination',{attrs:{\"total\":_vm.usersCount,\"current-page\":_vm.currentPage,\"page-size\":_vm.pageSize,\"background\":\"\",\"layout\":\"prev, pager, next\"},on:{\"current-change\":_vm.handlePageChange}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./UsersFilter.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./UsersFilter.vue?vue&type=template&id=4bc96860&scoped=true&\"\nimport script from \"./UsersFilter.vue?vue&type=script&lang=js&\"\nexport * from \"./UsersFilter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./UsersFilter.vue?vue&type=style&index=0&id=4bc96860&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4bc96860\",\n null\n \n)\n\ncomponent.options.__file = \"UsersFilter.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-select',{staticClass:\"select-field\",attrs:{\"clearable\":_vm.isDesktop,\"placeholder\":_vm.$t('usersFilter.inputPlaceholder'),\"multiple\":\"\"},on:{\"change\":_vm.toggleFilters},model:{value:(_vm.value),callback:function ($$v) {_vm.value=$$v},expression:\"value\"}},[_c('el-option-group',{attrs:{\"label\":_vm.$t('usersFilter.byUserType')}},[_c('el-option',{attrs:{\"value\":\"local\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.local')))]),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"external\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.external')))])],1),_vm._v(\" \"),_c('el-option-group',{attrs:{\"label\":_vm.$t('usersFilter.byStatus')}},[_c('el-option',{attrs:{\"value\":\"active\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.active')))]),_vm._v(\" \"),_c('el-option',{attrs:{\"value\":\"deactivated\"}},[_vm._v(_vm._s(_vm.$t('usersFilter.deactivated')))])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NewAccountDialog.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./NewAccountDialog.vue?vue&type=template&id=c89e4c22&\"\nimport script from \"./NewAccountDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./NewAccountDialog.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NewAccountDialog.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"NewAccountDialog.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dialog',{attrs:{\"visible\":_vm.isVisible,\"show-close\":false,\"title\":_vm.$t('users.createAccount'),\"custom-class\":\"create-user-dialog\"},on:{\"update:visible\":function($event){_vm.isVisible=$event},\"open\":_vm.resetForm}},[_c('el-form',{ref:\"newUserForm\",attrs:{\"model\":_vm.newUserForm,\"rules\":_vm.rules,\"label-width\":_vm.getLabelWidth,\"status-icon\":\"\"}},[_c('el-form-item',{staticClass:\"create-account-form-item\",attrs:{\"label\":_vm.$t('users.username'),\"prop\":\"nickname\"}},[_c('el-input',{attrs:{\"name\":\"nickname\",\"autofocus\":\"\"},model:{value:(_vm.newUserForm.nickname),callback:function ($$v) {_vm.$set(_vm.newUserForm, \"nickname\", $$v)},expression:\"newUserForm.nickname\"}})],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"create-account-form-item\",attrs:{\"label\":_vm.$t('users.email'),\"prop\":\"email\"}},[_c('el-input',{attrs:{\"name\":\"email\",\"type\":\"email\"},model:{value:(_vm.newUserForm.email),callback:function ($$v) {_vm.$set(_vm.newUserForm, \"email\", $$v)},expression:\"newUserForm.email\"}})],1),_vm._v(\" \"),_c('el-form-item',{staticClass:\"create-account-form-item-without-margin\",attrs:{\"label\":_vm.$t('users.password'),\"prop\":\"password\"}},[_c('el-input',{attrs:{\"type\":\"password\",\"name\":\"password\",\"autocomplete\":\"off\"},model:{value:(_vm.newUserForm.password),callback:function ($$v) {_vm.$set(_vm.newUserForm, \"password\", $$v)},expression:\"newUserForm.password\"}})],1)],1),_vm._v(\" \"),_c('span',{attrs:{\"slot\":\"footer\"},slot:\"footer\"},[_c('el-button',{on:{\"click\":_vm.closeDialogWindow}},[_vm._v(_vm._s(_vm.$t('users.cancel')))]),_vm._v(\" \"),_c('el-button',{attrs:{\"type\":\"primary\"},on:{\"click\":function($event){return _vm.submitForm('newUserForm')}}},[_vm._v(_vm._s(_vm.$t('users.create')))])],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=5a7e4206&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"hide-on-click\":false,\"size\":\"small\",\"trigger\":\"click\"}},[_c('div',[(_vm.page === 'users')?_c('span',{staticClass:\"el-dropdown-link\"},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderation'))+\"\\n \"),(_vm.isDesktop)?_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.page === 'userPage')?_c('el-button',{staticClass:\"moderate-user-button\"},[_c('span',{staticClass:\"moderate-user-button-container\"},[_c('span',[_c('i',{staticClass:\"el-icon-edit\"}),_vm._v(\"\\n \"+_vm._s(_vm.$t('users.moderateUser'))+\"\\n \")]),_vm._v(\" \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})])]):_vm._e()],1),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'admin')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.admin ? _vm.$t('users.revokeAdmin') : _vm.$t('users.grantAdmin'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showAdminAction(_vm.user))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.toggleUserRight(_vm.user, 'moderator')}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.roles.moderator ? _vm.$t('users.revokeModerator') : _vm.$t('users.grantModerator'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id))?_c('el-dropdown-item',{attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleActivation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.user.deactivated ? _vm.$t('users.activateAccount') : _vm.$t('users.deactivateAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.user.id))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeletion(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.handleEmailConfirmation(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.confirmAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local && _vm.user.confirmation_pending)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleConfirmationResend(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.resendConfirmation'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_nsfw') },attrs:{\"divided\":_vm.showAdminAction(_vm.user)},nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceNsfw'))+\"\\n \"),(_vm.user.tags.includes('force_nsfw'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('strip_media') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.stripMedia'))+\"\\n \"),(_vm.user.tags.includes('strip_media'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('force_unlisted') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceUnlisted'))+\"\\n \"),(_vm.user.tags.includes('force_unlisted'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('sandbox') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.sandbox'))+\"\\n \"),(_vm.user.tags.includes('sandbox'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_remote_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableRemoteSubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_remote_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.user.tags.includes('disable_any_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.user, 'disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableAnySubscription'))+\"\\n \"),(_vm.user.tags.includes('disable_any_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{attrs:{\"divided\":\"\"},nativeOn:{\"click\":function($event){return _vm.getPasswordResetToken(_vm.user.nickname)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.getPasswordResetToken'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.user.local)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.requirePasswordReset(_vm.user)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.requirePasswordReset'))+\"\\n \")]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerationDropdown.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ModerationDropdown.vue?vue&type=template&id=4841469c&\"\nimport script from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./ModerationDropdown.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ModerationDropdown.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ModerationDropdown.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-e404.554bc2e3.js b/priv/static/adminfe/static/js/chunk-e404.554bc2e3.js new file mode 100644 index 000000000..769e9f4f9 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-e404.554bc2e3.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-e404"],{"07OA":function(t,e,s){"use strict";var a=s("51EY");s.n(a).a},"51EY":function(t,e,s){},"8rU9":function(t,e,s){},Eg1M:function(t,e,s){"use strict";var a=s("8rU9");s.n(a).a},"G/Mk":function(t,e,s){"use strict";var a=s("xdcp");s.n(a).a},Lbbz:function(t,e,s){"use strict";var a=s("Sxb/");s.n(a).a},RnhZ:function(t,e,s){var a={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function n(t){var e=r(t);return s(e)}function r(t){if(!s.o(a,t)){var e=new Error("Cannot find module '"+t+"'");throw e.code="MODULE_NOT_FOUND",e}return a[t]}n.keys=function(){return Object.keys(a)},n.resolve=r,t.exports=n,n.id="RnhZ"},"Sxb/":function(t,e,s){},cEOe:function(t,e,s){"use strict";s.r(e);var a=s("ZhIB"),n=s.n(a),r=s("wd/R"),o=s.n(r),i={name:"NoteCard",props:{report:{type:Object,required:!0},note:{type:Object,required:!0}},methods:{handleNoteDeletion:function(t,e){var s=this;this.$confirm("Are you sure you want to delete this note?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){s.$store.dispatch("DeleteReportNote",{noteID:t,reportID:e}),s.$message({type:"success",message:"Delete completed"})}).catch(function(){s.$message({type:"info",message:"Delete canceled"})})},parseTimestamp:function(t){return o()(t).format("YYYY-MM-DD HH:mm")},propertyExists:function(t,e){return t[e]}}},c=(s("G/Mk"),s("KHd+")),l=Object(c.a)(i,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("el-card",{staticClass:"note-card"},[s("div",{attrs:{slot:"header"},slot:"header"},[s("div",{staticClass:"note-header"},[t.propertyExists(t.note.user,"id")?s("router-link",{staticClass:"router-link",attrs:{to:{name:"UsersShow",params:{id:t.note.user.id}}}},[s("div",{staticClass:"note-actor"},[t.propertyExists(t.note.user,"avatar")?s("img",{staticClass:"note-avatar-img",attrs:{src:t.note.user.avatar,alt:"avatar"}}):t._e(),t._v(" "),t.propertyExists(t.note.user,"nickname")?s("span",{staticClass:"note-actor-name"},[t._v(t._s(t.note.user.nickname))]):s("span",{staticClass:"note-actor-name deactivated"},[t._v("("+t._s(t.$t("users.invalidNickname"))+")")])])]):t._e(),t._v(" "),s("el-button",{attrs:{size:"mini"},nativeOn:{click:function(e){return t.handleNoteDeletion(t.note.id,t.report.id)}}},[t._v("\n "+t._s(t.$t("reports.deleteNote"))+"\n ")])],1)]),t._v(" "),s("div",{staticClass:"note-body"},[s("span",{staticClass:"note-content",domProps:{innerHTML:t._s(t.note.content)}}),t._v("\n "+t._s(t.parseTimestamp(t.note.created_at))+"\n ")])])},[],!1,null,null,null);l.options.__file="NoteCard.vue";var u=l.exports,d=s("ot3S"),p={name:"ModerateUserDropdown",props:{account:{type:Object,required:!0}},computed:{tags:function(){return this.account.tags||[]}},methods:{handleDeactivation:function(t){var e=t.nickname;this.$store.dispatch("ToggleUserActivation",e)},handleDeletion:function(t){this.$store.dispatch("DeleteUser",t)},showDeactivatedButton:function(t){return this.$store.state.user.id!==t},toggleTag:function(t,e){t.tags.includes(e)?this.$store.dispatch("RemoveTag",{users:[t],tag:e}):this.$store.dispatch("AddTag",{users:[t],tag:e})}}},v=Object(c.a)(p,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("el-dropdown",{attrs:{trigger:"click"}},[s("el-button",{attrs:{disabled:!t.account.id,plain:"",size:"small",icon:"el-icon-files"}},[t._v(t._s(t.$t("reports.moderateUser"))+"\n "),s("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),s("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[t.showDeactivatedButton(t.account)?s("el-dropdown-item",{nativeOn:{click:function(e){return t.handleDeactivation(t.account)}}},[t._v("\n "+t._s(t.account.deactivated?t.$t("users.activateAccount"):t.$t("users.deactivateAccount"))+"\n ")]):t._e(),t._v(" "),t.showDeactivatedButton(t.account.id)?s("el-dropdown-item",{nativeOn:{click:function(e){return t.handleDeletion(t.account.id)}}},[t._v("\n "+t._s(t.$t("users.deleteAccount"))+"\n ")]):t._e(),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("force_nsfw")},attrs:{divided:!0},nativeOn:{click:function(e){return t.toggleTag(t.account,"force_nsfw")}}},[t._v("\n "+t._s(t.$t("users.forceNsfw"))+"\n "),t.tags.includes("force_nsfw")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("strip_media")},nativeOn:{click:function(e){return t.toggleTag(t.account,"strip_media")}}},[t._v("\n "+t._s(t.$t("users.stripMedia"))+"\n "),t.tags.includes("strip_media")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("force_unlisted")},nativeOn:{click:function(e){return t.toggleTag(t.account,"force_unlisted")}}},[t._v("\n "+t._s(t.$t("users.forceUnlisted"))+"\n "),t.tags.includes("force_unlisted")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),s("el-dropdown-item",{class:{"active-tag":t.tags.includes("sandbox")},nativeOn:{click:function(e){return t.toggleTag(t.account,"sandbox")}}},[t._v("\n "+t._s(t.$t("users.sandbox"))+"\n "),t.tags.includes("sandbox")?s("i",{staticClass:"el-icon-check"}):t._e()]),t._v(" "),t.account.local?s("el-dropdown-item",{class:{"active-tag":t.tags.includes("disable_remote_subscription")},nativeOn:{click:function(e){return t.toggleTag(t.account,"disable_remote_subscription")}}},[t._v("\n "+t._s(t.$t("users.disableRemoteSubscription"))+"\n "),t.tags.includes("disable_remote_subscription")?s("i",{staticClass:"el-icon-check"}):t._e()]):t._e(),t._v(" "),t.account.local?s("el-dropdown-item",{class:{"active-tag":t.tags.includes("disable_any_subscription")},nativeOn:{click:function(e){return t.toggleTag(t.account,"disable_any_subscription")}}},[t._v("\n "+t._s(t.$t("users.disableAnySubscription"))+"\n "),t.tags.includes("disable_any_subscription")?s("i",{staticClass:"el-icon-check"}):t._e()]):t._e()],1)],1)},[],!1,null,null,null);v.options.__file="ModerateUserDropdown.vue";var _=v.exports,h={name:"Report",components:{Status:d.a,ModerateUserDropdown:_,NoteCard:u},props:{reports:{type:Array,required:!0}},data:function(){return{notes:{}}},computed:{loading:function(){return this.$store.state.reports.loading},pageSize:function(){return this.$store.state.reports.pageSize},totalReportsCount:function(){return this.$store.state.reports.totalReportsCount},currentPage:function(){return this.$store.state.reports.currentPage}},methods:{changeReportState:function(t,e){this.$store.dispatch("ChangeReportState",[{state:t,id:e}])},capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},getStateType:function(t){switch(t){case"closed":return"info";case"resolved":return"success";default:return"primary"}},getStatusesTitle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return"Reported statuses: ".concat(t.length," item(s)")},getNotesTitle:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return"Notes: ".concat(t.length," item(s)")},handleNewNote:function(t){this.$store.dispatch("CreateReportNote",{content:this.notes[t],reportID:t}),this.notes[t]=""},handlePageChange:function(t){this.$store.dispatch("FetchReports",t)},parseTimestamp:function(t){return o()(t).format("L HH:mm")},propertyExists:function(t,e,s){return s?t[e]&&t[s]:t[e]},showStatuses:function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).length>0}}},m=(s("07OA"),Object(c.a)(h,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",[s("el-timeline",{staticClass:"reports-timeline"},t._l(t.reports,function(e){return s("el-timeline-item",{key:e.id,staticClass:"timeline-item-container",attrs:{timestamp:t.parseTimestamp(e.created_at),placement:"top"}},[s("el-card",{staticClass:"report"},[s("div",{staticClass:"report-header-container"},[s("div",{staticClass:"title-container"},[t.propertyExists(e.account,"nickname")?s("h3",{staticClass:"report-title"},[t._v(t._s(t.$t("reports.reportOn"))+" "+t._s(e.account.nickname))]):s("h3",{staticClass:"report-title"},[t._v(t._s(t.$t("reports.report")))]),t._v(" "),t.propertyExists(e.account,"id")?s("h5",{staticClass:"id"},[t._v(t._s(t.$t("reports.id"))+": "+t._s(e.id))]):t._e()]),t._v(" "),s("div",[s("el-tag",{staticClass:"report-tag",attrs:{type:t.getStateType(e.state),size:"large"}},[t._v(t._s(t.capitalizeFirstLetter(e.state)))]),t._v(" "),s("el-dropdown",{attrs:{trigger:"click"}},[s("el-button",{staticClass:"report-actions-button",attrs:{plain:"",size:"small",icon:"el-icon-edit"}},[t._v(t._s(t.$t("reports.changeState"))),s("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),s("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},["resolved"!==e.state?s("el-dropdown-item",{nativeOn:{click:function(s){return t.changeReportState("resolved",e.id)}}},[t._v(t._s(t.$t("reports.resolve")))]):t._e(),t._v(" "),"open"!==e.state?s("el-dropdown-item",{nativeOn:{click:function(s){return t.changeReportState("open",e.id)}}},[t._v(t._s(t.$t("reports.reopen")))]):t._e(),t._v(" "),"closed"!==e.state?s("el-dropdown-item",{nativeOn:{click:function(s){return t.changeReportState("closed",e.id)}}},[t._v(t._s(t.$t("reports.close")))]):t._e()],1)],1),t._v(" "),t.propertyExists(e.account,"nickname")?s("moderate-user-dropdown",{attrs:{account:e.account}}):t._e()],1)]),t._v(" "),s("el-divider",{staticClass:"divider"}),t._v(" "),s("div",{staticClass:"report-account-container"},[s("span",{staticClass:"report-row-key"},[t._v(t._s(t.$t("reports.account"))+":")]),t._v(" "),s("div",{staticClass:"report-account"},[t.propertyExists(e.account,"id")?s("router-link",{staticClass:"router-link",attrs:{to:{name:"UsersShow",params:{id:e.account.id}}}},[t.propertyExists(e.account,"avatar")?s("img",{staticClass:"avatar-img",attrs:{src:e.account.avatar,alt:"avatar"}}):t._e(),t._v(" "),t.propertyExists(e.account,"nickname")?s("span",{staticClass:"report-account-name"},[t._v(t._s(e.account.nickname))]):s("span",{staticClass:"report-account-name deactivated"},[t._v("("+t._s(t.$t("users.invalidNickname"))+")")])]):s("span",{staticClass:"report-account-name deactivated"},[t._v("("+t._s(t.$t("users.invalidNickname"))+")")]),t._v(" "),t.propertyExists(e.account,"url")?s("a",{staticClass:"account",attrs:{href:e.account.url,target:"_blank"}},[t._v("\n "+t._s(t.$t("userProfile.openAccountInInstance"))+"\n "),s("i",{staticClass:"el-icon-top-right"})]):t._e()],1)]),t._v(" "),e.content&&e.content.length>0?s("div",[s("el-divider",{staticClass:"divider"}),t._v(" "),s("span",{staticClass:"report-row-key"},[t._v(t._s(t.$t("reports.content"))+":\n "),s("span",[t._v(t._s(e.content))])])],1):t._e(),t._v(" "),s("el-divider",{staticClass:"divider"}),t._v(" "),s("div",{staticClass:"report-account-container",style:t.showStatuses(e.statuses)?"":"margin-bottom:15px"},[s("span",{staticClass:"report-row-key"},[t._v(t._s(t.$t("reports.actor"))+":")]),t._v(" "),s("div",{staticClass:"report-account"},[t.propertyExists(e.actor,"id")?s("router-link",{staticClass:"router-link",attrs:{to:{name:"UsersShow",params:{id:e.actor.id}}}},[t.propertyExists(e.actor,"avatar")?s("img",{staticClass:"avatar-img",attrs:{src:e.actor.avatar,alt:"avatar"}}):t._e(),t._v(" "),t.propertyExists(e.actor,"nickname")?s("span",{staticClass:"report-account-name"},[t._v(t._s(e.actor.nickname))]):s("span",{staticClass:"report-account-name deactivated"},[t._v("("+t._s(t.$t("users.invalidNickname"))+")")])]):s("span",{staticClass:"report-account-name deactivated"},[t._v("("+t._s(t.$t("users.invalidNickname"))+")")]),t._v(" "),t.propertyExists(e.actor,"url")?s("a",{staticClass:"account",attrs:{href:e.actor.url,target:"_blank"}},[t._v("\n "+t._s(t.$t("userProfile.openAccountInInstance"))+"\n "),s("i",{staticClass:"el-icon-top-right"})]):t._e()],1)]),t._v(" "),t.showStatuses(e.statuses)?s("div",{staticClass:"reported-statuses"},[s("el-collapse",[s("el-collapse-item",{attrs:{title:t.getStatusesTitle(e.statuses)}},t._l(e.statuses,function(a){return s("div",{key:a.id},[s("status",{attrs:{status:a,account:a.account.nickname?a.account:e.account,"show-checkbox":!1,page:t.currentPage}})],1)}),0)],1)],1):t._e(),t._v(" "),s("div",{staticClass:"report-notes"},[s("el-collapse",[s("el-collapse-item",{attrs:{title:t.getNotesTitle(e.notes)}},t._l(e.notes,function(t,a){return s("note-card",{key:a,attrs:{note:t,report:e}})}),1)],1),t._v(" "),s("div",{staticClass:"report-note-form"},[s("el-input",{attrs:{placeholder:t.$t("reports.leaveNote"),type:"textarea",rows:"2"},model:{value:t.notes[e.id],callback:function(s){t.$set(t.notes,e.id,s)},expression:"notes[report.id]"}}),t._v(" "),s("div",{staticClass:"report-post-note"},[s("el-button",{on:{click:function(s){return t.handleNewNote(e.id)}}},[t._v(t._s(t.$t("reports.postNote")))])],1)],1)],1)],1)],1)}),1),t._v(" "),t.loading?t._e():s("div",{staticClass:"reports-pagination"},[s("el-pagination",{attrs:{total:t.totalReportsCount,"current-page":t.currentPage,"page-size":t.pageSize,background:"",layout:"prev, pager, next"},on:{"current-change":t.handlePageChange}})],1)],1)},[],!1,null,null,null));m.options.__file="Report.vue";var g=m.exports,j=s("mSNy"),f={data:function(){return{filter:"open",options:[{value:"open",label:j.a.t("reportsFilter.open")},{value:"closed",label:j.a.t("reportsFilter.closed")},{value:"resolved",label:j.a.t("reportsFilter.resolved")}]}},created:function(){this.$store.dispatch("SetFilter",this.$data.filter)},methods:{toggleFilters:function(){this.$store.dispatch("SetFilter",this.$data.filter),this.$store.dispatch("ClearFetchedReports"),this.$store.dispatch("FetchReports",1)}}},k=(s("Eg1M"),Object(c.a)(f,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("el-select",{staticClass:"select-field",attrs:{placeholder:t.$t("reportsFilter.inputPlaceholder"),clearable:"","value-key":"value"},on:{change:t.toggleFilters},model:{value:t.filter,callback:function(e){t.filter=e},expression:"filter"}},t._l(t.options,function(e){return s("el-option",{key:e.value,attrs:{label:e.label,value:e.value}},[t._v(t._s(e.label))])}),1)},[],!1,null,"ecc36f5a",null));k.options.__file="ReportsFilter.vue";var b=k.exports,C={components:{RebootButton:s("rIUS").a,Report:g,ReportsFilter:b},computed:{loading:function(){return this.$store.state.reports.loading},normalizedReportsCount:function(){return n()(this.$store.state.reports.totalReportsCount).format("0a")},reports:function(){return this.$store.state.reports.fetchedReports}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchReports",1)}},y=(s("Lbbz"),Object(c.a)(C,function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"reports-container"},[s("div",{staticClass:"reports-header-container"},[s("h1",[t._v("\n "+t._s(t.$t("reports.reports"))+"\n "),s("span",{staticClass:"report-count"},[t._v("("+t._s(t.normalizedReportsCount)+")")])]),t._v(" "),s("reboot-button")],1),t._v(" "),s("div",{staticClass:"reports-filter-container"},[s("reports-filter")],1),t._v(" "),s("div",{staticClass:"block"},[s("report",{directives:[{name:"loading",rawName:"v-loading",value:t.loading,expression:"loading"}],attrs:{reports:t.reports}}),t._v(" "),0===t.reports.length?s("div",{staticClass:"no-reports-message"},[s("p",[t._v("There are no reports to display")])]):t._e()],1)])},[],!1,null,"fa601560",null));y.options.__file="index.vue";e.default=y.exports},xdcp:function(t,e,s){}}]); +//# sourceMappingURL=chunk-e404.554bc2e3.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-e404.554bc2e3.js.map b/priv/static/adminfe/static/js/chunk-e404.554bc2e3.js.map new file mode 100644 index 000000000..e8214adbb --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-e404.554bc2e3.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/reports/components/Report.vue?ad5f","webpack:///./src/views/reports/components/ReportsFilter.vue?a490","webpack:///./src/views/reports/components/NoteCard.vue?b93a","webpack:///./src/views/reports/index.vue?cda2","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/views/reports/index.vue?43f7","webpack:///./src/views/reports/components/NoteCard.vue?6205","webpack:///src/views/reports/components/NoteCard.vue","webpack:///./src/views/reports/components/NoteCard.vue","webpack:///./src/views/reports/components/NoteCard.vue?6977","webpack:///./src/views/reports/components/ModerateUserDropdown.vue?6745","webpack:///src/views/reports/components/ModerateUserDropdown.vue","webpack:///./src/views/reports/components/ModerateUserDropdown.vue","webpack:///./src/views/reports/components/ModerateUserDropdown.vue?65ad","webpack:///./src/views/reports/components/Report.vue?a764","webpack:///src/views/reports/components/Report.vue","webpack:///./src/views/reports/components/Report.vue","webpack:///./src/views/reports/components/Report.vue?9727","webpack:///./src/views/reports/components/ReportsFilter.vue?e3b7","webpack:///src/views/reports/components/ReportsFilter.vue","webpack:///./src/views/reports/components/ReportsFilter.vue","webpack:///./src/views/reports/components/ReportsFilter.vue?f6ad","webpack:///./src/views/reports/index.vue?3bcc","webpack:///src/views/reports/index.vue","webpack:///./src/views/reports/index.vue"],"names":["_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_Report_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_ReportsFilter_vue_vue_type_style_index_0_id_ecc36f5a_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_NoteCard_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_id_fa601560_rel_stylesheet_2Fscss_lang_scss_scoped_true___WEBPACK_IMPORTED_MODULE_0__","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","id","webpackContextResolve","o","e","Error","code","keys","Object","resolve","module","exports","components_NoteCardvue_type_script_lang_js_","name","props","report","type","required","note","methods","handleNoteDeletion","noteID","reportID","_this","this","$confirm","confirmButtonText","cancelButtonText","then","$store","dispatch","$message","message","catch","parseTimestamp","timestamp","moment_default","format","propertyExists","account","property","component","componentNormalizer","_vm","_h","$createElement","_c","_self","staticClass","attrs","slot","user","to","params","src","avatar","alt","_e","_v","_s","nickname","$t","size","nativeOn","click","$event","domProps","innerHTML","content","created_at","options","__file","NoteCard","components_ModerateUserDropdownvue_type_script_lang_js_","computed","tags","handleDeactivation","_ref","handleDeletion","showDeactivatedButton","state","toggleTag","tag","includes","users","ModerateUserDropdown_component","trigger","disabled","plain","icon","deactivated","class","active-tag","divided","ModerateUserDropdown","components_Reportvue_type_script_lang_js_","components","Status","reports","Array","data","notes","loading","pageSize","totalReportsCount","currentPage","changeReportState","capitalizeFirstLetter","str","charAt","toUpperCase","slice","getStateType","getStatusesTitle","statuses","arguments","length","undefined","concat","getNotesTitle","handleNewNote","handlePageChange","page","_secondProperty","showStatuses","Report_component","_l","key","placement","href","url","target","style","actor","title","status","show-checkbox","index","placeholder","rows","model","value","callback","$$v","$set","expression","on","total","current-page","page-size","background","layout","current-change","Report","components_ReportsFiltervue_type_script_lang_js_","filter","label","lang","t","created","$data","toggleFilters","ReportsFilter_component","clearable","value-key","change","item","ReportsFilter","views_reportsvue_type_script_lang_js_","RebootButton","normalizedReportsCount","numeral_default","fetchedReports","mounted","reports_component","directives","rawName","__webpack_exports__"],"mappings":"wGAAA,IAAAA,EAAAC,EAAA,QAAAA,EAAAC,EAAAF,GAA0e,uFCA1e,IAAAG,EAAAF,EAAA,QAAAA,EAAAC,EAAAC,GAAygB,uCCAzgB,IAAAC,EAAAH,EAAA,QAAAA,EAAAC,EAAAE,GAA4e,qCCA5e,IAAAC,EAAAJ,EAAA,QAAAA,EAAAC,EAAAG,GAA+e,wBCA/e,IAAAC,GACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACA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","file":"static/js/chunk-e404.554bc2e3.js","sourcesContent":["import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=style&index=0&id=ecc36f5a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=style&index=0&id=ecc36f5a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","import mod from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../../node_modules/css-loader/index.js??ref--11-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=fa601560&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=fa601560&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"reports-container\"},[_c('div',{staticClass:\"reports-header-container\"},[_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.reports'))+\"\\n \"),_c('span',{staticClass:\"report-count\"},[_vm._v(\"(\"+_vm._s(_vm.normalizedReportsCount)+\")\")])]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"reports-filter-container\"},[_c('reports-filter')],1),_vm._v(\" \"),_c('div',{staticClass:\"block\"},[_c('report',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(_vm.loading),expression:\"loading\"}],attrs:{\"reports\":_vm.reports}}),_vm._v(\" \"),(_vm.reports.length === 0)?_c('div',{staticClass:\"no-reports-message\"},[_c('p',[_vm._v(\"There are no reports to display\")])]):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NoteCard.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./NoteCard.vue?vue&type=template&id=030edbfd&\"\nimport script from \"./NoteCard.vue?vue&type=script&lang=js&\"\nexport * from \"./NoteCard.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NoteCard.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"NoteCard.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-card',{staticClass:\"note-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"note-header\"},[(_vm.propertyExists(_vm.note.user, 'id'))?_c('router-link',{staticClass:\"router-link\",attrs:{\"to\":{ name: 'UsersShow', params: { id: _vm.note.user.id }}}},[_c('div',{staticClass:\"note-actor\"},[(_vm.propertyExists(_vm.note.user, 'avatar'))?_c('img',{staticClass:\"note-avatar-img\",attrs:{\"src\":_vm.note.user.avatar,\"alt\":\"avatar\"}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(_vm.note.user, 'nickname'))?_c('span',{staticClass:\"note-actor-name\"},[_vm._v(_vm._s(_vm.note.user.nickname))]):_c('span',{staticClass:\"note-actor-name deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")])])]):_vm._e(),_vm._v(\" \"),_c('el-button',{attrs:{\"size\":\"mini\"},nativeOn:{\"click\":function($event){return _vm.handleNoteDeletion(_vm.note.id, _vm.report.id)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.deleteNote'))+\"\\n \")])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"note-body\"},[_c('span',{staticClass:\"note-content\",domProps:{\"innerHTML\":_vm._s(_vm.note.content)}}),_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.note.created_at))+\"\\n \")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerateUserDropdown.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ModerateUserDropdown.vue?vue&type=script&lang=js&\"","\n\n\n","import { render, staticRenderFns } from \"./ModerateUserDropdown.vue?vue&type=template&id=bcf0134c&\"\nimport script from \"./ModerateUserDropdown.vue?vue&type=script&lang=js&\"\nexport * from \"./ModerateUserDropdown.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"ModerateUserDropdown.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-dropdown',{attrs:{\"trigger\":\"click\"}},[_c('el-button',{attrs:{\"disabled\":!_vm.account.id,\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-files\"}},[_vm._v(_vm._s(_vm.$t('reports.moderateUser'))+\"\\n \"),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(_vm.showDeactivatedButton(_vm.account))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeactivation(_vm.account)}}},[_vm._v(\"\\n \"+_vm._s(_vm.account.deactivated ? _vm.$t('users.activateAccount') : _vm.$t('users.deactivateAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.showDeactivatedButton(_vm.account.id))?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.handleDeletion(_vm.account.id)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.deleteAccount'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('force_nsfw') },attrs:{\"divided\":true},nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'force_nsfw')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceNsfw'))+\"\\n \"),(_vm.tags.includes('force_nsfw'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('strip_media') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'strip_media')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.stripMedia'))+\"\\n \"),(_vm.tags.includes('strip_media'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('force_unlisted') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'force_unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.forceUnlisted'))+\"\\n \"),(_vm.tags.includes('force_unlisted'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('sandbox') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'sandbox')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.sandbox'))+\"\\n \"),(_vm.tags.includes('sandbox'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]),_vm._v(\" \"),(_vm.account.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('disable_remote_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'disable_remote_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableRemoteSubscription'))+\"\\n \"),(_vm.tags.includes('disable_remote_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e(),_vm._v(\" \"),(_vm.account.local)?_c('el-dropdown-item',{class:{ 'active-tag': _vm.tags.includes('disable_any_subscription') },nativeOn:{\"click\":function($event){return _vm.toggleTag(_vm.account, 'disable_any_subscription')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('users.disableAnySubscription'))+\"\\n \"),(_vm.tags.includes('disable_any_subscription'))?_c('i',{staticClass:\"el-icon-check\"}):_vm._e()]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Report.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./Report.vue?vue&type=template&id=14ff42ce&\"\nimport script from \"./Report.vue?vue&type=script&lang=js&\"\nexport * from \"./Report.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Report.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"Report.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('el-timeline',{staticClass:\"reports-timeline\"},_vm._l((_vm.reports),function(report){return _c('el-timeline-item',{key:report.id,staticClass:\"timeline-item-container\",attrs:{\"timestamp\":_vm.parseTimestamp(report.created_at),\"placement\":\"top\"}},[_c('el-card',{staticClass:\"report\"},[_c('div',{staticClass:\"report-header-container\"},[_c('div',{staticClass:\"title-container\"},[(_vm.propertyExists(report.account, 'nickname'))?_c('h3',{staticClass:\"report-title\"},[_vm._v(_vm._s(_vm.$t('reports.reportOn'))+\" \"+_vm._s(report.account.nickname))]):_c('h3',{staticClass:\"report-title\"},[_vm._v(_vm._s(_vm.$t('reports.report')))]),_vm._v(\" \"),(_vm.propertyExists(report.account, 'id'))?_c('h5',{staticClass:\"id\"},[_vm._v(_vm._s(_vm.$t('reports.id'))+\": \"+_vm._s(report.id))]):_vm._e()]),_vm._v(\" \"),_c('div',[_c('el-tag',{staticClass:\"report-tag\",attrs:{\"type\":_vm.getStateType(report.state),\"size\":\"large\"}},[_vm._v(_vm._s(_vm.capitalizeFirstLetter(report.state)))]),_vm._v(\" \"),_c('el-dropdown',{attrs:{\"trigger\":\"click\"}},[_c('el-button',{staticClass:\"report-actions-button\",attrs:{\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-edit\"}},[_vm._v(_vm._s(_vm.$t('reports.changeState'))),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(report.state !== 'resolved')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeReportState('resolved', report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.resolve')))]):_vm._e(),_vm._v(\" \"),(report.state !== 'open')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeReportState('open', report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.reopen')))]):_vm._e(),_vm._v(\" \"),(report.state !== 'closed')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeReportState('closed', report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.close')))]):_vm._e()],1)],1),_vm._v(\" \"),(_vm.propertyExists(report.account, 'nickname'))?_c('moderate-user-dropdown',{attrs:{\"account\":report.account}}):_vm._e()],1)]),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('div',{staticClass:\"report-account-container\"},[_c('span',{staticClass:\"report-row-key\"},[_vm._v(_vm._s(_vm.$t('reports.account'))+\":\")]),_vm._v(\" \"),_c('div',{staticClass:\"report-account\"},[(_vm.propertyExists(report.account, 'id'))?_c('router-link',{staticClass:\"router-link\",attrs:{\"to\":{ name: 'UsersShow', params: { id: report.account.id }}}},[(_vm.propertyExists(report.account, 'avatar'))?_c('img',{staticClass:\"avatar-img\",attrs:{\"src\":report.account.avatar,\"alt\":\"avatar\"}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(report.account, 'nickname'))?_c('span',{staticClass:\"report-account-name\"},[_vm._v(_vm._s(report.account.nickname))]):_c('span',{staticClass:\"report-account-name deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")])]):_c('span',{staticClass:\"report-account-name deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")]),_vm._v(\" \"),(_vm.propertyExists(report.account, 'url'))?_c('a',{staticClass:\"account\",attrs:{\"href\":report.account.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.openAccountInInstance'))+\"\\n \"),_c('i',{staticClass:\"el-icon-top-right\"})]):_vm._e()],1)]),_vm._v(\" \"),(report.content && report.content.length > 0)?_c('div',[_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('span',{staticClass:\"report-row-key\"},[_vm._v(_vm._s(_vm.$t('reports.content'))+\":\\n \"),_c('span',[_vm._v(_vm._s(report.content))])])],1):_vm._e(),_vm._v(\" \"),_c('el-divider',{staticClass:\"divider\"}),_vm._v(\" \"),_c('div',{staticClass:\"report-account-container\",style:(_vm.showStatuses(report.statuses) ? '' : 'margin-bottom:15px')},[_c('span',{staticClass:\"report-row-key\"},[_vm._v(_vm._s(_vm.$t('reports.actor'))+\":\")]),_vm._v(\" \"),_c('div',{staticClass:\"report-account\"},[(_vm.propertyExists(report.actor, 'id'))?_c('router-link',{staticClass:\"router-link\",attrs:{\"to\":{ name: 'UsersShow', params: { id: report.actor.id }}}},[(_vm.propertyExists(report.actor, 'avatar'))?_c('img',{staticClass:\"avatar-img\",attrs:{\"src\":report.actor.avatar,\"alt\":\"avatar\"}}):_vm._e(),_vm._v(\" \"),(_vm.propertyExists(report.actor, 'nickname'))?_c('span',{staticClass:\"report-account-name\"},[_vm._v(_vm._s(report.actor.nickname))]):_c('span',{staticClass:\"report-account-name deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")])]):_c('span',{staticClass:\"report-account-name deactivated\"},[_vm._v(\"(\"+_vm._s(_vm.$t('users.invalidNickname'))+\")\")]),_vm._v(\" \"),(_vm.propertyExists(report.actor, 'url'))?_c('a',{staticClass:\"account\",attrs:{\"href\":report.actor.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('userProfile.openAccountInInstance'))+\"\\n \"),_c('i',{staticClass:\"el-icon-top-right\"})]):_vm._e()],1)]),_vm._v(\" \"),(_vm.showStatuses(report.statuses))?_c('div',{staticClass:\"reported-statuses\"},[_c('el-collapse',[_c('el-collapse-item',{attrs:{\"title\":_vm.getStatusesTitle(report.statuses)}},_vm._l((report.statuses),function(status){return _c('div',{key:status.id},[_c('status',{attrs:{\"status\":status,\"account\":status.account.nickname ? status.account : report.account,\"show-checkbox\":false,\"page\":_vm.currentPage}})],1)}),0)],1)],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"report-notes\"},[_c('el-collapse',[_c('el-collapse-item',{attrs:{\"title\":_vm.getNotesTitle(report.notes)}},_vm._l((report.notes),function(note,index){return _c('note-card',{key:index,attrs:{\"note\":note,\"report\":report}})}),1)],1),_vm._v(\" \"),_c('div',{staticClass:\"report-note-form\"},[_c('el-input',{attrs:{\"placeholder\":_vm.$t('reports.leaveNote'),\"type\":\"textarea\",\"rows\":\"2\"},model:{value:(_vm.notes[report.id]),callback:function ($$v) {_vm.$set(_vm.notes, report.id, $$v)},expression:\"notes[report.id]\"}}),_vm._v(\" \"),_c('div',{staticClass:\"report-post-note\"},[_c('el-button',{on:{\"click\":function($event){return _vm.handleNewNote(report.id)}}},[_vm._v(_vm._s(_vm.$t('reports.postNote')))])],1)],1)],1)],1)],1)}),1),_vm._v(\" \"),(!_vm.loading)?_c('div',{staticClass:\"reports-pagination\"},[_c('el-pagination',{attrs:{\"total\":_vm.totalReportsCount,\"current-page\":_vm.currentPage,\"page-size\":_vm.pageSize,\"background\":\"\",\"layout\":\"prev, pager, next\"},on:{\"current-change\":_vm.handlePageChange}})],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ReportsFilter.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./ReportsFilter.vue?vue&type=template&id=ecc36f5a&scoped=true&\"\nimport script from \"./ReportsFilter.vue?vue&type=script&lang=js&\"\nexport * from \"./ReportsFilter.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ReportsFilter.vue?vue&type=style&index=0&id=ecc36f5a&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ecc36f5a\",\n null\n \n)\n\ncomponent.options.__file = \"ReportsFilter.vue\"\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('el-select',{staticClass:\"select-field\",attrs:{\"placeholder\":_vm.$t('reportsFilter.inputPlaceholder'),\"clearable\":\"\",\"value-key\":\"value\"},on:{\"change\":_vm.toggleFilters},model:{value:(_vm.filter),callback:function ($$v) {_vm.filter=$$v},expression:\"filter\"}},_vm._l((_vm.options),function(item){return _c('el-option',{key:item.value,attrs:{\"label\":item.label,\"value\":item.value}},[_vm._v(_vm._s(item.label))])}),1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=fa601560&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=fa601560&rel=stylesheet%2Fscss&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"fa601560\",\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-e458.4e5aad44.js b/priv/static/adminfe/static/js/chunk-e458.4e5aad44.js deleted file mode 100644 index a02c83110..000000000 --- a/priv/static/adminfe/static/js/chunk-e458.4e5aad44.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-e458"],{FtQ1:function(t,s,e){"use strict";e.r(s);var a=e("RIqP"),n=e.n(a),i=e("i7Kn"),o=e("ot3S"),r=e("rIUS"),c={name:"Statuses",components:{MultipleUsersMenu:i.a,RebootButton:r.a,Status:o.a},data:function(){return{selectedUsers:[]}},computed:{allLoaded:function(){return this.$store.state.status.statusesByInstance.allLoaded},buttonLoading:function(){return this.$store.state.status.statusesByInstance.buttonLoading},currentInstance:function(){return this.selectedInstance===this.$store.state.user.authHost},instances:function(){return[this.$store.state.user.authHost].concat(n()(this.$store.state.peers.fetchedPeers))},isDesktop:function(){return"desktop"===this.$store.state.app.device},isMobile:function(){return"mobile"===this.$store.state.app.device},isTablet:function(){return"tablet"===this.$store.state.app.device},loadingPeers:function(){return this.$store.state.peers.loading},page:function(){return this.$store.state.status.statusesByInstance.page},pageSize:function(){return this.$store.state.status.statusesByInstance.pageSize},selectedInstance:{get:function(){return this.$store.state.status.statusesByInstance.selectedInstance},set:function(t){this.$store.dispatch("HandleFilterChange",t)}},showLocal:{get:function(){return this.$store.state.status.statusesByInstance.showLocal},set:function(t){this.$store.dispatch("HandleLocalCheckboxChange",t)}},showPrivate:{get:function(){return this.$store.state.status.statusesByInstance.showPrivate},set:function(t){this.$store.dispatch("HandleGodmodeCheckboxChange",t)}},statuses:function(){return this.$store.state.status.fetchedStatuses},statusVisibility:function(){return this.$store.state.status.statusVisibility}},mounted:function(){this.$store.dispatch("GetNodeInfo"),this.$store.dispatch("NeedReboot"),this.$store.dispatch("FetchPeers"),this.$store.dispatch("FetchStatusesCount")},methods:{handleFilterChange:function(){this.$store.dispatch("HandlePageChange",1),this.$store.dispatch("FetchStatusesByInstance")},handleLoadMore:function(){this.$store.dispatch("HandlePageChange",this.page+1),this.$store.dispatch("FetchStatusesPageByInstance")},clearSelection:function(){this.selectedUsers=[]},handleStatusSelection:function(t){void 0===this.selectedUsers.find(function(s){return t.id===s.id})&&(this.selectedUsers=[].concat(n()(this.selectedUsers),[t]))}}},u=(e("QOJ7"),e("KHd+")),l=Object(u.a)(c,function(){var t=this,s=t.$createElement,e=t._self._c||s;return t.loadingPeers?t._e():e("div",{staticClass:"statuses-container"},[e("div",{staticClass:"statuses-header"},[e("h1",[t._v("\n "+t._s(t.$t("statuses.statuses"))+"\n ")]),t._v(" "),e("reboot-button")],1),t._v(" "),e("div",{staticClass:"statuses-header-container"},[e("el-button-group",[e("el-button",{attrs:{plain:""}},[t._v(t._s(t.$t("statuses.direct"))+": "+t._s(t.statusVisibility.direct))]),t._v(" "),e("el-button",{attrs:{plain:""}},[t._v(t._s(t.$t("statuses.private"))+": "+t._s(t.statusVisibility.private))]),t._v(" "),e("el-button",{attrs:{plain:""}},[t._v(t._s(t.$t("statuses.public"))+": "+t._s(t.statusVisibility.public))]),t._v(" "),e("el-button",{attrs:{plain:""}},[t._v(t._s(t.$t("statuses.unlisted"))+": "+t._s(t.statusVisibility.unlisted))])],1)],1),t._v(" "),e("div",{staticClass:"filter-container"},[e("el-select",{staticClass:"select-instance",attrs:{placeholder:t.$t("statuses.instanceFilter"),"no-data-text":t.$t("statuses.noInstances"),filterable:"",clearable:""},on:{change:t.handleFilterChange},model:{value:t.selectedInstance,callback:function(s){t.selectedInstance=s},expression:"selectedInstance"}},t._l(t.instances,function(t,s){return e("el-option",{key:s,attrs:{label:t,value:t}})}),1),t._v(" "),e("multiple-users-menu",{attrs:{"selected-users":t.selectedUsers},on:{"apply-action":t.clearSelection}})],1),t._v(" "),t.currentInstance?e("div",{staticClass:"checkbox-container"},[e("el-checkbox",{staticClass:"show-private-statuses",model:{value:t.showLocal,callback:function(s){t.showLocal=s},expression:"showLocal"}},[t._v("\n "+t._s(t.$t("statuses.onlyLocalStatuses"))+"\n ")]),t._v(" "),e("el-checkbox",{staticClass:"show-private-statuses",model:{value:t.showPrivate,callback:function(s){t.showPrivate=s},expression:"showPrivate"}},[t._v("\n "+t._s(t.$t("statuses.showPrivateStatuses"))+"\n ")])],1):t._e(),t._v(" "),0===t.statuses.length?e("p",{staticClass:"no-statuses"},[t._v(t._s(t.$t("userProfile.noStatuses")))]):t._e(),t._v(" "),t._l(t.statuses,function(s){return e("div",{key:s.id,staticClass:"status-container"},[e("status",{attrs:{status:s,account:s.account,"show-checkbox":t.isDesktop,"fetch-statuses-by-instance":!0},on:{"status-selection":t.handleStatusSelection}})],1)}),t._v(" "),t.statuses.length>0?e("div",{staticClass:"statuses-pagination"},[t.allLoaded?e("el-button",{attrs:{icon:"el-icon-check",circle:""}}):e("el-button",{attrs:{loading:t.buttonLoading},on:{click:t.handleLoadMore}},[t._v(t._s(t.$t("statuses.loadMore")))])],1):t._e()],2)},[],!1,null,null,null);l.options.__file="index.vue";s.default=l.exports},KmHg:function(t,s,e){},Kw8l:function(t,s,e){"use strict";var a=e("cRgN");e.n(a).a},QOJ7:function(t,s,e){"use strict";var a=e("KmHg");e.n(a).a},RnhZ:function(t,s,e){var a={"./af":"K/tc","./af.js":"K/tc","./ar":"jnO4","./ar-dz":"o1bE","./ar-dz.js":"o1bE","./ar-kw":"Qj4J","./ar-kw.js":"Qj4J","./ar-ly":"HP3h","./ar-ly.js":"HP3h","./ar-ma":"CoRJ","./ar-ma.js":"CoRJ","./ar-sa":"gjCT","./ar-sa.js":"gjCT","./ar-tn":"bYM6","./ar-tn.js":"bYM6","./ar.js":"jnO4","./az":"SFxW","./az.js":"SFxW","./be":"H8ED","./be.js":"H8ED","./bg":"hKrs","./bg.js":"hKrs","./bm":"p/rL","./bm.js":"p/rL","./bn":"kEOa","./bn.js":"kEOa","./bo":"0mo+","./bo.js":"0mo+","./br":"aIdf","./br.js":"aIdf","./bs":"JVSJ","./bs.js":"JVSJ","./ca":"1xZ4","./ca.js":"1xZ4","./cs":"PA2r","./cs.js":"PA2r","./cv":"A+xa","./cv.js":"A+xa","./cy":"l5ep","./cy.js":"l5ep","./da":"DxQv","./da.js":"DxQv","./de":"tGlX","./de-at":"s+uk","./de-at.js":"s+uk","./de-ch":"u3GI","./de-ch.js":"u3GI","./de.js":"tGlX","./dv":"WYrj","./dv.js":"WYrj","./el":"jUeY","./el.js":"jUeY","./en-SG":"zavE","./en-SG.js":"zavE","./en-au":"Dmvi","./en-au.js":"Dmvi","./en-ca":"OIYi","./en-ca.js":"OIYi","./en-gb":"Oaa7","./en-gb.js":"Oaa7","./en-ie":"4dOw","./en-ie.js":"4dOw","./en-il":"czMo","./en-il.js":"czMo","./en-nz":"b1Dy","./en-nz.js":"b1Dy","./eo":"Zduo","./eo.js":"Zduo","./es":"iYuL","./es-do":"CjzT","./es-do.js":"CjzT","./es-us":"Vclq","./es-us.js":"Vclq","./es.js":"iYuL","./et":"7BjC","./et.js":"7BjC","./eu":"D/JM","./eu.js":"D/JM","./fa":"jfSC","./fa.js":"jfSC","./fi":"gekB","./fi.js":"gekB","./fo":"ByF4","./fo.js":"ByF4","./fr":"nyYc","./fr-ca":"2fjn","./fr-ca.js":"2fjn","./fr-ch":"Dkky","./fr-ch.js":"Dkky","./fr.js":"nyYc","./fy":"cRix","./fy.js":"cRix","./ga":"USCx","./ga.js":"USCx","./gd":"9rRi","./gd.js":"9rRi","./gl":"iEDd","./gl.js":"iEDd","./gom-latn":"DKr+","./gom-latn.js":"DKr+","./gu":"4MV3","./gu.js":"4MV3","./he":"x6pH","./he.js":"x6pH","./hi":"3E1r","./hi.js":"3E1r","./hr":"S6ln","./hr.js":"S6ln","./hu":"WxRl","./hu.js":"WxRl","./hy-am":"1rYy","./hy-am.js":"1rYy","./id":"UDhR","./id.js":"UDhR","./is":"BVg3","./is.js":"BVg3","./it":"bpih","./it-ch":"bxKX","./it-ch.js":"bxKX","./it.js":"bpih","./ja":"B55N","./ja.js":"B55N","./jv":"tUCv","./jv.js":"tUCv","./ka":"IBtZ","./ka.js":"IBtZ","./kk":"bXm7","./kk.js":"bXm7","./km":"6B0Y","./km.js":"6B0Y","./kn":"PpIw","./kn.js":"PpIw","./ko":"Ivi+","./ko.js":"Ivi+","./ku":"JCF/","./ku.js":"JCF/","./ky":"lgnt","./ky.js":"lgnt","./lb":"RAwQ","./lb.js":"RAwQ","./lo":"sp3z","./lo.js":"sp3z","./lt":"JvlW","./lt.js":"JvlW","./lv":"uXwI","./lv.js":"uXwI","./me":"KTz0","./me.js":"KTz0","./mi":"aIsn","./mi.js":"aIsn","./mk":"aQkU","./mk.js":"aQkU","./ml":"AvvY","./ml.js":"AvvY","./mn":"lYtQ","./mn.js":"lYtQ","./mr":"Ob0Z","./mr.js":"Ob0Z","./ms":"6+QB","./ms-my":"ZAMP","./ms-my.js":"ZAMP","./ms.js":"6+QB","./mt":"G0Uy","./mt.js":"G0Uy","./my":"honF","./my.js":"honF","./nb":"bOMt","./nb.js":"bOMt","./ne":"OjkT","./ne.js":"OjkT","./nl":"+s0g","./nl-be":"2ykv","./nl-be.js":"2ykv","./nl.js":"+s0g","./nn":"uEye","./nn.js":"uEye","./pa-in":"8/+R","./pa-in.js":"8/+R","./pl":"jVdC","./pl.js":"jVdC","./pt":"8mBD","./pt-br":"0tRk","./pt-br.js":"0tRk","./pt.js":"8mBD","./ro":"lyxo","./ro.js":"lyxo","./ru":"lXzo","./ru.js":"lXzo","./sd":"Z4QM","./sd.js":"Z4QM","./se":"//9w","./se.js":"//9w","./si":"7aV9","./si.js":"7aV9","./sk":"e+ae","./sk.js":"e+ae","./sl":"gVVK","./sl.js":"gVVK","./sq":"yPMs","./sq.js":"yPMs","./sr":"zx6S","./sr-cyrl":"E+lV","./sr-cyrl.js":"E+lV","./sr.js":"zx6S","./ss":"Ur1D","./ss.js":"Ur1D","./sv":"X709","./sv.js":"X709","./sw":"dNwA","./sw.js":"dNwA","./ta":"PeUW","./ta.js":"PeUW","./te":"XLvN","./te.js":"XLvN","./tet":"V2x9","./tet.js":"V2x9","./tg":"Oxv6","./tg.js":"Oxv6","./th":"EOgW","./th.js":"EOgW","./tl-ph":"Dzi0","./tl-ph.js":"Dzi0","./tlh":"z3Vd","./tlh.js":"z3Vd","./tr":"DoHr","./tr.js":"DoHr","./tzl":"z1FC","./tzl.js":"z1FC","./tzm":"wQk9","./tzm-latn":"tT3J","./tzm-latn.js":"tT3J","./tzm.js":"wQk9","./ug-cn":"YRex","./ug-cn.js":"YRex","./uk":"raLr","./uk.js":"raLr","./ur":"UpQW","./ur.js":"UpQW","./uz":"Loxo","./uz-latn":"AQ68","./uz-latn.js":"AQ68","./uz.js":"Loxo","./vi":"KSF8","./vi.js":"KSF8","./x-pseudo":"/X5v","./x-pseudo.js":"/X5v","./yo":"fzPg","./yo.js":"fzPg","./zh-cn":"XDpg","./zh-cn.js":"XDpg","./zh-hk":"SatO","./zh-hk.js":"SatO","./zh-tw":"kOpN","./zh-tw.js":"kOpN"};function n(t){var s=i(t);return e(s)}function i(t){if(!e.o(a,t)){var s=new Error("Cannot find module '"+t+"'");throw s.code="MODULE_NOT_FOUND",s}return a[t]}n.keys=function(){return Object.keys(a)},n.resolve=i,t.exports=n,n.id="RnhZ"},cRgN:function(t,s,e){},ot3S:function(t,s,e){"use strict";var a=e("wd/R"),n=e.n(a),i={name:"Status",props:{account:{type:Object,required:!1,default:function(){return{}}},fetchStatusesByInstance:{type:Boolean,required:!1,default:!1},showCheckbox:{type:Boolean,required:!0,default:!1},status:{type:Object,required:!0},page:{type:Number,required:!1,default:0},userId:{type:String,required:!1,default:""},godmode:{type:Boolean,required:!1,default:!1}},data:function(){return{showHiddenStatus:!1}},methods:{capitalizeFirstLetter:function(t){return t.charAt(0).toUpperCase()+t.slice(1)},changeStatus:function(t,s,e){this.$store.dispatch("ChangeStatusScope",{statusId:t,isSensitive:s,visibility:e,reportCurrentPage:this.page,userId:this.userId,godmode:this.godmode,fetchStatusesByInstance:this.fetchStatusesByInstance})},deleteStatus:function(t){var s=this;this.$confirm("Are you sure you want to delete this status?","Warning",{confirmButtonText:"OK",cancelButtonText:"Cancel",type:"warning"}).then(function(){s.$store.dispatch("DeleteStatus",{statusId:t,reportCurrentPage:s.page,userId:s.userId,godmode:s.godmode,fetchStatusesByInstance:s.fetchStatusesByInstance}),s.$message({type:"success",message:"Delete completed"})}).catch(function(){s.$message({type:"info",message:"Delete canceled"})})},optionPercent:function(t,s){var e=t.options.reduce(function(t,s){return t+s.votes_count},0);return 0===e?0:+(s.votes_count/e*100).toFixed(1)},parseTimestamp:function(t){return n()(t).format("YYYY-MM-DD HH:mm")},handleStatusSelection:function(t){this.$emit("status-selection",t)}}},o=(e("Kw8l"),e("KHd+")),r=Object(o.a)(i,function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",[t.status.deleted?e("el-card",{staticClass:"status-card"},[e("div",{attrs:{slot:"header"},slot:"header"},[e("div",{staticClass:"status-header"},[e("div",{staticClass:"status-account-container"},[e("div",{staticClass:"status-account"},[e("h4",{staticClass:"status-deleted"},[t._v(t._s(t.$t("reports.statusDeleted")))])])])])]),t._v(" "),e("div",{staticClass:"status-body"},[t.status.content?e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}):e("span",{staticClass:"status-without-content"},[t._v("no content")])]),t._v(" "),t.status.created_at?e("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"}},[t._v("\n "+t._s(t.parseTimestamp(t.status.created_at))+"\n ")]):t._e()]):e("el-card",{staticClass:"status-card"},[e("div",{attrs:{slot:"header"},slot:"header"},[e("div",{staticClass:"status-header"},[e("div",{staticClass:"status-account-container"},[e("div",{staticClass:"status-account"},[t.showCheckbox?e("el-checkbox",{staticClass:"status-checkbox",on:{change:function(s){return t.handleStatusSelection(t.account)}}}):t._e(),t._v(" "),e("img",{staticClass:"status-avatar-img",attrs:{src:t.account.avatar}}),t._v(" "),t.account.deactivated?e("span",[e("h3",{staticClass:"status-account-name"},[t._v(t._s(t.account.display_name))]),t._v(" "),e("h3",{staticClass:"status-account-name deactivated"},[t._v(" (deactivated)")])]):e("a",{staticClass:"account",attrs:{href:t.account.url,target:"_blank"}},[e("h3",{staticClass:"status-account-name"},[t._v(t._s(t.account.display_name))])])],1)]),t._v(" "),e("div",{staticClass:"status-actions"},[t.status.sensitive?e("el-tag",{attrs:{type:"warning",size:"large"}},[t._v(t._s(t.$t("reports.sensitive")))]):t._e(),t._v(" "),e("el-tag",{attrs:{size:"large"}},[t._v(t._s(t.capitalizeFirstLetter(t.status.visibility)))]),t._v(" "),e("el-dropdown",{attrs:{trigger:"click"}},[e("el-button",{staticClass:"status-actions-button",attrs:{plain:"",size:"small",icon:"el-icon-edit"}},[t._v("\n "+t._s(t.$t("reports.changeScope"))),e("i",{staticClass:"el-icon-arrow-down el-icon--right"})]),t._v(" "),e("el-dropdown-menu",{attrs:{slot:"dropdown"},slot:"dropdown"},[t.status.sensitive?t._e():e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,!0,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.addSensitive"))+"\n ")]),t._v(" "),t.status.sensitive?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,!1,t.status.visibility)}}},[t._v("\n "+t._s(t.$t("reports.removeSensitive"))+"\n ")]):t._e(),t._v(" "),"public"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"public")}}},[t._v("\n "+t._s(t.$t("reports.public"))+"\n ")]):t._e(),t._v(" "),"private"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"private")}}},[t._v("\n "+t._s(t.$t("reports.private"))+"\n ")]):t._e(),t._v(" "),"unlisted"!==t.status.visibility?e("el-dropdown-item",{nativeOn:{click:function(s){return t.changeStatus(t.status.id,t.status.sensitive,"unlisted")}}},[t._v("\n "+t._s(t.$t("reports.unlisted"))+"\n ")]):t._e(),t._v(" "),e("el-dropdown-item",{nativeOn:{click:function(s){return t.deleteStatus(t.status.id)}}},[t._v("\n "+t._s(t.$t("reports.deleteStatus"))+"\n ")])],1)],1)],1)])]),t._v(" "),e("div",{staticClass:"status-body"},[t.status.spoiler_text?e("div",[e("strong",[t._v(t._s(t.status.spoiler_text))]),t._v(" "),t.showHiddenStatus?t._e():e("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(s){t.showHiddenStatus=!0}}},[t._v("Show more")]),t._v(" "),t.showHiddenStatus?e("el-button",{staticClass:"show-more-button",attrs:{size:"mini"},on:{click:function(s){t.showHiddenStatus=!1}}},[t._v("Show less")]):t._e(),t._v(" "),t.showHiddenStatus?e("div",[e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?e("div",{staticClass:"poll"},[e("ul",t._l(t.status.poll.options,function(s,a){return e("li",{key:a},[t._v("\n "+t._s(s.title)+"\n "),e("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,s)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,s){return e("div",{key:s,staticClass:"image"},[e("img",{attrs:{src:t.preview_url}})])})],2):t._e()],1):t._e(),t._v(" "),t.status.spoiler_text?t._e():e("div",[e("span",{staticClass:"status-content",domProps:{innerHTML:t._s(t.status.content)}}),t._v(" "),t.status.poll?e("div",{staticClass:"poll"},[e("ul",t._l(t.status.poll.options,function(s,a){return e("li",{key:a},[t._v("\n "+t._s(s.title)+"\n "),e("el-progress",{attrs:{percentage:t.optionPercent(t.status.poll,s)}})],1)}),0)]):t._e(),t._v(" "),t._l(t.status.media_attachments,function(t,s){return e("div",{key:s,staticClass:"image"},[e("img",{attrs:{src:t.preview_url}})])})],2),t._v(" "),e("a",{staticClass:"account",attrs:{href:t.status.url,target:"_blank"}},[t._v("\n "+t._s(t.parseTimestamp(t.status.created_at))+"\n ")])])])],1)},[],!1,null,null,null);r.options.__file="index.vue";s.a=r.exports}}]); -//# sourceMappingURL=chunk-e458.4e5aad44.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-e458.4e5aad44.js.map b/priv/static/adminfe/static/js/chunk-e458.4e5aad44.js.map deleted file mode 100644 index e623af23d..000000000 --- a/priv/static/adminfe/static/js/chunk-e458.4e5aad44.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/statuses/index.vue?fe98","webpack:///./src/views/statuses/index.vue?1423","webpack:///src/views/statuses/index.vue","webpack:///./src/views/statuses/index.vue","webpack:///./src/components/Status/index.vue?aecc","webpack:///./src/views/statuses/index.vue?f25c","webpack:///./node_modules/moment/locale sync ^\\.\\/.*$","webpack:///./src/components/Status/index.vue?f9b2","webpack:///./src/components/Status/index.vue?6071","webpack:///src/components/Status/index.vue","webpack:///./src/components/Status/index.vue"],"names":["views_statusesvue_type_script_lang_js_","name","components","MultipleUsersMenu","RebootButton","Status","data","selectedUsers","computed","allLoaded","this","$store","state","status","statusesByInstance","buttonLoading","currentInstance","selectedInstance","user","authHost","instances","concat","toConsumableArray_default","peers","fetchedPeers","isDesktop","app","device","isMobile","isTablet","loadingPeers","loading","page","pageSize","get","set","instance","dispatch","showLocal","value","showPrivate","statuses","fetchedStatuses","statusVisibility","mounted","methods","handleFilterChange","handleLoadMore","clearSelection","handleStatusSelection","undefined","find","selectedUser","id","component","Object","componentNormalizer","_vm","_h","$createElement","_c","_self","_e","staticClass","_v","_s","$t","attrs","plain","direct","private","public","unlisted","placeholder","no-data-text","filterable","clearable","on","change","model","callback","$$v","expression","_l","index","key","label","selected-users","apply-action","length","account","show-checkbox","fetch-statuses-by-instance","status-selection","icon","circle","click","options","__file","__webpack_exports__","_node_modules_mini_css_extract_plugin_dist_loader_js_node_modules_css_loader_index_js_ref_11_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_lib_index_js_ref_11_2_node_modules_sass_loader_lib_loader_js_ref_11_3_node_modules_vue_loader_lib_index_js_vue_loader_options_index_vue_vue_type_style_index_0_rel_stylesheet_2Fscss_lang_scss___WEBPACK_IMPORTED_MODULE_0__","__webpack_require__","n","map","./af","./af.js","./ar","./ar-dz","./ar-dz.js","./ar-kw","./ar-kw.js","./ar-ly","./ar-ly.js","./ar-ma","./ar-ma.js","./ar-sa","./ar-sa.js","./ar-tn","./ar-tn.js","./ar.js","./az","./az.js","./be","./be.js","./bg","./bg.js","./bm","./bm.js","./bn","./bn.js","./bo","./bo.js","./br","./br.js","./bs","./bs.js","./ca","./ca.js","./cs","./cs.js","./cv","./cv.js","./cy","./cy.js","./da","./da.js","./de","./de-at","./de-at.js","./de-ch","./de-ch.js","./de.js","./dv","./dv.js","./el","./el.js","./en-SG","./en-SG.js","./en-au","./en-au.js","./en-ca","./en-ca.js","./en-gb","./en-gb.js","./en-ie","./en-ie.js","./en-il","./en-il.js","./en-nz","./en-nz.js","./eo","./eo.js","./es","./es-do","./es-do.js","./es-us","./es-us.js","./es.js","./et","./et.js","./eu","./eu.js","./fa","./fa.js","./fi","./fi.js","./fo","./fo.js","./fr","./fr-ca","./fr-ca.js","./fr-ch","./fr-ch.js","./fr.js","./fy","./fy.js","./ga","./ga.js","./gd","./gd.js","./gl","./gl.js","./gom-latn","./gom-latn.js","./gu","./gu.js","./he","./he.js","./hi","./hi.js","./hr","./hr.js","./hu","./hu.js","./hy-am","./hy-am.js","./id","./id.js","./is","./is.js","./it","./it-ch","./it-ch.js","./it.js","./ja","./ja.js","./jv","./jv.js","./ka","./ka.js","./kk","./kk.js","./km","./km.js","./kn","./kn.js","./ko","./ko.js","./ku","./ku.js","./ky","./ky.js","./lb","./lb.js","./lo","./lo.js","./lt","./lt.js","./lv","./lv.js","./me","./me.js","./mi","./mi.js","./mk","./mk.js","./ml","./ml.js","./mn","./mn.js","./mr","./mr.js","./ms","./ms-my","./ms-my.js","./ms.js","./mt","./mt.js","./my","./my.js","./nb","./nb.js","./ne","./ne.js","./nl","./nl-be","./nl-be.js","./nl.js","./nn","./nn.js","./pa-in","./pa-in.js","./pl","./pl.js","./pt","./pt-br","./pt-br.js","./pt.js","./ro","./ro.js","./ru","./ru.js","./sd","./sd.js","./se","./se.js","./si","./si.js","./sk","./sk.js","./sl","./sl.js","./sq","./sq.js","./sr","./sr-cyrl","./sr-cyrl.js","./sr.js","./ss","./ss.js","./sv","./sv.js","./sw","./sw.js","./ta","./ta.js","./te","./te.js","./tet","./tet.js","./tg","./tg.js","./th","./th.js","./tl-ph","./tl-ph.js","./tlh","./tlh.js","./tr","./tr.js","./tzl","./tzl.js","./tzm","./tzm-latn","./tzm-latn.js","./tzm.js","./ug-cn","./ug-cn.js","./uk","./uk.js","./ur","./ur.js","./uz","./uz-latn","./uz-latn.js","./uz.js","./vi","./vi.js","./x-pseudo","./x-pseudo.js","./yo","./yo.js","./zh-cn","./zh-cn.js","./zh-hk","./zh-hk.js","./zh-tw","./zh-tw.js","webpackContext","req","webpackContextResolve","o","e","Error","code","keys","resolve","module","exports","components_Statusvue_type_script_lang_js_","props","type","required","default","fetchStatusesByInstance","Boolean","showCheckbox","Number","userId","String","godmode","showHiddenStatus","capitalizeFirstLetter","str","charAt","toUpperCase","slice","changeStatus","statusId","isSensitive","visibility","reportCurrentPage","deleteStatus","_this","$confirm","confirmButtonText","cancelButtonText","then","$message","message","catch","optionPercent","poll","pollOption","allVotes","reduce","acc","option","votes_count","toFixed","parseTimestamp","timestamp","moment_default","format","$emit","deleted","slot","domProps","innerHTML","content","href","url","target","created_at","$event","src","avatar","deactivated","display_name","size","trigger","sensitive","nativeOn","spoiler_text","title","percentage","attachment","preview_url"],"mappings":"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AC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,gBAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,UAAA,OACAC,aAAA,OACAC,OAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OACAC,aAAA,OACAC,UAAA,OACAC,OAAA,OACAC,UAAA,OAC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","file":"static/js/chunk-e458.4e5aad44.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (!_vm.loadingPeers)?_c('div',{staticClass:\"statuses-container\"},[_c('div',{staticClass:\"statuses-header\"},[_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.statuses'))+\"\\n \")]),_vm._v(\" \"),_c('reboot-button')],1),_vm._v(\" \"),_c('div',{staticClass:\"statuses-header-container\"},[_c('el-button-group',[_c('el-button',{attrs:{\"plain\":\"\"}},[_vm._v(_vm._s(_vm.$t('statuses.direct'))+\": \"+_vm._s(_vm.statusVisibility.direct))]),_vm._v(\" \"),_c('el-button',{attrs:{\"plain\":\"\"}},[_vm._v(_vm._s(_vm.$t('statuses.private'))+\": \"+_vm._s(_vm.statusVisibility.private))]),_vm._v(\" \"),_c('el-button',{attrs:{\"plain\":\"\"}},[_vm._v(_vm._s(_vm.$t('statuses.public'))+\": \"+_vm._s(_vm.statusVisibility.public))]),_vm._v(\" \"),_c('el-button',{attrs:{\"plain\":\"\"}},[_vm._v(_vm._s(_vm.$t('statuses.unlisted'))+\": \"+_vm._s(_vm.statusVisibility.unlisted))])],1)],1),_vm._v(\" \"),_c('div',{staticClass:\"filter-container\"},[_c('el-select',{staticClass:\"select-instance\",attrs:{\"placeholder\":_vm.$t('statuses.instanceFilter'),\"no-data-text\":_vm.$t('statuses.noInstances'),\"filterable\":\"\",\"clearable\":\"\"},on:{\"change\":_vm.handleFilterChange},model:{value:(_vm.selectedInstance),callback:function ($$v) {_vm.selectedInstance=$$v},expression:\"selectedInstance\"}},_vm._l((_vm.instances),function(instance,index){return _c('el-option',{key:index,attrs:{\"label\":instance,\"value\":instance}})}),1),_vm._v(\" \"),_c('multiple-users-menu',{attrs:{\"selected-users\":_vm.selectedUsers},on:{\"apply-action\":_vm.clearSelection}})],1),_vm._v(\" \"),(_vm.currentInstance)?_c('div',{staticClass:\"checkbox-container\"},[_c('el-checkbox',{staticClass:\"show-private-statuses\",model:{value:(_vm.showLocal),callback:function ($$v) {_vm.showLocal=$$v},expression:\"showLocal\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.onlyLocalStatuses'))+\"\\n \")]),_vm._v(\" \"),_c('el-checkbox',{staticClass:\"show-private-statuses\",model:{value:(_vm.showPrivate),callback:function ($$v) {_vm.showPrivate=$$v},expression:\"showPrivate\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('statuses.showPrivateStatuses'))+\"\\n \")])],1):_vm._e(),_vm._v(\" \"),(_vm.statuses.length === 0)?_c('p',{staticClass:\"no-statuses\"},[_vm._v(_vm._s(_vm.$t('userProfile.noStatuses')))]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.statuses),function(status){return _c('div',{key:status.id,staticClass:\"status-container\"},[_c('status',{attrs:{\"status\":status,\"account\":status.account,\"show-checkbox\":_vm.isDesktop,\"fetch-statuses-by-instance\":true},on:{\"status-selection\":_vm.handleStatusSelection}})],1)}),_vm._v(\" \"),(_vm.statuses.length > 0)?_c('div',{staticClass:\"statuses-pagination\"},[(!_vm.allLoaded)?_c('el-button',{attrs:{\"loading\":_vm.buttonLoading},on:{\"click\":_vm.handleLoadMore}},[_vm._v(_vm._s(_vm.$t('statuses.loadMore')))]):_c('el-button',{attrs:{\"icon\":\"el-icon-check\",\"circle\":\"\"}})],1):_vm._e()],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=6c9be663&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js!../../../node_modules/css-loader/index.js??ref--11-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/lib/index.js??ref--11-2!../../../node_modules/sass-loader/lib/loader.js??ref--11-3!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"","var map = {\n\t\"./af\": \"K/tc\",\n\t\"./af.js\": \"K/tc\",\n\t\"./ar\": \"jnO4\",\n\t\"./ar-dz\": \"o1bE\",\n\t\"./ar-dz.js\": \"o1bE\",\n\t\"./ar-kw\": \"Qj4J\",\n\t\"./ar-kw.js\": \"Qj4J\",\n\t\"./ar-ly\": \"HP3h\",\n\t\"./ar-ly.js\": \"HP3h\",\n\t\"./ar-ma\": \"CoRJ\",\n\t\"./ar-ma.js\": \"CoRJ\",\n\t\"./ar-sa\": \"gjCT\",\n\t\"./ar-sa.js\": \"gjCT\",\n\t\"./ar-tn\": \"bYM6\",\n\t\"./ar-tn.js\": \"bYM6\",\n\t\"./ar.js\": \"jnO4\",\n\t\"./az\": \"SFxW\",\n\t\"./az.js\": \"SFxW\",\n\t\"./be\": \"H8ED\",\n\t\"./be.js\": \"H8ED\",\n\t\"./bg\": \"hKrs\",\n\t\"./bg.js\": \"hKrs\",\n\t\"./bm\": \"p/rL\",\n\t\"./bm.js\": \"p/rL\",\n\t\"./bn\": \"kEOa\",\n\t\"./bn.js\": \"kEOa\",\n\t\"./bo\": \"0mo+\",\n\t\"./bo.js\": \"0mo+\",\n\t\"./br\": \"aIdf\",\n\t\"./br.js\": \"aIdf\",\n\t\"./bs\": \"JVSJ\",\n\t\"./bs.js\": \"JVSJ\",\n\t\"./ca\": \"1xZ4\",\n\t\"./ca.js\": \"1xZ4\",\n\t\"./cs\": \"PA2r\",\n\t\"./cs.js\": \"PA2r\",\n\t\"./cv\": \"A+xa\",\n\t\"./cv.js\": \"A+xa\",\n\t\"./cy\": \"l5ep\",\n\t\"./cy.js\": \"l5ep\",\n\t\"./da\": \"DxQv\",\n\t\"./da.js\": \"DxQv\",\n\t\"./de\": \"tGlX\",\n\t\"./de-at\": \"s+uk\",\n\t\"./de-at.js\": \"s+uk\",\n\t\"./de-ch\": \"u3GI\",\n\t\"./de-ch.js\": \"u3GI\",\n\t\"./de.js\": \"tGlX\",\n\t\"./dv\": \"WYrj\",\n\t\"./dv.js\": \"WYrj\",\n\t\"./el\": \"jUeY\",\n\t\"./el.js\": \"jUeY\",\n\t\"./en-SG\": \"zavE\",\n\t\"./en-SG.js\": \"zavE\",\n\t\"./en-au\": \"Dmvi\",\n\t\"./en-au.js\": \"Dmvi\",\n\t\"./en-ca\": \"OIYi\",\n\t\"./en-ca.js\": \"OIYi\",\n\t\"./en-gb\": \"Oaa7\",\n\t\"./en-gb.js\": \"Oaa7\",\n\t\"./en-ie\": \"4dOw\",\n\t\"./en-ie.js\": \"4dOw\",\n\t\"./en-il\": \"czMo\",\n\t\"./en-il.js\": \"czMo\",\n\t\"./en-nz\": \"b1Dy\",\n\t\"./en-nz.js\": \"b1Dy\",\n\t\"./eo\": \"Zduo\",\n\t\"./eo.js\": \"Zduo\",\n\t\"./es\": \"iYuL\",\n\t\"./es-do\": \"CjzT\",\n\t\"./es-do.js\": \"CjzT\",\n\t\"./es-us\": \"Vclq\",\n\t\"./es-us.js\": \"Vclq\",\n\t\"./es.js\": \"iYuL\",\n\t\"./et\": \"7BjC\",\n\t\"./et.js\": \"7BjC\",\n\t\"./eu\": \"D/JM\",\n\t\"./eu.js\": \"D/JM\",\n\t\"./fa\": \"jfSC\",\n\t\"./fa.js\": \"jfSC\",\n\t\"./fi\": \"gekB\",\n\t\"./fi.js\": \"gekB\",\n\t\"./fo\": \"ByF4\",\n\t\"./fo.js\": \"ByF4\",\n\t\"./fr\": \"nyYc\",\n\t\"./fr-ca\": \"2fjn\",\n\t\"./fr-ca.js\": \"2fjn\",\n\t\"./fr-ch\": \"Dkky\",\n\t\"./fr-ch.js\": \"Dkky\",\n\t\"./fr.js\": \"nyYc\",\n\t\"./fy\": \"cRix\",\n\t\"./fy.js\": \"cRix\",\n\t\"./ga\": \"USCx\",\n\t\"./ga.js\": \"USCx\",\n\t\"./gd\": \"9rRi\",\n\t\"./gd.js\": \"9rRi\",\n\t\"./gl\": \"iEDd\",\n\t\"./gl.js\": \"iEDd\",\n\t\"./gom-latn\": \"DKr+\",\n\t\"./gom-latn.js\": \"DKr+\",\n\t\"./gu\": \"4MV3\",\n\t\"./gu.js\": \"4MV3\",\n\t\"./he\": \"x6pH\",\n\t\"./he.js\": \"x6pH\",\n\t\"./hi\": \"3E1r\",\n\t\"./hi.js\": \"3E1r\",\n\t\"./hr\": \"S6ln\",\n\t\"./hr.js\": \"S6ln\",\n\t\"./hu\": \"WxRl\",\n\t\"./hu.js\": \"WxRl\",\n\t\"./hy-am\": \"1rYy\",\n\t\"./hy-am.js\": \"1rYy\",\n\t\"./id\": \"UDhR\",\n\t\"./id.js\": \"UDhR\",\n\t\"./is\": \"BVg3\",\n\t\"./is.js\": \"BVg3\",\n\t\"./it\": \"bpih\",\n\t\"./it-ch\": \"bxKX\",\n\t\"./it-ch.js\": \"bxKX\",\n\t\"./it.js\": \"bpih\",\n\t\"./ja\": \"B55N\",\n\t\"./ja.js\": \"B55N\",\n\t\"./jv\": \"tUCv\",\n\t\"./jv.js\": \"tUCv\",\n\t\"./ka\": \"IBtZ\",\n\t\"./ka.js\": \"IBtZ\",\n\t\"./kk\": \"bXm7\",\n\t\"./kk.js\": \"bXm7\",\n\t\"./km\": \"6B0Y\",\n\t\"./km.js\": \"6B0Y\",\n\t\"./kn\": \"PpIw\",\n\t\"./kn.js\": \"PpIw\",\n\t\"./ko\": \"Ivi+\",\n\t\"./ko.js\": \"Ivi+\",\n\t\"./ku\": \"JCF/\",\n\t\"./ku.js\": \"JCF/\",\n\t\"./ky\": \"lgnt\",\n\t\"./ky.js\": \"lgnt\",\n\t\"./lb\": \"RAwQ\",\n\t\"./lb.js\": \"RAwQ\",\n\t\"./lo\": \"sp3z\",\n\t\"./lo.js\": \"sp3z\",\n\t\"./lt\": \"JvlW\",\n\t\"./lt.js\": \"JvlW\",\n\t\"./lv\": \"uXwI\",\n\t\"./lv.js\": \"uXwI\",\n\t\"./me\": \"KTz0\",\n\t\"./me.js\": \"KTz0\",\n\t\"./mi\": \"aIsn\",\n\t\"./mi.js\": \"aIsn\",\n\t\"./mk\": \"aQkU\",\n\t\"./mk.js\": \"aQkU\",\n\t\"./ml\": \"AvvY\",\n\t\"./ml.js\": \"AvvY\",\n\t\"./mn\": \"lYtQ\",\n\t\"./mn.js\": \"lYtQ\",\n\t\"./mr\": \"Ob0Z\",\n\t\"./mr.js\": \"Ob0Z\",\n\t\"./ms\": \"6+QB\",\n\t\"./ms-my\": \"ZAMP\",\n\t\"./ms-my.js\": \"ZAMP\",\n\t\"./ms.js\": \"6+QB\",\n\t\"./mt\": \"G0Uy\",\n\t\"./mt.js\": \"G0Uy\",\n\t\"./my\": \"honF\",\n\t\"./my.js\": \"honF\",\n\t\"./nb\": \"bOMt\",\n\t\"./nb.js\": \"bOMt\",\n\t\"./ne\": \"OjkT\",\n\t\"./ne.js\": \"OjkT\",\n\t\"./nl\": \"+s0g\",\n\t\"./nl-be\": \"2ykv\",\n\t\"./nl-be.js\": \"2ykv\",\n\t\"./nl.js\": \"+s0g\",\n\t\"./nn\": \"uEye\",\n\t\"./nn.js\": \"uEye\",\n\t\"./pa-in\": \"8/+R\",\n\t\"./pa-in.js\": \"8/+R\",\n\t\"./pl\": \"jVdC\",\n\t\"./pl.js\": \"jVdC\",\n\t\"./pt\": \"8mBD\",\n\t\"./pt-br\": \"0tRk\",\n\t\"./pt-br.js\": \"0tRk\",\n\t\"./pt.js\": \"8mBD\",\n\t\"./ro\": \"lyxo\",\n\t\"./ro.js\": \"lyxo\",\n\t\"./ru\": \"lXzo\",\n\t\"./ru.js\": \"lXzo\",\n\t\"./sd\": \"Z4QM\",\n\t\"./sd.js\": \"Z4QM\",\n\t\"./se\": \"//9w\",\n\t\"./se.js\": \"//9w\",\n\t\"./si\": \"7aV9\",\n\t\"./si.js\": \"7aV9\",\n\t\"./sk\": \"e+ae\",\n\t\"./sk.js\": \"e+ae\",\n\t\"./sl\": \"gVVK\",\n\t\"./sl.js\": \"gVVK\",\n\t\"./sq\": \"yPMs\",\n\t\"./sq.js\": \"yPMs\",\n\t\"./sr\": \"zx6S\",\n\t\"./sr-cyrl\": \"E+lV\",\n\t\"./sr-cyrl.js\": \"E+lV\",\n\t\"./sr.js\": \"zx6S\",\n\t\"./ss\": \"Ur1D\",\n\t\"./ss.js\": \"Ur1D\",\n\t\"./sv\": \"X709\",\n\t\"./sv.js\": \"X709\",\n\t\"./sw\": \"dNwA\",\n\t\"./sw.js\": \"dNwA\",\n\t\"./ta\": \"PeUW\",\n\t\"./ta.js\": \"PeUW\",\n\t\"./te\": \"XLvN\",\n\t\"./te.js\": \"XLvN\",\n\t\"./tet\": \"V2x9\",\n\t\"./tet.js\": \"V2x9\",\n\t\"./tg\": \"Oxv6\",\n\t\"./tg.js\": \"Oxv6\",\n\t\"./th\": \"EOgW\",\n\t\"./th.js\": \"EOgW\",\n\t\"./tl-ph\": \"Dzi0\",\n\t\"./tl-ph.js\": \"Dzi0\",\n\t\"./tlh\": \"z3Vd\",\n\t\"./tlh.js\": \"z3Vd\",\n\t\"./tr\": \"DoHr\",\n\t\"./tr.js\": \"DoHr\",\n\t\"./tzl\": \"z1FC\",\n\t\"./tzl.js\": \"z1FC\",\n\t\"./tzm\": \"wQk9\",\n\t\"./tzm-latn\": \"tT3J\",\n\t\"./tzm-latn.js\": \"tT3J\",\n\t\"./tzm.js\": \"wQk9\",\n\t\"./ug-cn\": \"YRex\",\n\t\"./ug-cn.js\": \"YRex\",\n\t\"./uk\": \"raLr\",\n\t\"./uk.js\": \"raLr\",\n\t\"./ur\": \"UpQW\",\n\t\"./ur.js\": \"UpQW\",\n\t\"./uz\": \"Loxo\",\n\t\"./uz-latn\": \"AQ68\",\n\t\"./uz-latn.js\": \"AQ68\",\n\t\"./uz.js\": \"Loxo\",\n\t\"./vi\": \"KSF8\",\n\t\"./vi.js\": \"KSF8\",\n\t\"./x-pseudo\": \"/X5v\",\n\t\"./x-pseudo.js\": \"/X5v\",\n\t\"./yo\": \"fzPg\",\n\t\"./yo.js\": \"fzPg\",\n\t\"./zh-cn\": \"XDpg\",\n\t\"./zh-cn.js\": \"XDpg\",\n\t\"./zh-hk\": \"SatO\",\n\t\"./zh-hk.js\": \"SatO\",\n\t\"./zh-tw\": \"kOpN\",\n\t\"./zh-tw.js\": \"kOpN\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"RnhZ\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(!_vm.status.deleted)?_c('el-card',{staticClass:\"status-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[(_vm.showCheckbox)?_c('el-checkbox',{staticClass:\"status-checkbox\",on:{\"change\":function($event){return _vm.handleStatusSelection(_vm.account)}}}):_vm._e(),_vm._v(\" \"),_c('img',{staticClass:\"status-avatar-img\",attrs:{\"src\":_vm.account.avatar}}),_vm._v(\" \"),(!_vm.account.deactivated)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.account.url,\"target\":\"_blank\"}},[_c('h3',{staticClass:\"status-account-name\"},[_vm._v(_vm._s(_vm.account.display_name))])]):_c('span',[_c('h3',{staticClass:\"status-account-name\"},[_vm._v(_vm._s(_vm.account.display_name))]),_vm._v(\" \"),_c('h3',{staticClass:\"status-account-name deactivated\"},[_vm._v(\" (deactivated)\")])])],1)]),_vm._v(\" \"),_c('div',{staticClass:\"status-actions\"},[(_vm.status.sensitive)?_c('el-tag',{attrs:{\"type\":\"warning\",\"size\":\"large\"}},[_vm._v(_vm._s(_vm.$t('reports.sensitive')))]):_vm._e(),_vm._v(\" \"),_c('el-tag',{attrs:{\"size\":\"large\"}},[_vm._v(_vm._s(_vm.capitalizeFirstLetter(_vm.status.visibility)))]),_vm._v(\" \"),_c('el-dropdown',{attrs:{\"trigger\":\"click\"}},[_c('el-button',{staticClass:\"status-actions-button\",attrs:{\"plain\":\"\",\"size\":\"small\",\"icon\":\"el-icon-edit\"}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.changeScope'))),_c('i',{staticClass:\"el-icon-arrow-down el-icon--right\"})]),_vm._v(\" \"),_c('el-dropdown-menu',{attrs:{\"slot\":\"dropdown\"},slot:\"dropdown\"},[(!_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, true, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.addSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.sensitive)?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, false, _vm.status.visibility)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.removeSensitive'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'public')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'public')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.public'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'private')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'private')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.private'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),(_vm.status.visibility !== 'unlisted')?_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.changeStatus(_vm.status.id, _vm.status.sensitive, 'unlisted')}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.unlisted'))+\"\\n \")]):_vm._e(),_vm._v(\" \"),_c('el-dropdown-item',{nativeOn:{\"click\":function($event){return _vm.deleteStatus(_vm.status.id)}}},[_vm._v(\"\\n \"+_vm._s(_vm.$t('reports.deleteStatus'))+\"\\n \")])],1)],1)],1)])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.spoiler_text)?_c('div',[_c('strong',[_vm._v(_vm._s(_vm.status.spoiler_text))]),_vm._v(\" \"),(!_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = true}}},[_vm._v(\"Show more\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('el-button',{staticClass:\"show-more-button\",attrs:{\"size\":\"mini\"},on:{\"click\":function($event){_vm.showHiddenStatus = false}}},[_vm._v(\"Show less\")]):_vm._e(),_vm._v(\" \"),(_vm.showHiddenStatus)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e()],1):_vm._e(),_vm._v(\" \"),(!_vm.status.spoiler_text)?_c('div',[_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}),_vm._v(\" \"),(_vm.status.poll)?_c('div',{staticClass:\"poll\"},[_c('ul',_vm._l((_vm.status.poll.options),function(option,index){return _c('li',{key:index},[_vm._v(\"\\n \"+_vm._s(option.title)+\"\\n \"),_c('el-progress',{attrs:{\"percentage\":_vm.optionPercent(_vm.status.poll, option)}})],1)}),0)]):_vm._e(),_vm._v(\" \"),_vm._l((_vm.status.media_attachments),function(attachment,index){return _c('div',{key:index,staticClass:\"image\"},[_c('img',{attrs:{\"src\":attachment.preview_url}})])})],2):_vm._e(),_vm._v(\" \"),_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.status.created_at))+\"\\n \")])])]):_c('el-card',{staticClass:\"status-card\"},[_c('div',{attrs:{\"slot\":\"header\"},slot:\"header\"},[_c('div',{staticClass:\"status-header\"},[_c('div',{staticClass:\"status-account-container\"},[_c('div',{staticClass:\"status-account\"},[_c('h4',{staticClass:\"status-deleted\"},[_vm._v(_vm._s(_vm.$t('reports.statusDeleted')))])])])])]),_vm._v(\" \"),_c('div',{staticClass:\"status-body\"},[(_vm.status.content)?_c('span',{staticClass:\"status-content\",domProps:{\"innerHTML\":_vm._s(_vm.status.content)}}):_c('span',{staticClass:\"status-without-content\"},[_vm._v(\"no content\")])]),_vm._v(\" \"),(_vm.status.created_at)?_c('a',{staticClass:\"account\",attrs:{\"href\":_vm.status.url,\"target\":\"_blank\"}},[_vm._v(\"\\n \"+_vm._s(_vm.parseTimestamp(_vm.status.created_at))+\"\\n \")]):_vm._e()])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js?cacheDirectory!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","\n\n\n\n\n","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=0fdc1bba&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&rel=stylesheet%2Fscss&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\ncomponent.options.__file = \"index.vue\"\nexport default component.exports"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/adminfe/static/js/runtime.1b4f6ce0.js b/priv/static/adminfe/static/js/runtime.1b4f6ce0.js deleted file mode 100644 index 6558531ba..000000000 --- a/priv/static/adminfe/static/js/runtime.1b4f6ce0.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e){function n(n){for(var r,c,a=n[0],f=n[1],h=n[2],i=0,l=[];i +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.ApplicationRequirementsTest do + use Pleroma.DataCase + import ExUnit.CaptureLog + import Mock + + alias Pleroma.Repo + + describe "check_rum!" do + setup_with_mocks([ + {Pleroma.ApplicationRequirements, [:passthrough], + [check_migrations_applied!: fn _ -> :ok end]} + ]) do + :ok + end + + setup do: clear_config([:database, :rum_enabled]) + + test "raises if rum is enabled and detects unapplied rum migrations" do + Pleroma.Config.put([:database, :rum_enabled], true) + + with_mocks([{Repo, [:passthrough], [exists?: fn _, _ -> false end]}]) do + assert_raise Pleroma.ApplicationRequirements.VerifyError, + "Unapplied RUM Migrations detected", + fn -> + capture_log(&Pleroma.ApplicationRequirements.verify!/0) + end + end + end + + test "raises if rum is disabled and detects rum migrations" do + Pleroma.Config.put([:database, :rum_enabled], false) + + with_mocks([{Repo, [:passthrough], [exists?: fn _, _ -> true end]}]) do + assert_raise Pleroma.ApplicationRequirements.VerifyError, + "RUM Migrations detected", + fn -> + capture_log(&Pleroma.ApplicationRequirements.verify!/0) + end + end + end + + test "doesn't do anything if rum enabled and applied migrations" do + Pleroma.Config.put([:database, :rum_enabled], true) + + with_mocks([{Repo, [:passthrough], [exists?: fn _, _ -> true end]}]) do + assert Pleroma.ApplicationRequirements.verify!() == :ok + end + end + + test "doesn't do anything if rum disabled" do + Pleroma.Config.put([:database, :rum_enabled], false) + + with_mocks([{Repo, [:passthrough], [exists?: fn _, _ -> false end]}]) do + assert Pleroma.ApplicationRequirements.verify!() == :ok + end + end + end + + describe "check_migrations_applied!" do + setup_with_mocks([ + {Ecto.Migrator, [], + [ + with_repo: fn repo, fun -> passthrough([repo, fun]) end, + migrations: fn Repo -> + [ + {:up, 20_191_128_153_944, "fix_missing_following_count"}, + {:up, 20_191_203_043_610, "create_report_notes"}, + {:down, 20_191_220_174_645, "add_scopes_to_pleroma_feo_auth_records"} + ] + end + ]} + ]) do + :ok + end + + setup do: clear_config([:i_am_aware_this_may_cause_data_loss, :disable_migration_check]) + + test "raises if it detects unapplied migrations" do + assert_raise Pleroma.ApplicationRequirements.VerifyError, + "Unapplied Migrations detected", + fn -> + capture_log(&Pleroma.ApplicationRequirements.verify!/0) + end + end + + test "doesn't do anything if disabled" do + Pleroma.Config.put([:i_am_aware_this_may_cause_data_loss, :disable_migration_check], true) + + assert :ok == Pleroma.ApplicationRequirements.verify!() + end + end +end diff --git a/test/chat/message_reference_test.exs b/test/chat/message_reference_test.exs new file mode 100644 index 000000000..aaa7c1ad4 --- /dev/null +++ b/test/chat/message_reference_test.exs @@ -0,0 +1,29 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Chat.MessageReferenceTest do + use Pleroma.DataCase, async: true + + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + describe "messages" do + test "it returns the last message in a chat" do + user = insert(:user) + recipient = insert(:user) + + {:ok, _message_1} = CommonAPI.post_chat_message(user, recipient, "hey") + {:ok, _message_2} = CommonAPI.post_chat_message(recipient, user, "ho") + + {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id) + + message = MessageReference.last_message_for_chat(chat) + + assert message.object.data["content"] == "ho" + end + end +end diff --git a/test/chat_test.exs b/test/chat_test.exs new file mode 100644 index 000000000..332f2180a --- /dev/null +++ b/test/chat_test.exs @@ -0,0 +1,61 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.ChatTest do + use Pleroma.DataCase, async: true + + alias Pleroma.Chat + + import Pleroma.Factory + + describe "creation and getting" do + test "it only works if the recipient is a valid user (for now)" do + user = insert(:user) + + assert {:error, _chat} = Chat.bump_or_create(user.id, "http://some/nonexisting/account") + assert {:error, _chat} = Chat.get_or_create(user.id, "http://some/nonexisting/account") + end + + test "it creates a chat for a user and recipient" do + user = insert(:user) + other_user = insert(:user) + + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + + assert chat.id + end + + test "it returns and bumps a chat for a user and recipient if it already exists" do + user = insert(:user) + other_user = insert(:user) + + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + {:ok, chat_two} = Chat.bump_or_create(user.id, other_user.ap_id) + + assert chat.id == chat_two.id + end + + test "it returns a chat for a user and recipient if it already exists" do + user = insert(:user) + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + {:ok, chat_two} = Chat.get_or_create(user.id, other_user.ap_id) + + assert chat.id == chat_two.id + end + + test "a returning chat will have an updated `update_at` field" do + user = insert(:user) + other_user = insert(:user) + + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + :timer.sleep(1500) + {:ok, chat_two} = Chat.bump_or_create(user.id, other_user.ap_id) + + assert chat.id == chat_two.id + assert chat.updated_at != chat_two.updated_at + end + end +end diff --git a/test/config/config_db_test.exs b/test/config/config_db_test.exs index 336de7359..3895e2cda 100644 --- a/test/config/config_db_test.exs +++ b/test/config/config_db_test.exs @@ -7,40 +7,28 @@ defmodule Pleroma.ConfigDBTest do import Pleroma.Factory alias Pleroma.ConfigDB - test "get_by_key/1" do + test "get_by_params/1" do config = insert(:config) insert(:config) assert config == ConfigDB.get_by_params(%{group: config.group, key: config.key}) end - test "create/1" do - {:ok, config} = ConfigDB.create(%{group: ":pleroma", key: ":some_key", value: "some_value"}) - assert config == ConfigDB.get_by_params(%{group: ":pleroma", key: ":some_key"}) - end - - test "update/1" do - config = insert(:config) - {:ok, updated} = ConfigDB.update(config, %{value: "some_value"}) - loaded = ConfigDB.get_by_params(%{group: config.group, key: config.key}) - assert loaded == updated - end - test "get_all_as_keyword/0" do saved = insert(:config) - insert(:config, group: ":quack", key: ":level", value: ConfigDB.to_binary(:info)) - insert(:config, group: ":quack", key: ":meta", value: ConfigDB.to_binary([:none])) + insert(:config, group: ":quack", key: ":level", value: :info) + insert(:config, group: ":quack", key: ":meta", value: [:none]) insert(:config, group: ":quack", key: ":webhook_url", - value: ConfigDB.to_binary("https://hooks.slack.com/services/KEY/some_val") + value: "https://hooks.slack.com/services/KEY/some_val" ) config = ConfigDB.get_all_as_keyword() assert config[:pleroma] == [ - {ConfigDB.from_string(saved.key), ConfigDB.from_binary(saved.value)} + {saved.key, saved.value} ] assert config[:quack][:level] == :info @@ -51,11 +39,11 @@ defmodule Pleroma.ConfigDBTest do describe "update_or_create/1" do test "common" do config = insert(:config) - key2 = "another_key" + key2 = :another_key params = [ - %{group: "pleroma", key: key2, value: "another_value"}, - %{group: config.group, key: config.key, value: "new_value"} + %{group: :pleroma, key: key2, value: "another_value"}, + %{group: :pleroma, key: config.key, value: [a: 1, b: 2, c: "new_value"]} ] assert Repo.all(ConfigDB) |> length() == 1 @@ -65,16 +53,16 @@ defmodule Pleroma.ConfigDBTest do assert Repo.all(ConfigDB) |> length() == 2 config1 = ConfigDB.get_by_params(%{group: config.group, key: config.key}) - config2 = ConfigDB.get_by_params(%{group: "pleroma", key: key2}) + config2 = ConfigDB.get_by_params(%{group: :pleroma, key: key2}) - assert config1.value == ConfigDB.transform("new_value") - assert config2.value == ConfigDB.transform("another_value") + assert config1.value == [a: 1, b: 2, c: "new_value"] + assert config2.value == "another_value" end test "partial update" do - config = insert(:config, value: ConfigDB.to_binary(key1: "val1", key2: :val2)) + config = insert(:config, value: [key1: "val1", key2: :val2]) - {:ok, _config} = + {:ok, config} = ConfigDB.update_or_create(%{ group: config.group, key: config.key, @@ -83,15 +71,14 @@ defmodule Pleroma.ConfigDBTest do updated = ConfigDB.get_by_params(%{group: config.group, key: config.key}) - value = ConfigDB.from_binary(updated.value) - assert length(value) == 3 - assert value[:key1] == :val1 - assert value[:key2] == :val2 - assert value[:key3] == :val3 + assert config.value == updated.value + assert updated.value[:key1] == :val1 + assert updated.value[:key2] == :val2 + assert updated.value[:key3] == :val3 end test "deep merge" do - config = insert(:config, value: ConfigDB.to_binary(key1: "val1", key2: [k1: :v1, k2: "v2"])) + config = insert(:config, value: [key1: "val1", key2: [k1: :v1, k2: "v2"]]) {:ok, config} = ConfigDB.update_or_create(%{ @@ -103,18 +90,15 @@ defmodule Pleroma.ConfigDBTest do updated = ConfigDB.get_by_params(%{group: config.group, key: config.key}) assert config.value == updated.value - - value = ConfigDB.from_binary(updated.value) - assert value[:key1] == :val1 - assert value[:key2] == [k1: :v1, k2: :v2, k3: :v3] - assert value[:key3] == :val3 + assert updated.value[:key1] == :val1 + assert updated.value[:key2] == [k1: :v1, k2: :v2, k3: :v3] + assert updated.value[:key3] == :val3 end test "only full update for some keys" do - config1 = insert(:config, key: ":ecto_repos", value: ConfigDB.to_binary(repo: Pleroma.Repo)) + config1 = insert(:config, key: :ecto_repos, value: [repo: Pleroma.Repo]) - config2 = - insert(:config, group: ":cors_plug", key: ":max_age", value: ConfigDB.to_binary(18)) + config2 = insert(:config, group: :cors_plug, key: :max_age, value: 18) {:ok, _config} = ConfigDB.update_or_create(%{ @@ -133,8 +117,8 @@ defmodule Pleroma.ConfigDBTest do updated1 = ConfigDB.get_by_params(%{group: config1.group, key: config1.key}) updated2 = ConfigDB.get_by_params(%{group: config2.group, key: config2.key}) - assert ConfigDB.from_binary(updated1.value) == [another_repo: [Pleroma.Repo]] - assert ConfigDB.from_binary(updated2.value) == 777 + assert updated1.value == [another_repo: [Pleroma.Repo]] + assert updated2.value == 777 end test "full update if value is not keyword" do @@ -142,7 +126,7 @@ defmodule Pleroma.ConfigDBTest do insert(:config, group: ":tesla", key: ":adapter", - value: ConfigDB.to_binary(Tesla.Adapter.Hackney) + value: Tesla.Adapter.Hackney ) {:ok, _config} = @@ -154,20 +138,20 @@ defmodule Pleroma.ConfigDBTest do updated = ConfigDB.get_by_params(%{group: config.group, key: config.key}) - assert ConfigDB.from_binary(updated.value) == Tesla.Adapter.Httpc + assert updated.value == Tesla.Adapter.Httpc end test "only full update for some subkeys" do config1 = insert(:config, key: ":emoji", - value: ConfigDB.to_binary(groups: [a: 1, b: 2], key: [a: 1]) + value: [groups: [a: 1, b: 2], key: [a: 1]] ) config2 = insert(:config, key: ":assets", - value: ConfigDB.to_binary(mascots: [a: 1, b: 2], key: [a: 1]) + value: [mascots: [a: 1, b: 2], key: [a: 1]] ) {:ok, _config} = @@ -187,8 +171,8 @@ defmodule Pleroma.ConfigDBTest do updated1 = ConfigDB.get_by_params(%{group: config1.group, key: config1.key}) updated2 = ConfigDB.get_by_params(%{group: config2.group, key: config2.key}) - assert ConfigDB.from_binary(updated1.value) == [groups: [c: 3, d: 4], key: [a: 1, b: 2]] - assert ConfigDB.from_binary(updated2.value) == [mascots: [c: 3, d: 4], key: [a: 1, b: 2]] + assert updated1.value == [groups: [c: 3, d: 4], key: [a: 1, b: 2]] + assert updated2.value == [mascots: [c: 3, d: 4], key: [a: 1, b: 2]] end end @@ -206,14 +190,14 @@ defmodule Pleroma.ConfigDBTest do end test "partial subkeys delete" do - config = insert(:config, value: ConfigDB.to_binary(groups: [a: 1, b: 2], key: [a: 1])) + config = insert(:config, value: [groups: [a: 1, b: 2], key: [a: 1]]) {:ok, deleted} = ConfigDB.delete(%{group: config.group, key: config.key, subkeys: [":groups"]}) assert Ecto.get_meta(deleted, :state) == :loaded - assert deleted.value == ConfigDB.to_binary(key: [a: 1]) + assert deleted.value == [key: [a: 1]] updated = ConfigDB.get_by_params(%{group: config.group, key: config.key}) @@ -221,7 +205,7 @@ defmodule Pleroma.ConfigDBTest do end test "full delete if remaining value after subkeys deletion is empty list" do - config = insert(:config, value: ConfigDB.to_binary(groups: [a: 1, b: 2])) + config = insert(:config, value: [groups: [a: 1, b: 2]]) {:ok, deleted} = ConfigDB.delete(%{group: config.group, key: config.key, subkeys: [":groups"]}) @@ -232,234 +216,159 @@ defmodule Pleroma.ConfigDBTest do end end - describe "transform/1" do + describe "to_elixir_types/1" do test "string" do - binary = ConfigDB.transform("value as string") - assert binary == :erlang.term_to_binary("value as string") - assert ConfigDB.from_binary(binary) == "value as string" + assert ConfigDB.to_elixir_types("value as string") == "value as string" end test "boolean" do - binary = ConfigDB.transform(false) - assert binary == :erlang.term_to_binary(false) - assert ConfigDB.from_binary(binary) == false + assert ConfigDB.to_elixir_types(false) == false end test "nil" do - binary = ConfigDB.transform(nil) - assert binary == :erlang.term_to_binary(nil) - assert ConfigDB.from_binary(binary) == nil + assert ConfigDB.to_elixir_types(nil) == nil end test "integer" do - binary = ConfigDB.transform(150) - assert binary == :erlang.term_to_binary(150) - assert ConfigDB.from_binary(binary) == 150 + assert ConfigDB.to_elixir_types(150) == 150 end test "atom" do - binary = ConfigDB.transform(":atom") - assert binary == :erlang.term_to_binary(:atom) - assert ConfigDB.from_binary(binary) == :atom + assert ConfigDB.to_elixir_types(":atom") == :atom end test "ssl options" do - binary = ConfigDB.transform([":tlsv1", ":tlsv1.1", ":tlsv1.2"]) - assert binary == :erlang.term_to_binary([:tlsv1, :"tlsv1.1", :"tlsv1.2"]) - assert ConfigDB.from_binary(binary) == [:tlsv1, :"tlsv1.1", :"tlsv1.2"] + assert ConfigDB.to_elixir_types([":tlsv1", ":tlsv1.1", ":tlsv1.2"]) == [ + :tlsv1, + :"tlsv1.1", + :"tlsv1.2" + ] end test "pleroma module" do - binary = ConfigDB.transform("Pleroma.Bookmark") - assert binary == :erlang.term_to_binary(Pleroma.Bookmark) - assert ConfigDB.from_binary(binary) == Pleroma.Bookmark + assert ConfigDB.to_elixir_types("Pleroma.Bookmark") == Pleroma.Bookmark end test "pleroma string" do - binary = ConfigDB.transform("Pleroma") - assert binary == :erlang.term_to_binary("Pleroma") - assert ConfigDB.from_binary(binary) == "Pleroma" + assert ConfigDB.to_elixir_types("Pleroma") == "Pleroma" end test "phoenix module" do - binary = ConfigDB.transform("Phoenix.Socket.V1.JSONSerializer") - assert binary == :erlang.term_to_binary(Phoenix.Socket.V1.JSONSerializer) - assert ConfigDB.from_binary(binary) == Phoenix.Socket.V1.JSONSerializer + assert ConfigDB.to_elixir_types("Phoenix.Socket.V1.JSONSerializer") == + Phoenix.Socket.V1.JSONSerializer end test "tesla module" do - binary = ConfigDB.transform("Tesla.Adapter.Hackney") - assert binary == :erlang.term_to_binary(Tesla.Adapter.Hackney) - assert ConfigDB.from_binary(binary) == Tesla.Adapter.Hackney + assert ConfigDB.to_elixir_types("Tesla.Adapter.Hackney") == Tesla.Adapter.Hackney end test "ExSyslogger module" do - binary = ConfigDB.transform("ExSyslogger") - assert binary == :erlang.term_to_binary(ExSyslogger) - assert ConfigDB.from_binary(binary) == ExSyslogger + assert ConfigDB.to_elixir_types("ExSyslogger") == ExSyslogger end test "Quack.Logger module" do - binary = ConfigDB.transform("Quack.Logger") - assert binary == :erlang.term_to_binary(Quack.Logger) - assert ConfigDB.from_binary(binary) == Quack.Logger + assert ConfigDB.to_elixir_types("Quack.Logger") == Quack.Logger end test "Swoosh.Adapters modules" do - binary = ConfigDB.transform("Swoosh.Adapters.SMTP") - assert binary == :erlang.term_to_binary(Swoosh.Adapters.SMTP) - assert ConfigDB.from_binary(binary) == Swoosh.Adapters.SMTP - binary = ConfigDB.transform("Swoosh.Adapters.AmazonSES") - assert binary == :erlang.term_to_binary(Swoosh.Adapters.AmazonSES) - assert ConfigDB.from_binary(binary) == Swoosh.Adapters.AmazonSES + assert ConfigDB.to_elixir_types("Swoosh.Adapters.SMTP") == Swoosh.Adapters.SMTP + assert ConfigDB.to_elixir_types("Swoosh.Adapters.AmazonSES") == Swoosh.Adapters.AmazonSES end test "sigil" do - binary = ConfigDB.transform("~r[comp[lL][aA][iI][nN]er]") - assert binary == :erlang.term_to_binary(~r/comp[lL][aA][iI][nN]er/) - assert ConfigDB.from_binary(binary) == ~r/comp[lL][aA][iI][nN]er/ + assert ConfigDB.to_elixir_types("~r[comp[lL][aA][iI][nN]er]") == ~r/comp[lL][aA][iI][nN]er/ end test "link sigil" do - binary = ConfigDB.transform("~r/https:\/\/example.com/") - assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/) - assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/ + assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/") == ~r/https:\/\/example.com/ end test "link sigil with um modifiers" do - binary = ConfigDB.transform("~r/https:\/\/example.com/um") - assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/um) - assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/um + assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/um") == + ~r/https:\/\/example.com/um end test "link sigil with i modifier" do - binary = ConfigDB.transform("~r/https:\/\/example.com/i") - assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/i) - assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/i + assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/i") == ~r/https:\/\/example.com/i end test "link sigil with s modifier" do - binary = ConfigDB.transform("~r/https:\/\/example.com/s") - assert binary == :erlang.term_to_binary(~r/https:\/\/example.com/s) - assert ConfigDB.from_binary(binary) == ~r/https:\/\/example.com/s + assert ConfigDB.to_elixir_types("~r/https:\/\/example.com/s") == ~r/https:\/\/example.com/s end test "raise if valid delimiter not found" do assert_raise ArgumentError, "valid delimiter for Regex expression not found", fn -> - ConfigDB.transform("~r/https://[]{}<>\"'()|example.com/s") + ConfigDB.to_elixir_types("~r/https://[]{}<>\"'()|example.com/s") end end test "2 child tuple" do - binary = ConfigDB.transform(%{"tuple" => ["v1", ":v2"]}) - assert binary == :erlang.term_to_binary({"v1", :v2}) - assert ConfigDB.from_binary(binary) == {"v1", :v2} + assert ConfigDB.to_elixir_types(%{"tuple" => ["v1", ":v2"]}) == {"v1", :v2} end test "proxy tuple with localhost" do - binary = - ConfigDB.transform(%{ - "tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}] - }) - - assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, :localhost, 1234}}) - assert ConfigDB.from_binary(binary) == {:proxy_url, {:socks5, :localhost, 1234}} + assert ConfigDB.to_elixir_types(%{ + "tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}] + }) == {:proxy_url, {:socks5, :localhost, 1234}} end test "proxy tuple with domain" do - binary = - ConfigDB.transform(%{ - "tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}] - }) - - assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, 'domain.com', 1234}}) - assert ConfigDB.from_binary(binary) == {:proxy_url, {:socks5, 'domain.com', 1234}} + assert ConfigDB.to_elixir_types(%{ + "tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}] + }) == {:proxy_url, {:socks5, 'domain.com', 1234}} end test "proxy tuple with ip" do - binary = - ConfigDB.transform(%{ - "tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}] - }) - - assert binary == :erlang.term_to_binary({:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}}) - assert ConfigDB.from_binary(binary) == {:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}} + assert ConfigDB.to_elixir_types(%{ + "tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}] + }) == {:proxy_url, {:socks5, {127, 0, 0, 1}, 1234}} end test "tuple with n childs" do - binary = - ConfigDB.transform(%{ - "tuple" => [ - "v1", - ":v2", - "Pleroma.Bookmark", - 150, - false, - "Phoenix.Socket.V1.JSONSerializer" - ] - }) - - assert binary == - :erlang.term_to_binary( - {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer} - ) - - assert ConfigDB.from_binary(binary) == - {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer} + assert ConfigDB.to_elixir_types(%{ + "tuple" => [ + "v1", + ":v2", + "Pleroma.Bookmark", + 150, + false, + "Phoenix.Socket.V1.JSONSerializer" + ] + }) == {"v1", :v2, Pleroma.Bookmark, 150, false, Phoenix.Socket.V1.JSONSerializer} end test "map with string key" do - binary = ConfigDB.transform(%{"key" => "value"}) - assert binary == :erlang.term_to_binary(%{"key" => "value"}) - assert ConfigDB.from_binary(binary) == %{"key" => "value"} + assert ConfigDB.to_elixir_types(%{"key" => "value"}) == %{"key" => "value"} end test "map with atom key" do - binary = ConfigDB.transform(%{":key" => "value"}) - assert binary == :erlang.term_to_binary(%{key: "value"}) - assert ConfigDB.from_binary(binary) == %{key: "value"} + assert ConfigDB.to_elixir_types(%{":key" => "value"}) == %{key: "value"} end test "list of strings" do - binary = ConfigDB.transform(["v1", "v2", "v3"]) - assert binary == :erlang.term_to_binary(["v1", "v2", "v3"]) - assert ConfigDB.from_binary(binary) == ["v1", "v2", "v3"] + assert ConfigDB.to_elixir_types(["v1", "v2", "v3"]) == ["v1", "v2", "v3"] end test "list of modules" do - binary = ConfigDB.transform(["Pleroma.Repo", "Pleroma.Activity"]) - assert binary == :erlang.term_to_binary([Pleroma.Repo, Pleroma.Activity]) - assert ConfigDB.from_binary(binary) == [Pleroma.Repo, Pleroma.Activity] + assert ConfigDB.to_elixir_types(["Pleroma.Repo", "Pleroma.Activity"]) == [ + Pleroma.Repo, + Pleroma.Activity + ] end test "list of atoms" do - binary = ConfigDB.transform([":v1", ":v2", ":v3"]) - assert binary == :erlang.term_to_binary([:v1, :v2, :v3]) - assert ConfigDB.from_binary(binary) == [:v1, :v2, :v3] + assert ConfigDB.to_elixir_types([":v1", ":v2", ":v3"]) == [:v1, :v2, :v3] end test "list of mixed values" do - binary = - ConfigDB.transform([ - "v1", - ":v2", - "Pleroma.Repo", - "Phoenix.Socket.V1.JSONSerializer", - 15, - false - ]) - - assert binary == - :erlang.term_to_binary([ - "v1", - :v2, - Pleroma.Repo, - Phoenix.Socket.V1.JSONSerializer, - 15, - false - ]) - - assert ConfigDB.from_binary(binary) == [ + assert ConfigDB.to_elixir_types([ + "v1", + ":v2", + "Pleroma.Repo", + "Phoenix.Socket.V1.JSONSerializer", + 15, + false + ]) == [ "v1", :v2, Pleroma.Repo, @@ -470,40 +379,17 @@ defmodule Pleroma.ConfigDBTest do end test "simple keyword" do - binary = ConfigDB.transform([%{"tuple" => [":key", "value"]}]) - assert binary == :erlang.term_to_binary([{:key, "value"}]) - assert ConfigDB.from_binary(binary) == [{:key, "value"}] - assert ConfigDB.from_binary(binary) == [key: "value"] - end - - test "keyword with partial_chain key" do - binary = - ConfigDB.transform([%{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}]) - - assert binary == :erlang.term_to_binary(partial_chain: &:hackney_connect.partial_chain/1) - assert ConfigDB.from_binary(binary) == [partial_chain: &:hackney_connect.partial_chain/1] + assert ConfigDB.to_elixir_types([%{"tuple" => [":key", "value"]}]) == [key: "value"] end test "keyword" do - binary = - ConfigDB.transform([ - %{"tuple" => [":types", "Pleroma.PostgresTypes"]}, - %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]}, - %{"tuple" => [":migration_lock", nil]}, - %{"tuple" => [":key1", 150]}, - %{"tuple" => [":key2", "string"]} - ]) - - assert binary == - :erlang.term_to_binary( - types: Pleroma.PostgresTypes, - telemetry_event: [Pleroma.Repo.Instrumenter], - migration_lock: nil, - key1: 150, - key2: "string" - ) - - assert ConfigDB.from_binary(binary) == [ + assert ConfigDB.to_elixir_types([ + %{"tuple" => [":types", "Pleroma.PostgresTypes"]}, + %{"tuple" => [":telemetry_event", ["Pleroma.Repo.Instrumenter"]]}, + %{"tuple" => [":migration_lock", nil]}, + %{"tuple" => [":key1", 150]}, + %{"tuple" => [":key2", "string"]} + ]) == [ types: Pleroma.PostgresTypes, telemetry_event: [Pleroma.Repo.Instrumenter], migration_lock: nil, @@ -512,86 +398,60 @@ defmodule Pleroma.ConfigDBTest do ] end + test "trandformed keyword" do + assert ConfigDB.to_elixir_types(a: 1, b: 2, c: "string") == [a: 1, b: 2, c: "string"] + end + test "complex keyword with nested mixed childs" do - binary = - ConfigDB.transform([ - %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]}, - %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]}, - %{"tuple" => [":link_name", true]}, - %{"tuple" => [":proxy_remote", false]}, - %{"tuple" => [":common_map", %{":key" => "value"}]}, - %{ - "tuple" => [ - ":proxy_opts", - [ - %{"tuple" => [":redirect_on_failure", false]}, - %{"tuple" => [":max_body_length", 1_048_576]}, - %{ - "tuple" => [ - ":http", - [%{"tuple" => [":follow_redirect", true]}, %{"tuple" => [":pool", ":upload"]}] - ] - } - ] - ] - } - ]) - - assert binary == - :erlang.term_to_binary( - uploader: Pleroma.Uploaders.Local, - filters: [Pleroma.Upload.Filter.Dedupe], - link_name: true, - proxy_remote: false, - common_map: %{key: "value"}, - proxy_opts: [ - redirect_on_failure: false, - max_body_length: 1_048_576, - http: [ - follow_redirect: true, - pool: :upload + assert ConfigDB.to_elixir_types([ + %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]}, + %{"tuple" => [":filters", ["Pleroma.Upload.Filter.Dedupe"]]}, + %{"tuple" => [":link_name", true]}, + %{"tuple" => [":proxy_remote", false]}, + %{"tuple" => [":common_map", %{":key" => "value"}]}, + %{ + "tuple" => [ + ":proxy_opts", + [ + %{"tuple" => [":redirect_on_failure", false]}, + %{"tuple" => [":max_body_length", 1_048_576]}, + %{ + "tuple" => [ + ":http", + [ + %{"tuple" => [":follow_redirect", true]}, + %{"tuple" => [":pool", ":upload"]} + ] + ] + } ] ] - ) - - assert ConfigDB.from_binary(binary) == - [ - uploader: Pleroma.Uploaders.Local, - filters: [Pleroma.Upload.Filter.Dedupe], - link_name: true, - proxy_remote: false, - common_map: %{key: "value"}, - proxy_opts: [ - redirect_on_failure: false, - max_body_length: 1_048_576, - http: [ - follow_redirect: true, - pool: :upload - ] + } + ]) == [ + uploader: Pleroma.Uploaders.Local, + filters: [Pleroma.Upload.Filter.Dedupe], + link_name: true, + proxy_remote: false, + common_map: %{key: "value"}, + proxy_opts: [ + redirect_on_failure: false, + max_body_length: 1_048_576, + http: [ + follow_redirect: true, + pool: :upload ] ] + ] end test "common keyword" do - binary = - ConfigDB.transform([ - %{"tuple" => [":level", ":warn"]}, - %{"tuple" => [":meta", [":all"]]}, - %{"tuple" => [":path", ""]}, - %{"tuple" => [":val", nil]}, - %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]} - ]) - - assert binary == - :erlang.term_to_binary( - level: :warn, - meta: [:all], - path: "", - val: nil, - webhook_url: "https://hooks.slack.com/services/YOUR-KEY-HERE" - ) - - assert ConfigDB.from_binary(binary) == [ + assert ConfigDB.to_elixir_types([ + %{"tuple" => [":level", ":warn"]}, + %{"tuple" => [":meta", [":all"]]}, + %{"tuple" => [":path", ""]}, + %{"tuple" => [":val", nil]}, + %{"tuple" => [":webhook_url", "https://hooks.slack.com/services/YOUR-KEY-HERE"]} + ]) == [ level: :warn, meta: [:all], path: "", @@ -601,98 +461,73 @@ defmodule Pleroma.ConfigDBTest do end test "complex keyword with sigil" do - binary = - ConfigDB.transform([ - %{"tuple" => [":federated_timeline_removal", []]}, - %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]}, - %{"tuple" => [":replace", []]} - ]) - - assert binary == - :erlang.term_to_binary( - federated_timeline_removal: [], - reject: [~r/comp[lL][aA][iI][nN]er/], - replace: [] - ) - - assert ConfigDB.from_binary(binary) == - [federated_timeline_removal: [], reject: [~r/comp[lL][aA][iI][nN]er/], replace: []] + assert ConfigDB.to_elixir_types([ + %{"tuple" => [":federated_timeline_removal", []]}, + %{"tuple" => [":reject", ["~r/comp[lL][aA][iI][nN]er/"]]}, + %{"tuple" => [":replace", []]} + ]) == [ + federated_timeline_removal: [], + reject: [~r/comp[lL][aA][iI][nN]er/], + replace: [] + ] end test "complex keyword with tuples with more than 2 values" do - binary = - ConfigDB.transform([ - %{ - "tuple" => [ - ":http", - [ - %{ - "tuple" => [ - ":key1", - [ - %{ - "tuple" => [ - ":_", - [ - %{ - "tuple" => [ - "/api/v1/streaming", - "Pleroma.Web.MastodonAPI.WebsocketHandler", - [] - ] - }, - %{ - "tuple" => [ - "/websocket", - "Phoenix.Endpoint.CowboyWebSocket", - %{ - "tuple" => [ - "Phoenix.Transports.WebSocket", - %{ - "tuple" => [ - "Pleroma.Web.Endpoint", - "Pleroma.Web.UserSocket", - [] - ] - } - ] - } - ] - }, - %{ - "tuple" => [ - ":_", - "Phoenix.Endpoint.Cowboy2Handler", - %{"tuple" => ["Pleroma.Web.Endpoint", []]} - ] - } - ] - ] - } - ] - ] - } - ] - ] - } - ]) - - assert binary == - :erlang.term_to_binary( - http: [ - key1: [ - _: [ - {"/api/v1/streaming", Pleroma.Web.MastodonAPI.WebsocketHandler, []}, - {"/websocket", Phoenix.Endpoint.CowboyWebSocket, - {Phoenix.Transports.WebSocket, - {Pleroma.Web.Endpoint, Pleroma.Web.UserSocket, []}}}, - {:_, Phoenix.Endpoint.Cowboy2Handler, {Pleroma.Web.Endpoint, []}} - ] + assert ConfigDB.to_elixir_types([ + %{ + "tuple" => [ + ":http", + [ + %{ + "tuple" => [ + ":key1", + [ + %{ + "tuple" => [ + ":_", + [ + %{ + "tuple" => [ + "/api/v1/streaming", + "Pleroma.Web.MastodonAPI.WebsocketHandler", + [] + ] + }, + %{ + "tuple" => [ + "/websocket", + "Phoenix.Endpoint.CowboyWebSocket", + %{ + "tuple" => [ + "Phoenix.Transports.WebSocket", + %{ + "tuple" => [ + "Pleroma.Web.Endpoint", + "Pleroma.Web.UserSocket", + [] + ] + } + ] + } + ] + }, + %{ + "tuple" => [ + ":_", + "Phoenix.Endpoint.Cowboy2Handler", + %{"tuple" => ["Pleroma.Web.Endpoint", []]} + ] + } + ] + ] + } + ] + ] + } ] ] - ) - - assert ConfigDB.from_binary(binary) == [ + } + ]) == [ http: [ key1: [ {:_, diff --git a/test/config/deprecation_warnings_test.exs b/test/config/deprecation_warnings_test.exs new file mode 100644 index 000000000..548ee87b0 --- /dev/null +++ b/test/config/deprecation_warnings_test.exs @@ -0,0 +1,57 @@ +defmodule Pleroma.Config.DeprecationWarningsTest do + use ExUnit.Case, async: true + use Pleroma.Tests.Helpers + + import ExUnit.CaptureLog + + test "check_old_mrf_config/0" do + clear_config([:instance, :rewrite_policy], Pleroma.Web.ActivityPub.MRF.NoOpPolicy) + clear_config([:instance, :mrf_transparency], true) + clear_config([:instance, :mrf_transparency_exclusions], []) + + assert capture_log(fn -> Pleroma.Config.DeprecationWarnings.check_old_mrf_config() end) =~ + """ + !!!DEPRECATION WARNING!!! + Your config is using old namespaces for MRF configuration. They should work for now, but you are advised to change to new namespaces to prevent possible issues later: + + * `config :pleroma, :instance, rewrite_policy` is now `config :pleroma, :mrf, policies` + * `config :pleroma, :instance, mrf_transparency` is now `config :pleroma, :mrf, transparency` + * `config :pleroma, :instance, mrf_transparency_exclusions` is now `config :pleroma, :mrf, transparency_exclusions` + """ + end + + test "move_namespace_and_warn/2" do + old_group1 = [:group, :key] + old_group2 = [:group, :key2] + old_group3 = [:group, :key3] + + new_group1 = [:another_group, :key4] + new_group2 = [:another_group, :key5] + new_group3 = [:another_group, :key6] + + clear_config(old_group1, 1) + clear_config(old_group2, 2) + clear_config(old_group3, 3) + + clear_config(new_group1) + clear_config(new_group2) + clear_config(new_group3) + + config_map = [ + {old_group1, new_group1, "\n error :key"}, + {old_group2, new_group2, "\n error :key2"}, + {old_group3, new_group3, "\n error :key3"} + ] + + assert capture_log(fn -> + Pleroma.Config.DeprecationWarnings.move_namespace_and_warn( + config_map, + "Warning preface" + ) + end) =~ "Warning preface\n error :key\n error :key2\n error :key3" + + assert Pleroma.Config.get(new_group1) == 1 + assert Pleroma.Config.get(new_group2) == 2 + assert Pleroma.Config.get(new_group3) == 3 + end +end diff --git a/test/config/transfer_task_test.exs b/test/config/transfer_task_test.exs index 473899d1d..f53829e09 100644 --- a/test/config/transfer_task_test.exs +++ b/test/config/transfer_task_test.exs @@ -6,9 +6,9 @@ defmodule Pleroma.Config.TransferTaskTest do use Pleroma.DataCase import ExUnit.CaptureLog + import Pleroma.Factory alias Pleroma.Config.TransferTask - alias Pleroma.ConfigDB setup do: clear_config(:configurable_from_database, true) @@ -19,31 +19,11 @@ defmodule Pleroma.Config.TransferTaskTest do refute Application.get_env(:postgrex, :test_key) initial = Application.get_env(:logger, :level) - ConfigDB.create(%{ - group: ":pleroma", - key: ":test_key", - value: [live: 2, com: 3] - }) - - ConfigDB.create(%{ - group: ":idna", - key: ":test_key", - value: [live: 15, com: 35] - }) - - ConfigDB.create(%{ - group: ":quack", - key: ":test_key", - value: [:test_value1, :test_value2] - }) - - ConfigDB.create(%{ - group: ":postgrex", - key: ":test_key", - value: :value - }) - - ConfigDB.create(%{group: ":logger", key: ":level", value: :debug}) + insert(:config, key: :test_key, value: [live: 2, com: 3]) + insert(:config, group: :idna, key: :test_key, value: [live: 15, com: 35]) + insert(:config, group: :quack, key: :test_key, value: [:test_value1, :test_value2]) + insert(:config, group: :postgrex, key: :test_key, value: :value) + insert(:config, group: :logger, key: :level, value: :debug) TransferTask.start_link([]) @@ -66,17 +46,8 @@ defmodule Pleroma.Config.TransferTaskTest do level = Application.get_env(:quack, :level) meta = Application.get_env(:quack, :meta) - ConfigDB.create(%{ - group: ":quack", - key: ":level", - value: :info - }) - - ConfigDB.create(%{ - group: ":quack", - key: ":meta", - value: [:none] - }) + insert(:config, group: :quack, key: :level, value: :info) + insert(:config, group: :quack, key: :meta, value: [:none]) TransferTask.start_link([]) @@ -95,17 +66,8 @@ defmodule Pleroma.Config.TransferTaskTest do clear_config(:emoji) clear_config(:assets) - ConfigDB.create(%{ - group: ":pleroma", - key: ":emoji", - value: [groups: [a: 1, b: 2]] - }) - - ConfigDB.create(%{ - group: ":pleroma", - key: ":assets", - value: [mascots: [a: 1, b: 2]] - }) + insert(:config, key: :emoji, value: [groups: [a: 1, b: 2]]) + insert(:config, key: :assets, value: [mascots: [a: 1, b: 2]]) TransferTask.start_link([]) @@ -122,12 +84,7 @@ defmodule Pleroma.Config.TransferTaskTest do test "don't restart if no reboot time settings were changed" do clear_config(:emoji) - - ConfigDB.create(%{ - group: ":pleroma", - key: ":emoji", - value: [groups: [a: 1, b: 2]] - }) + insert(:config, key: :emoji, value: [groups: [a: 1, b: 2]]) refute String.contains?( capture_log(fn -> TransferTask.start_link([]) end), @@ -137,25 +94,13 @@ defmodule Pleroma.Config.TransferTaskTest do test "on reboot time key" do clear_config(:chat) - - ConfigDB.create(%{ - group: ":pleroma", - key: ":chat", - value: [enabled: false] - }) - + insert(:config, key: :chat, value: [enabled: false]) assert capture_log(fn -> TransferTask.start_link([]) end) =~ "pleroma restarted" end test "on reboot time subkey" do clear_config(Pleroma.Captcha) - - ConfigDB.create(%{ - group: ":pleroma", - key: "Pleroma.Captcha", - value: [seconds_valid: 60] - }) - + insert(:config, key: Pleroma.Captcha, value: [seconds_valid: 60]) assert capture_log(fn -> TransferTask.start_link([]) end) =~ "pleroma restarted" end @@ -163,17 +108,8 @@ defmodule Pleroma.Config.TransferTaskTest do clear_config(:chat) clear_config(Pleroma.Captcha) - ConfigDB.create(%{ - group: ":pleroma", - key: ":chat", - value: [enabled: false] - }) - - ConfigDB.create(%{ - group: ":pleroma", - key: "Pleroma.Captcha", - value: [seconds_valid: 60] - }) + insert(:config, key: :chat, value: [enabled: false]) + insert(:config, key: Pleroma.Captcha, value: [seconds_valid: 60]) refute String.contains?( capture_log(fn -> TransferTask.load_and_update_env([], false) end), diff --git a/test/fixtures/config/temp.secret.exs b/test/fixtures/config/temp.secret.exs index dc950ca30..fa8c7c7e8 100644 --- a/test/fixtures/config/temp.secret.exs +++ b/test/fixtures/config/temp.secret.exs @@ -9,3 +9,5 @@ config :quack, level: :info config :pleroma, Pleroma.Repo, pool: Ecto.Adapters.SQL.Sandbox config :postgrex, :json_library, Poison + +config :pleroma, :database, rum_enabled: true diff --git a/test/fixtures/create-chat-message.json b/test/fixtures/create-chat-message.json new file mode 100644 index 000000000..9c23a1c9b --- /dev/null +++ b/test/fixtures/create-chat-message.json @@ -0,0 +1,31 @@ +{ + "actor": "http://2hu.gensokyo/users/raymoo", + "id": "http://2hu.gensokyo/objects/1", + "object": { + "attributedTo": "http://2hu.gensokyo/users/raymoo", + "content": "You expected a cute girl? Too bad. ", + "id": "http://2hu.gensokyo/objects/2", + "published": "2020-02-12T14:08:20Z", + "to": [ + "http://2hu.gensokyo/users/marisa" + ], + "tag": [ + { + "icon": { + "type": "Image", + "url": "http://2hu.gensokyo/emoji/Firefox.gif" + }, + "id": "http://2hu.gensokyo/emoji/Firefox.gif", + "name": ":firefox:", + "type": "Emoji", + "updated": "1970-01-01T00:00:00Z" + } + ], + "type": "ChatMessage" + }, + "published": "2018-02-12T14:08:20Z", + "to": [ + "http://2hu.gensokyo/users/marisa" + ], + "type": "Create" +} diff --git a/test/fixtures/fetch_mocks/104410921027210069.json b/test/fixtures/fetch_mocks/104410921027210069.json new file mode 100644 index 000000000..583f7a4dc --- /dev/null +++ b/test/fixtures/fetch_mocks/104410921027210069.json @@ -0,0 +1,72 @@ +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + { + "atomUri" : "ostatus:atomUri", + "conversation" : "ostatus:conversation", + "inReplyToAtomUri" : "ostatus:inReplyToAtomUri", + "ostatus" : "http://ostatus.org#", + "sensitive" : "as:sensitive", + "toot" : "http://joinmastodon.org/ns#", + "votersCount" : "toot:votersCount" + } + ], + "atomUri" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069", + "attachment" : [], + "attributedTo" : "https://busshi.moe/users/tuxcrafting", + "cc" : [ + "https://busshi.moe/users/tuxcrafting/followers", + "https://stereophonic.space/users/fixpoint", + "https://blob.cat/users/blobyoumu", + "https://cawfee.club/users/grips", + "https://jaeger.website/users/igel" + ], + "content" : "

    @fixpoint @blobyoumu @grips @igel there's a difference between not liking nukes and not liking nuclear power
    nukes are pretty bad as are all WMDs in general but disliking nuclear power just indicates you are unable of thought

    ", + "contentMap" : { + "en" : "

    @fixpoint @blobyoumu @grips @igel there's a difference between not liking nukes and not liking nuclear power
    nukes are pretty bad as are all WMDs in general but disliking nuclear power just indicates you are unable of thought

    " + }, + "conversation" : "https://cawfee.club/contexts/ad6c73d8-efc2-4e74-84ea-2dacf1a27a5e", + "id" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069", + "inReplyTo" : "https://stereophonic.space/objects/02997b83-3ea7-4b63-94af-ef3aa2d4ed17", + "inReplyToAtomUri" : "https://stereophonic.space/objects/02997b83-3ea7-4b63-94af-ef3aa2d4ed17", + "published" : "2020-06-26T15:10:19Z", + "replies" : { + "first" : { + "items" : [], + "next" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069/replies?only_other_accounts=true&page=true", + "partOf" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069/replies", + "type" : "CollectionPage" + }, + "id" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069/replies", + "type" : "Collection" + }, + "sensitive" : false, + "summary" : null, + "tag" : [ + { + "href" : "https://stereophonic.space/users/fixpoint", + "name" : "@fixpoint@stereophonic.space", + "type" : "Mention" + }, + { + "href" : "https://blob.cat/users/blobyoumu", + "name" : "@blobyoumu@blob.cat", + "type" : "Mention" + }, + { + "href" : "https://cawfee.club/users/grips", + "name" : "@grips@cawfee.club", + "type" : "Mention" + }, + { + "href" : "https://jaeger.website/users/igel", + "name" : "@igel@jaeger.website", + "type" : "Mention" + } + ], + "to" : [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "type" : "Note", + "url" : "https://busshi.moe/@tuxcrafting/104410921027210069" +} diff --git a/test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json b/test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json new file mode 100644 index 000000000..0226b058a --- /dev/null +++ b/test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json @@ -0,0 +1,59 @@ +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://social.sakamoto.gq/schemas/litepub-0.1.jsonld", + { + "@language" : "und" + } + ], + "actor" : "https://social.sakamoto.gq/users/eal", + "attachment" : [], + "attributedTo" : "https://social.sakamoto.gq/users/eal", + "cc" : [ + "https://social.sakamoto.gq/users/eal/followers" + ], + "content" : "@tuxcrafting @fixpoint @blobyoumu @grips @igel What's bad about nukes?", + "context" : "https://cawfee.club/contexts/ad6c73d8-efc2-4e74-84ea-2dacf1a27a5e", + "conversation" : "https://cawfee.club/contexts/ad6c73d8-efc2-4e74-84ea-2dacf1a27a5e", + "id" : "https://social.sakamoto.gq/objects/f20f2497-66d9-4a52-a2e1-1be2a39c32c1", + "inReplyTo" : "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069", + "published" : "2020-06-26T15:20:15.975737Z", + "sensitive" : false, + "summary" : "", + "tag" : [ + { + "href" : "https://blob.cat/users/blobyoumu", + "name" : "@blobyoumu@blob.cat", + "type" : "Mention" + }, + { + "href" : "https://busshi.moe/users/tuxcrafting", + "name" : "@tuxcrafting@busshi.moe", + "type" : "Mention" + }, + { + "href" : "https://cawfee.club/users/grips", + "name" : "@grips@cawfee.club", + "type" : "Mention" + }, + { + "href" : "https://jaeger.website/users/igel", + "name" : "@igel@jaeger.website", + "type" : "Mention" + }, + { + "href" : "https://stereophonic.space/users/fixpoint", + "name" : "@fixpoint@stereophonic.space", + "type" : "Mention" + } + ], + "to" : [ + "https://busshi.moe/users/tuxcrafting", + "https://www.w3.org/ns/activitystreams#Public", + "https://blob.cat/users/blobyoumu", + "https://stereophonic.space/users/fixpoint", + "https://cawfee.club/users/grips", + "https://jaeger.website/users/igel" + ], + "type" : "Note" +} diff --git a/test/fixtures/fetch_mocks/eal.json b/test/fixtures/fetch_mocks/eal.json new file mode 100644 index 000000000..a605476e6 --- /dev/null +++ b/test/fixtures/fetch_mocks/eal.json @@ -0,0 +1,43 @@ +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://social.sakamoto.gq/schemas/litepub-0.1.jsonld", + { + "@language" : "und" + } + ], + "attachment" : [], + "discoverable" : true, + "endpoints" : { + "oauthAuthorizationEndpoint" : "https://social.sakamoto.gq/oauth/authorize", + "oauthRegistrationEndpoint" : "https://social.sakamoto.gq/api/v1/apps", + "oauthTokenEndpoint" : "https://social.sakamoto.gq/oauth/token", + "sharedInbox" : "https://social.sakamoto.gq/inbox", + "uploadMedia" : "https://social.sakamoto.gq/api/ap/upload_media" + }, + "followers" : "https://social.sakamoto.gq/users/eal/followers", + "following" : "https://social.sakamoto.gq/users/eal/following", + "icon" : { + "type" : "Image", + "url" : "https://social.sakamoto.gq/media/f1cb6f79bf6839f3223ca240441f766056b74ddd23c69bcaf8bb1ba1ecff6eec.jpg" + }, + "id" : "https://social.sakamoto.gq/users/eal", + "image" : { + "type" : "Image", + "url" : "https://social.sakamoto.gq/media/e5cccf26421e8366f4e34be3c9d5042b8bc8dcceccc7c8e89785fa312dd9632c.jpg" + }, + "inbox" : "https://social.sakamoto.gq/users/eal/inbox", + "manuallyApprovesFollowers" : false, + "name" : "에알", + "outbox" : "https://social.sakamoto.gq/users/eal/outbox", + "preferredUsername" : "eal", + "publicKey" : { + "id" : "https://social.sakamoto.gq/users/eal#main-key", + "owner" : "https://social.sakamoto.gq/users/eal", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz3pF85YOhhv2Zaxv9YQ7\nrCe1aEhetCMVHtrK63tUVGoGdsblyKnVeJNbFcr6k3y35OpHS3HXIi6GzgihYcTu\nONLP4eQMHTnLUNAQZi03mjJA4iIq8v/tm8ZkL2mXsQSAbWj6Iq518mHNN7OvCoNt\n3Xjepl/0kgkc2gsund7m8r+Wu0Fusx6UlUyyAk3PexdDRdSSlVLeskqtP8jtdQDo\nL70pMyL+VD+Qb9RKFdtgJ+M4OqYP+7FVzCqXN0QIPhFf/kvHSLr+c4Y3Wm0nAKHU\n9CwXWXz5Xqscpv41KlgnUCOkTXb5eBSt23lNulae5srVzWBiFb6guiCpNzBGa+Sq\nrwIDAQAB\n-----END PUBLIC KEY-----\n\n" + }, + "summary" : "Pizza napoletana supremacist.

    Any artworks posted here that are good are not mine.", + "tag" : [], + "type" : "Person", + "url" : "https://social.sakamoto.gq/users/eal" +} diff --git a/test/fixtures/fetch_mocks/tuxcrafting.json b/test/fixtures/fetch_mocks/tuxcrafting.json new file mode 100644 index 000000000..5dce2a16d --- /dev/null +++ b/test/fixtures/fetch_mocks/tuxcrafting.json @@ -0,0 +1,59 @@ +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "IdentityProof" : "toot:IdentityProof", + "PropertyValue" : "schema:PropertyValue", + "alsoKnownAs" : { + "@id" : "as:alsoKnownAs", + "@type" : "@id" + }, + "discoverable" : "toot:discoverable", + "featured" : { + "@id" : "toot:featured", + "@type" : "@id" + }, + "focalPoint" : { + "@container" : "@list", + "@id" : "toot:focalPoint" + }, + "manuallyApprovesFollowers" : "as:manuallyApprovesFollowers", + "movedTo" : { + "@id" : "as:movedTo", + "@type" : "@id" + }, + "schema" : "http://schema.org#", + "toot" : "http://joinmastodon.org/ns#", + "value" : "schema:value" + } + ], + "attachment" : [], + "discoverable" : true, + "endpoints" : { + "sharedInbox" : "https://busshi.moe/inbox" + }, + "featured" : "https://busshi.moe/users/tuxcrafting/collections/featured", + "followers" : "https://busshi.moe/users/tuxcrafting/followers", + "following" : "https://busshi.moe/users/tuxcrafting/following", + "icon" : { + "mediaType" : "image/jpeg", + "type" : "Image", + "url" : "https://blobcdn.busshi.moe/busshifiles/accounts/avatars/000/046/872/original/054f0806ccb303d0.jpg" + }, + "id" : "https://busshi.moe/users/tuxcrafting", + "inbox" : "https://busshi.moe/users/tuxcrafting/inbox", + "manuallyApprovesFollowers" : true, + "name" : "@tuxcrafting@localhost:8080", + "outbox" : "https://busshi.moe/users/tuxcrafting/outbox", + "preferredUsername" : "tuxcrafting", + "publicKey" : { + "id" : "https://busshi.moe/users/tuxcrafting#main-key", + "owner" : "https://busshi.moe/users/tuxcrafting", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwqWWTBf9OizsBiBhGS/M\nQTT6fB1VvQP6vvxouGZ5cGg1a97V67ouhjJ+nGMuWr++DNYjJYkk2TOynfykk0H/\n8rRSujSe3BNRKYGNzdnRJu/4XxgIE847Fqx5SijSP23JGYcn8TjeSUsN2u2YYVXK\n+Eb3Bu7DjGiqwNon6YB0h5qkGjkMSMVIFn0hZx6Z21bkfYWgra96Ok5OWf7Ck3je\nCuErlCMZcbQcHtFpBueJAxYchjNvm6fqwZxLX/NtaHdr7Fm2kin89mqzliapBlFH\nCXk7Jln6xV5I6ryggPAMzm3fuHzeo0RWlu8lrxLfARBVwaQQZS99bwqp6N9O2aUp\nYwIDAQAB\n-----END PUBLIC KEY-----\n" + }, + "summary" : "

    expert procrastinator

    trans(humanist|gender|istorized)

    web: https://tuxcrafting.port0.org
    pronouns: she/they
    languages: french (native)/english (fluent)/hebrew (ok-ish)/esperanto (barely)

    ", + "tag" : [], + "type" : "Person", + "url" : "https://busshi.moe/@tuxcrafting" +} diff --git a/test/fixtures/kroeg-announce-with-inline-actor.json b/test/fixtures/kroeg-announce-with-inline-actor.json index 7bd6e8199..f73f93410 100644 --- a/test/fixtures/kroeg-announce-with-inline-actor.json +++ b/test/fixtures/kroeg-announce-with-inline-actor.json @@ -1 +1,88 @@ -{"@context":["https://www.w3.org/ns/activitystreams","https://puckipedia.com/-/context"],"actor":{"endpoints":"https://puckipedia.com/#endpoints","followers":"https://puckipedia.com/followers","following":"https://puckipedia.com/following","icon":{"mediaType":"image/png","type":"Image","url":"https://puckipedia.com/images/avatar.png"},"id":"https://puckipedia.com/","inbox":"https://puckipedia.com/inbox","kroeg:blocks":{"id":"https://puckipedia.com/blocks"},"liked":"https://puckipedia.com/liked","manuallyApprovesFollowers":false,"name":"HACKER TEEN PUCKIPEDIA 👩‍💻","outbox":"https://puckipedia.com/outbox","preferredUsername":"puckipedia","publicKey":{"id":"https://puckipedia.com/#key","owner":"https://puckipedia.com/","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----","type":[]},"summary":"

    federated hacker teen
    \n[she/they]

    ","type":"Person","updated":"2017-12-19T16:56:29.7576707+00:00"},"cc":"http://mastodon.example.org/users/admin","id":"https://puckipedia.com/cc56a9658e","object":{"as:sensitive":false,"attributedTo":{"endpoints":{"sharedInbox":"https://mastodon.social/inbox","type":[]},"followers":"http://mastodon.example.org/users/admin/followers","following":"http://mastodon.example.org/users/admin/following","icon":{"mediaType":"image/png","type":"Image","url":"https://files.mastodon.social/accounts/avatars/000/015/163/original/70ca6c52b01ca913.png"},"id":"http://mastodon.example.org/users/admin","inbox":"http://mastodon.example.org/users/admin/inbox","manuallyApprovesFollowers":{"@value":"False","type":"xsd:boolean"},"name":"","outbox":"http://mastodon.example.org/users/admin/outbox","preferredUsername":"revenant","publicKey":{"id":"http://mastodon.example.org/users/admin#main-key","owner":"http://mastodon.example.org/users/admin","publicKeyPem":"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gEN3wPW7gkE2gQqnmfB\n1ychjmFIf2LIwY0oCJLiGE/xpZrUKoq+eWH30AP7mATw4LD0gOYABL/ijqPUrPqR\nDXLL+0CqMP8HsZKvRlj9KArMK3YtNiSGGj2U7iReiRrD7nJzjJlsjjJXflLZhZ7/\nenSv1CcaeK8tB0PoAgShy/MyfhPF7WI5/Zm9DmmDQFvUEnDYKXAf/vG/IWw1EyMC\nkbaEYJeIowQU3GsbPxzRGI22bQtfotm431Ch2MbNo+kyzmYVFLAVoSGNMzvJwOPg\nTxLIIBeQXG7MinRyK887yPKhxhcALea4yCcALaa+3jPE7yqwIKYwTHtSlblsHDAo\nmQIDAQAB\n-----END PUBLIC KEY-----\n","type":[]},"summary":"

    neatly partitioned meats and cheeses appeal to me on an aesthetic level | any pronouns | revenant1.net

    ","type":"Person","url":"https://mastodon.social/@revenant"},"cc":"http://mastodon.example.org/users/admin/followers","content":"

    the name's jond (jeans bond)

    ","contentMap":{"en":"

    the name's jond (jeans bond)

    "},"conversation":"tag:mastodon.social,2018-09-25:objectId=55659382:objectType=Conversation","id":"http://mastodon.example.org/users/admin/statuses/100787282858396771","ostatus:atomUri":"http://mastodon.example.org/users/admin/statuses/100787282858396771","published":"2018-09-25T16:11:29Z","to":"https://www.w3.org/ns/activitystreams#Public","type":"Note","url":"https://mastodon.social/@revenant/100787282858396771"},"to":["https://www.w3.org/ns/activitystreams#Public","https://puckipedia.com/followers"],"type":"Announce"} +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://puckipedia.com/-/context" + ], + "actor" : { + "endpoints" : "https://puckipedia.com/#endpoints", + "followers" : "https://puckipedia.com/followers", + "following" : "https://puckipedia.com/following", + "icon" : { + "mediaType" : "image/png", + "type" : "Image", + "url" : "https://puckipedia.com/images/avatar.png" + }, + "id" : "https://puckipedia.com/", + "inbox" : "https://puckipedia.com/inbox", + "kroeg:blocks" : { + "id" : "https://puckipedia.com/blocks" + }, + "liked" : "https://puckipedia.com/liked", + "manuallyApprovesFollowers" : false, + "name" : "HACKER TEEN PUCKIPEDIA 👩‍💻", + "outbox" : "https://puckipedia.com/outbox", + "preferredUsername" : "puckipedia", + "publicKey" : { + "id" : "https://puckipedia.com/#key", + "owner" : "https://puckipedia.com/", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvN05xIcFE0Qgany7Rht4\n0ZI5wu++IT7K5iSqRimBYkpoeHbVcT9RFlW+aWH/QJJW/YgZ7+LMr8AMCrKrwSpS\nCndyrpx4O4lZ3FNRLu7tbklh01rGZfE6R1SFfYBpvMvImc9nYT6iezYDbv6NkHku\no3aVhjql216XlA0OhIrqQme9sAdrLbjbMrTUS8douCTkDOX+JFj1ghHCqdYEMZJI\nOY9kovtgnqyxFLm0RsPGsO1+g/OVojqG+VqHz6O2lceaTVQLlnZ4gOhLVG1tVsA2\nRfXQK+R/VgXncYE+BlQVd/tcdGAz7CDL7PP3rP65gmARnafhGR96cCOi/KzlAXSO\nMwIDAQAB\n-----END PUBLIC KEY-----", + "type" : [] + }, + "summary" : "

    federated hacker teen
    \n[she/they]

    ", + "type" : "Person", + "updated" : "2017-12-19T16:56:29.7576707+00:00" + }, + "cc" : "http://mastodon.example.org/users/admin", + "id" : "https://puckipedia.com/cc56a9658e", + "object" : { + "as:sensitive" : false, + "attributedTo" : { + "endpoints" : { + "sharedInbox" : "https://mastodon.social/inbox", + "type" : [] + }, + "followers" : "http://mastodon.example.org/users/admin/followers", + "following" : "http://mastodon.example.org/users/admin/following", + "icon" : { + "mediaType" : "image/png", + "type" : "Image", + "url" : "https://files.mastodon.social/accounts/avatars/000/015/163/original/70ca6c52b01ca913.png" + }, + "id" : "http://mastodon.example.org/users/admin", + "inbox" : "http://mastodon.example.org/users/admin/inbox", + "manuallyApprovesFollowers" : { + "@value" : "False", + "type" : "xsd:boolean" + }, + "name" : "", + "outbox" : "http://mastodon.example.org/users/admin/outbox", + "preferredUsername" : "revenant", + "publicKey" : { + "id" : "http://mastodon.example.org/users/admin#main-key", + "owner" : "http://mastodon.example.org/users/admin", + "publicKeyPem" : "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0gEN3wPW7gkE2gQqnmfB\n1ychjmFIf2LIwY0oCJLiGE/xpZrUKoq+eWH30AP7mATw4LD0gOYABL/ijqPUrPqR\nDXLL+0CqMP8HsZKvRlj9KArMK3YtNiSGGj2U7iReiRrD7nJzjJlsjjJXflLZhZ7/\nenSv1CcaeK8tB0PoAgShy/MyfhPF7WI5/Zm9DmmDQFvUEnDYKXAf/vG/IWw1EyMC\nkbaEYJeIowQU3GsbPxzRGI22bQtfotm431Ch2MbNo+kyzmYVFLAVoSGNMzvJwOPg\nTxLIIBeQXG7MinRyK887yPKhxhcALea4yCcALaa+3jPE7yqwIKYwTHtSlblsHDAo\nmQIDAQAB\n-----END PUBLIC KEY-----\n", + "type" : [] + }, + "summary" : "

    neatly partitioned meats and cheeses appeal to me on an aesthetic level | any pronouns | revenant1.net

    ", + "type" : "Person", + "url" : "https://mastodon.social/@revenant" + }, + "cc" : "http://mastodon.example.org/users/admin/followers", + "content" : "

    the name's jond (jeans bond)

    ", + "contentMap" : { + "en" : "

    the name's jond (jeans bond)

    " + }, + "conversation" : "tag:mastodon.social,2018-09-25:objectId=55659382:objectType=Conversation", + "id" : "http://mastodon.example.org/users/admin/statuses/100787282858396771", + "ostatus:atomUri" : "http://mastodon.example.org/users/admin/statuses/100787282858396771", + "published" : "2018-09-25T16:11:29Z", + "to" : "https://www.w3.org/ns/activitystreams#Public", + "type" : "Note", + "url" : "https://mastodon.social/@revenant/100787282858396771" + }, + "to" : [ + "https://www.w3.org/ns/activitystreams#Public", + "https://puckipedia.com/followers" + ], + "type" : "Announce" +} diff --git a/test/fixtures/mastodon-note-object.json b/test/fixtures/mastodon-note-object.json index 75bed9625..d28c7fbe9 100644 --- a/test/fixtures/mastodon-note-object.json +++ b/test/fixtures/mastodon-note-object.json @@ -1,9 +1,45 @@ -{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"manuallyApprovesFollowers":"as:manuallyApprovesFollowers","sensitive":"as:sensitive","movedTo":"as:movedTo","Hashtag":"as:Hashtag","ostatus":"http://ostatus.org#","atomUri":"ostatus:atomUri","inReplyToAtomUri":"ostatus:inReplyToAtomUri","conversation":"ostatus:conversation","toot":"http://joinmastodon.org/ns#","Emoji":"toot:Emoji"}],"id":"http://mastodon.example.org/users/admin/statuses/99541947525187367","type":"Note","summary":null,"content":"\u003cp\u003eyeah.\u003c/p\u003e","inReplyTo":null,"published":"2018-02-17T17:46:20Z","url":"http://mastodon.example.org/@admin/99541947525187367","attributedTo":"http://mastodon.example.org/users/admin","to":["https://www.w3.org/ns/activitystreams#Public"],"cc":["http://mastodon.example.org/users/admin/followers"],"sensitive":false,"atomUri":"http://mastodon.example.org/users/admin/statuses/99541947525187367","inReplyToAtomUri":null,"conversation":"tag:mastodon.example.org,2018-02-17:objectId=59:objectType=Conversation","tag":[], - "attachment": [ +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", { - "url": "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg", - "type": "Document", - "name": null, - "mediaType": "image/jpeg" + "Emoji" : "toot:Emoji", + "Hashtag" : "as:Hashtag", + "atomUri" : "ostatus:atomUri", + "conversation" : "ostatus:conversation", + "inReplyToAtomUri" : "ostatus:inReplyToAtomUri", + "manuallyApprovesFollowers" : "as:manuallyApprovesFollowers", + "movedTo" : "as:movedTo", + "ostatus" : "http://ostatus.org#", + "sensitive" : "as:sensitive", + "toot" : "http://joinmastodon.org/ns#" } - ]} + ], + "atomUri" : "http://mastodon.example.org/users/admin/statuses/99541947525187367", + "attachment" : [ + { + "mediaType" : "image/jpeg", + "name" : null, + "type" : "Document", + "url" : "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg" + } + ], + "attributedTo" : "http://mastodon.example.org/users/admin", + "cc" : [ + "http://mastodon.example.org/users/admin/followers" + ], + "content" : "

    yeah.

    ", + "conversation" : "tag:mastodon.example.org,2018-02-17:objectId=59:objectType=Conversation", + "id" : "http://mastodon.example.org/users/admin/statuses/99541947525187367", + "inReplyTo" : null, + "inReplyToAtomUri" : null, + "published" : "2018-02-17T17:46:20Z", + "sensitive" : false, + "summary" : null, + "tag" : [], + "to" : [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "type" : "Note", + "url" : "http://mastodon.example.org/@admin/99541947525187367" +} diff --git a/test/fixtures/preload_static/instance/panel.html b/test/fixtures/preload_static/instance/panel.html new file mode 100644 index 000000000..fc58e4e93 --- /dev/null +++ b/test/fixtures/preload_static/instance/panel.html @@ -0,0 +1 @@ +HEY! diff --git a/test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json b/test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json index 3f3f0f4fb..b76ba96a5 100644 --- a/test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json +++ b/test/fixtures/tesla_mock/baptiste.gelex.xyz-article.json @@ -1 +1,227 @@ -{"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"Emoji":"toot:Emoji","Hashtag":"as:Hashtag","atomUri":"ostatus:atomUri","conversation":"ostatus:conversation","featured":"toot:featured","focalPoint":{"@container":"@list","@id":"toot:focalPoint"},"inReplyToAtomUri":"ostatus:inReplyToAtomUri","manuallyApprovesFollowers":"as:manuallyApprovesFollowers","movedTo":"as:movedTo","ostatus":"http://ostatus.org#","sensitive":"as:sensitive","toot":"http://joinmastodon.org/ns#"}],"attributedTo":["https://baptiste.gelez.xyz/@/BaptisteGelez"],"cc":[],"content":"

    It has been one month since the last \"This Month in Plume\" article, so it is time for another edition of our monthly changelog!

    \n

    Bug Fixes and Security

    \n

    Let's start with the hidden, but still (very) important changes: bug fixes and security patches.

    \n

    First of all, @Trinity protected us against two major security flaws, called XSS and CSRF. The first one allows the attacker to run malicious code if you visit a Plume page where some of their personal data is present. The second one lets them post data with your Plume account by visiting one of their own website. It is two very common attack, and it is great we are now protected against them!

    \n

    The other big change in this area, is that we are now validating the data you are sending before doing anything with it. It means that, for instance, you will no longer be able to register with an empty username and to break everything.

    \n

    On the federation side, many issues were reported by @kaniini and redmatrix (respectively contributing to Pleroma and Hubzilla). By fixing some of them, we made it possible to federate Plume articles to Pleroma!

    \n

    @Trinity hopefully noticed that there was a bug in our password check code: we were not checking that your password was correct, but only that the verification process went without errors. Concretely, it means that you could login to any account with any password. I wrote this part of the code when I was still the only contributor to the project, so nobody could review my work. We will now be trying to check every change, especially when it deals with critical parts of Plume, to avoid similar issues in the future, and we I'm really sorry this happened (even if I think nobody exploited it).

    \n

    Zanfib and stephenburgess8 also commited some small bugfixes, improving the general experience.

    \n

    New Features

    \n

    Let's now talk about the features that we introduced during this month.

    \n

    One of the most easy to spot is the redesign of Plume, made by @Madeorsk. I personaly love what he did, it really improved the readability and gave Plume a bit more of identity than the previous design. And he is still improving it.

    \n

    We also enabled Mardown in comment, to let you write more structured and nicely formatted responses.

    \n

    As you may have noticed, I have used mentions in this post. Indeed, it is now possible to mention someone in your articles or in comments. It works exactly the same way as in other apps, and you should receive a notification if someone mentionned you.

    \n

    A dashboard to manage your blogs has also been introduced. In the future it may be used to manage your drafts, and eventually to show some statistics. The goal is to have a more specific homepage for authors.

    \n

    The federation with other ActivityPub softwares, like Mastodon or Pleroma is starting to work quite well, but the federation between Plume instances is far from being complete. However, we started to work on it, and it is now possible to view a distant user profile or blog from your instance, even if only basic informations are fetched yet (the articles are not loaded for instance).

    \n

    Another new feature that may not be visible for everyone, is the new NodeInfo endpoint. NodeInfo is a protocol allowing to get informations about a specific federated instance (whatever software it runs). It means that Plume instances can now be listed on sites like fediverse.network.

    \n

    Maybe you wanted to host a Plume instance, but you don't like long install process during which you are just copy/pasting commands that you don't really understand from the documentation. That's why we introduced a setup script: the first you'll launch Plume, it will ask you a few questions and automatically setup your instance in a few minutes. We hope that this feature will help to host small instances, run by non-professional adminsys. You can see a demo of this tool on asciinema.

    \n

    Last but not least, Plume is now translatable! It is already available in English, French, Polish (thanks to @m4sk1n)) and German (thanks to bitkeks). If your browser is configured to display pages in these languages, you should normally see the interface in your language. And if your language is not present yet, feel free to add your translation.

    \n

    Other Changes

    \n

    We also improved the code a lot. We tried to separate each part as much as possible, making it easier to re-use for other projects. For instance, our database code is now isolated from the rest of the app, which means it will be easier to make import tools from other blogging engines. Some parts of the code are even shared with another project, Aardwolf a federated Facebook alternative. For instance, both of our projects use the same internationalization code, and once Aardwolf will implement federation, this part of the code will probably be shared too. Since the WebFinger module (used to find new users and blogs) and the CSRF protection code (see the \"Bug fixes and Security\" section) have been isolated in their own modules, they may be shared by both projects too.

    \n

    We also worked a lot on documentation. We now have articles explaining how to setup your Plume instance on various operating systems, but also documenting the translation process. I want to thank BanjoFox (who imported some documentation from their project, Aardwolf, as the setup is quite similar), Kushal and @gled@plume.mastodon.host for working on this.

    \n

    As you can see, there were many changes this month, but there still a lot to do. Your help will of course be welcome. If you want to contribute to the code, translate Plume in your language, write some documentation, or anything else (or even if you're just curious about the project), feel free to join our Matrix room: #plume:disroot.org. Otherwise, as BanjoFox said on the Aardwolf Team Mastodon account, talking about the project around you is one of the easiest way to help.

    \n","id":"https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/","likes":null,"name":"This Month in Plume: June 2018","published":"2018-07-10T20:16:24.087622Z","shares":null,"source":null,"tag":[{"href":"https://baptiste.gelez.xyz/@/Trinity","name":"@Trinity","type":"Mention"},{"href":"https://baptiste.gelez.xyz/@/kaniini/","name":"@kaniini","type":"Mention"},{"href":"https://baptiste.gelez.xyz/@/Trinity","name":"@Trinity","type":"Mention"}],"to":["https://unixcorn.xyz/users/Bat","https://mastodon.host/users/federationbot","https://social.tcit.fr/users/tcit","https://framapiaf.org/users/qwerty","https://mastodon.social/users/lthms","https://eldritch.cafe/users/Nausicaa","https://imaginair.es/users/Elanndelh","https://framapiaf.org/users/Drulac","https://mastodon.partipirate.org/users/NicolasConstant","https://aleph.land/users/Madeorsk","https://maly.io/users/Troll","https://hostux.social/users/superjey","https://mamot.fr/users/Phigger","https://mastodon.social/users/wakest","https://social.coop/users/wakest","https://unixcorn.xyz/users/Ce_lo","https://social.art-software.fr/users/Electron","https://framapiaf.org/users/Quenti","https://toot.plus.yt/users/Djyp","https://mastodon.social/users/brainblasted","https://social.mochi.academy/users/Ambraven","https://social.hacktivis.me/users/lanodan","https://mastodon.eliotberriot.com/users/eliotberriot","https://edolas.world/users/0x1C3B00DA","https://toot.cafe/users/zack","https://manowar.social/users/zatnosk","https://eldritch.cafe/users/fluffy","https://mastodon.social/users/david_ross","https://kosmos.social/users/xiroux","https://mastodon.art/users/EmergencyBattle","https://mastodon.social/users/trwnh","https://octodon.social/users/pybyte","https://anticapitalist.party/users/Trinity","https://mstdn.mx/users/xavavu","https://baptiste.gelez.xyz/@/m4sk1n","https://eldritch.cafe/users/milia","https://mastodon.zaclys.com/users/arx","https://toot.cafe/users/sivy","https://mastodon.social/users/ortegacmanuel","https://mastodon.observer/users/stephen","https://octodon.social/users/chloe","https://unixcorn.xyz/users/AmauryPi","https://cybre.space/users/rick_777","https://mastodon.social/users/wezm","https://baptiste.gelez.xyz/@/idlesong","https://mamot.fr/users/dr4Ke","https://imaginair.es/users/Phigger","https://mamot.fr/users/dlink","https://anticapitalist.party/users/a000d4f7a91939d0e71df1646d7a48","https://framapiaf.org/users/PhieLaidMignon","https://mastodon.social/users/y6nH","https://crazynoisybizarre.town/users/FederationBot","https://social.weho.st/users/dvn","https://mastodon.art/users/Wolthera","https://diaspodon.fr/users/dada","https://pachyder.me/users/Lanza","https://mastodon.xyz/users/ag","https://aleph.land/users/yahananxie","https://mstdn.io/users/chablis_social","https://mastodon.gougere.fr/users/fabien","https://functional.cafe/users/otini","https://social.coop/users/bhaugen","https://octodon.social/users/donblanco","https://chaos.social/users/astro","https://pachyder.me/users/sibear","https://mamot.fr/users/yohann","https://social.wxcafe.net/users/Bat","https://mastodon.social/users/dansup","https://chaos.social/users/juh","https://scifi.fyi/users/paeneultima","https://hostux.social/users/Deuchnord","https://mstdn.fr/users/taziden","https://mamot.fr/users/PifyZ","https://mastodon.social/users/plantabaja","https://mastodon.social/users/gitzgrog","https://mastodon.social/users/Syluban","https://masto.pt/users/eloisa","https://pleroma.soykaf.com/users/notclacke","https://mastodon.social/users/SiegfriedEhret","https://writing.exchange/users/write_as","https://mstdn.io/users/shellkr","https://mastodon.uy/users/jorge","https://mastodon.technology/users/bobstechsite","https://mastodon.social/users/hinterwaeldler","https://mastodon.xyz/users/mgdelacroix","https://mastodon.cloud/users/jjatria","https://baptiste.gelez.xyz/@/Jade/","https://edolas.world/users/pfm","https://mstdn.io/users/jort","https://mastodon.social/users/andreipetcu","https://mastodon.technology/users/0xf00fc7c8","https://mastodon.social/users/khanate","https://mastodon.technology/users/francois","https://mastodon.social/users/glherrmann","https://mastodon.host/users/gled","https://social.holdmybeer.solutions/users/kemonine","https://scholar.social/users/bgcarlisle","https://mastodon.social/users/oldgun","https://baptiste.gelez.xyz/@/snoe/","https://mastodon.at/users/switchingsocial","https://scifi.fyi/users/BrokenBiscuit","https://dev.glitch.social/users/hoodie","https://todon.nl/users/paulfree14","https://mastodon.social/users/aadilayub","https://social.fsck.club/users/anarchosaurus","https://mastodonten.de/users/GiantG","https://mastodon.technology/users/cj","https://cybre.space/users/sam","https://layer8.space/users/silkevicious","https://mastodon.xyz/users/Jimmyrwx","https://fosstodon.org/users/danyspin97","https://mstdn.io/users/cristhyano","https://mastodon.social/users/vanyok","https://hulvr.com/users/rook","https://niu.moe/users/Lucifer","https://mamot.fr/users/Thibaut","https://mastodont.cat/users/bgta","https://mstdn.io/users/hontoni","https://niu.moe/users/lionirdeadman","https://functional.cafe/users/phoe","https://mastodon.social/users/toontoet","https://mastodon.social/users/danipozo","https://scholar.social/users/robertson","https://mastodon.social/users/aldatsa","https://elekk.xyz/users/maloki","https://kitty.town/users/nursemchurt","https://neigh.horse/users/commagray","https://mastodon.social/users/hirojin","https://mastodon.xyz/users/mareklach","https://chaos.social/users/benthor","https://mastodon.social/users/djperreault","https://mastodon.art/users/eylul","https://mastodon.opportunis.me/users/bob","https://tootplanet.space/users/Shutsumon","https://toot.cat/users/woozle","https://mastodon.social/users/StephenLB","https://sleeping.town/users/oct2pus","https://mastodon.indie.host/users/stragu","https://social.coop/users/gilscottfitzgerald","https://icosahedron.website/users/joeld","https://mastodon.social/users/hellion","https://cybre.space/users/cooler_ranch","https://mastodon.social/users/kelsonv","https://mastodon.lat/users/scalpol","https://writing.exchange/users/hnb","https://hex.bz/users/Horst","https://mastodon.social/users/weddle","https://maly.io/users/sonya","https://social.coop/users/medusa","https://mastodon.social/users/DystopianK","https://mstdn.io/users/d_io","https://fosstodon.org/users/brandon","https://fosstodon.org/users/Cando","https://mastodon.host/users/panina","https://floss.social/users/tuxether","https://social.tchncs.de/users/suitbertmonz","https://mastodon.social/users/jrt","https://mastodon.social/users/sirikon","https://mstdn.io/users/yabirgb","https://mastodon.cloud/users/FerdiZ","https://mastodon.social/users/carlchenet","https://social.polonkai.eu/users/calendar_social","https://social.polonkai.eu/users/gergely","https://mastodon.social/users/Jelv","https://mastodon.social/users/srinicame","https://cybre.space/users/mastoabed","https://mastodon.social/users/tagomago","https://lgbt.io/users/bootblackCub","https://niu.moe/users/Nopplyy","https://mastodon.social/users/bpugh","https://www.w3.org/ns/activitystreams#Public"],"type":"Article","uploadMedia":null,"url":"https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/"} \ No newline at end of file +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "Emoji" : "toot:Emoji", + "Hashtag" : "as:Hashtag", + "atomUri" : "ostatus:atomUri", + "conversation" : "ostatus:conversation", + "featured" : "toot:featured", + "focalPoint" : { + "@container" : "@list", + "@id" : "toot:focalPoint" + }, + "inReplyToAtomUri" : "ostatus:inReplyToAtomUri", + "manuallyApprovesFollowers" : "as:manuallyApprovesFollowers", + "movedTo" : "as:movedTo", + "ostatus" : "http://ostatus.org#", + "sensitive" : "as:sensitive", + "toot" : "http://joinmastodon.org/ns#" + } + ], + "attributedTo" : [ + "https://baptiste.gelez.xyz/@/BaptisteGelez" + ], + "cc" : [], + "content" : "

    It has been one month since the last \"This Month in Plume\" article, so it is time for another edition of our monthly changelog!

    \n

    Bug Fixes and Security

    \n

    Let's start with the hidden, but still (very) important changes: bug fixes and security patches.

    \n

    First of all, @Trinity protected us against two major security flaws, called XSS and CSRF. The first one allows the attacker to run malicious code if you visit a Plume page where some of their personal data is present. The second one lets them post data with your Plume account by visiting one of their own website. It is two very common attack, and it is great we are now protected against them!

    \n

    The other big change in this area, is that we are now validating the data you are sending before doing anything with it. It means that, for instance, you will no longer be able to register with an empty username and to break everything.

    \n

    On the federation side, many issues were reported by @kaniini and redmatrix (respectively contributing to Pleroma and Hubzilla). By fixing some of them, we made it possible to federate Plume articles to Pleroma!

    \n

    @Trinity hopefully noticed that there was a bug in our password check code: we were not checking that your password was correct, but only that the verification process went without errors. Concretely, it means that you could login to any account with any password. I wrote this part of the code when I was still the only contributor to the project, so nobody could review my work. We will now be trying to check every change, especially when it deals with critical parts of Plume, to avoid similar issues in the future, and we I'm really sorry this happened (even if I think nobody exploited it).

    \n

    Zanfib and stephenburgess8 also commited some small bugfixes, improving the general experience.

    \n

    New Features

    \n

    Let's now talk about the features that we introduced during this month.

    \n

    One of the most easy to spot is the redesign of Plume, made by @Madeorsk. I personaly love what he did, it really improved the readability and gave Plume a bit more of identity than the previous design. And he is still improving it.

    \n

    We also enabled Mardown in comment, to let you write more structured and nicely formatted responses.

    \n

    As you may have noticed, I have used mentions in this post. Indeed, it is now possible to mention someone in your articles or in comments. It works exactly the same way as in other apps, and you should receive a notification if someone mentionned you.

    \n

    A dashboard to manage your blogs has also been introduced. In the future it may be used to manage your drafts, and eventually to show some statistics. The goal is to have a more specific homepage for authors.

    \n

    The federation with other ActivityPub softwares, like Mastodon or Pleroma is starting to work quite well, but the federation between Plume instances is far from being complete. However, we started to work on it, and it is now possible to view a distant user profile or blog from your instance, even if only basic informations are fetched yet (the articles are not loaded for instance).

    \n

    Another new feature that may not be visible for everyone, is the new NodeInfo endpoint. NodeInfo is a protocol allowing to get informations about a specific federated instance (whatever software it runs). It means that Plume instances can now be listed on sites like fediverse.network.

    \n

    Maybe you wanted to host a Plume instance, but you don't like long install process during which you are just copy/pasting commands that you don't really understand from the documentation. That's why we introduced a setup script: the first you'll launch Plume, it will ask you a few questions and automatically setup your instance in a few minutes. We hope that this feature will help to host small instances, run by non-professional adminsys. You can see a demo of this tool on asciinema.

    \n

    Last but not least, Plume is now translatable! It is already available in English, French, Polish (thanks to @m4sk1n)) and German (thanks to bitkeks). If your browser is configured to display pages in these languages, you should normally see the interface in your language. And if your language is not present yet, feel free to add your translation.

    \n

    Other Changes

    \n

    We also improved the code a lot. We tried to separate each part as much as possible, making it easier to re-use for other projects. For instance, our database code is now isolated from the rest of the app, which means it will be easier to make import tools from other blogging engines. Some parts of the code are even shared with another project, Aardwolf a federated Facebook alternative. For instance, both of our projects use the same internationalization code, and once Aardwolf will implement federation, this part of the code will probably be shared too. Since the WebFinger module (used to find new users and blogs) and the CSRF protection code (see the \"Bug fixes and Security\" section) have been isolated in their own modules, they may be shared by both projects too.

    \n

    We also worked a lot on documentation. We now have articles explaining how to setup your Plume instance on various operating systems, but also documenting the translation process. I want to thank BanjoFox (who imported some documentation from their project, Aardwolf, as the setup is quite similar), Kushal and @gled@plume.mastodon.host for working on this.

    \n

    As you can see, there were many changes this month, but there still a lot to do. Your help will of course be welcome. If you want to contribute to the code, translate Plume in your language, write some documentation, or anything else (or even if you're just curious about the project), feel free to join our Matrix room: #plume:disroot.org. Otherwise, as BanjoFox said on the Aardwolf Team Mastodon account, talking about the project around you is one of the easiest way to help.

    \n", + "id" : "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/", + "likes" : null, + "name" : "This Month in Plume: June 2018", + "published" : "2018-07-10T20:16:24.087622Z", + "shares" : null, + "source" : null, + "tag" : [ + { + "href" : "https://baptiste.gelez.xyz/@/Trinity", + "name" : "@Trinity", + "type" : "Mention" + }, + { + "href" : "https://baptiste.gelez.xyz/@/kaniini/", + "name" : "@kaniini", + "type" : "Mention" + }, + { + "href" : "https://baptiste.gelez.xyz/@/Trinity", + "name" : "@Trinity", + "type" : "Mention" + } + ], + "to" : [ + "https://unixcorn.xyz/users/Bat", + "https://mastodon.host/users/federationbot", + "https://social.tcit.fr/users/tcit", + "https://framapiaf.org/users/qwerty", + "https://mastodon.social/users/lthms", + "https://eldritch.cafe/users/Nausicaa", + "https://imaginair.es/users/Elanndelh", + "https://framapiaf.org/users/Drulac", + "https://mastodon.partipirate.org/users/NicolasConstant", + "https://aleph.land/users/Madeorsk", + "https://maly.io/users/Troll", + "https://hostux.social/users/superjey", + "https://mamot.fr/users/Phigger", + "https://mastodon.social/users/wakest", + "https://social.coop/users/wakest", + "https://unixcorn.xyz/users/Ce_lo", + "https://social.art-software.fr/users/Electron", + "https://framapiaf.org/users/Quenti", + "https://toot.plus.yt/users/Djyp", + "https://mastodon.social/users/brainblasted", + "https://social.mochi.academy/users/Ambraven", + "https://social.hacktivis.me/users/lanodan", + "https://mastodon.eliotberriot.com/users/eliotberriot", + "https://edolas.world/users/0x1C3B00DA", + "https://toot.cafe/users/zack", + "https://manowar.social/users/zatnosk", + "https://eldritch.cafe/users/fluffy", + "https://mastodon.social/users/david_ross", + "https://kosmos.social/users/xiroux", + "https://mastodon.art/users/EmergencyBattle", + "https://mastodon.social/users/trwnh", + "https://octodon.social/users/pybyte", + "https://anticapitalist.party/users/Trinity", + "https://mstdn.mx/users/xavavu", + "https://baptiste.gelez.xyz/@/m4sk1n", + "https://eldritch.cafe/users/milia", + "https://mastodon.zaclys.com/users/arx", + "https://toot.cafe/users/sivy", + "https://mastodon.social/users/ortegacmanuel", + "https://mastodon.observer/users/stephen", + "https://octodon.social/users/chloe", + "https://unixcorn.xyz/users/AmauryPi", + "https://cybre.space/users/rick_777", + "https://mastodon.social/users/wezm", + "https://baptiste.gelez.xyz/@/idlesong", + "https://mamot.fr/users/dr4Ke", + "https://imaginair.es/users/Phigger", + "https://mamot.fr/users/dlink", + "https://anticapitalist.party/users/a000d4f7a91939d0e71df1646d7a48", + "https://framapiaf.org/users/PhieLaidMignon", + "https://mastodon.social/users/y6nH", + "https://crazynoisybizarre.town/users/FederationBot", + "https://social.weho.st/users/dvn", + "https://mastodon.art/users/Wolthera", + "https://diaspodon.fr/users/dada", + "https://pachyder.me/users/Lanza", + "https://mastodon.xyz/users/ag", + "https://aleph.land/users/yahananxie", + "https://mstdn.io/users/chablis_social", + "https://mastodon.gougere.fr/users/fabien", + "https://functional.cafe/users/otini", + "https://social.coop/users/bhaugen", + "https://octodon.social/users/donblanco", + "https://chaos.social/users/astro", + "https://pachyder.me/users/sibear", + "https://mamot.fr/users/yohann", + "https://social.wxcafe.net/users/Bat", + "https://mastodon.social/users/dansup", + "https://chaos.social/users/juh", + "https://scifi.fyi/users/paeneultima", + "https://hostux.social/users/Deuchnord", + "https://mstdn.fr/users/taziden", + "https://mamot.fr/users/PifyZ", + "https://mastodon.social/users/plantabaja", + "https://mastodon.social/users/gitzgrog", + "https://mastodon.social/users/Syluban", + "https://masto.pt/users/eloisa", + "https://pleroma.soykaf.com/users/notclacke", + "https://mastodon.social/users/SiegfriedEhret", + "https://writing.exchange/users/write_as", + "https://mstdn.io/users/shellkr", + "https://mastodon.uy/users/jorge", + "https://mastodon.technology/users/bobstechsite", + "https://mastodon.social/users/hinterwaeldler", + "https://mastodon.xyz/users/mgdelacroix", + "https://mastodon.cloud/users/jjatria", + "https://baptiste.gelez.xyz/@/Jade/", + "https://edolas.world/users/pfm", + "https://mstdn.io/users/jort", + "https://mastodon.social/users/andreipetcu", + "https://mastodon.technology/users/0xf00fc7c8", + "https://mastodon.social/users/khanate", + "https://mastodon.technology/users/francois", + "https://mastodon.social/users/glherrmann", + "https://mastodon.host/users/gled", + "https://social.holdmybeer.solutions/users/kemonine", + "https://scholar.social/users/bgcarlisle", + "https://mastodon.social/users/oldgun", + "https://baptiste.gelez.xyz/@/snoe/", + "https://mastodon.at/users/switchingsocial", + "https://scifi.fyi/users/BrokenBiscuit", + "https://dev.glitch.social/users/hoodie", + "https://todon.nl/users/paulfree14", + "https://mastodon.social/users/aadilayub", + "https://social.fsck.club/users/anarchosaurus", + "https://mastodonten.de/users/GiantG", + "https://mastodon.technology/users/cj", + "https://cybre.space/users/sam", + "https://layer8.space/users/silkevicious", + "https://mastodon.xyz/users/Jimmyrwx", + "https://fosstodon.org/users/danyspin97", + "https://mstdn.io/users/cristhyano", + "https://mastodon.social/users/vanyok", + "https://hulvr.com/users/rook", + "https://niu.moe/users/Lucifer", + "https://mamot.fr/users/Thibaut", + "https://mastodont.cat/users/bgta", + "https://mstdn.io/users/hontoni", + "https://niu.moe/users/lionirdeadman", + "https://functional.cafe/users/phoe", + "https://mastodon.social/users/toontoet", + "https://mastodon.social/users/danipozo", + "https://scholar.social/users/robertson", + "https://mastodon.social/users/aldatsa", + "https://elekk.xyz/users/maloki", + "https://kitty.town/users/nursemchurt", + "https://neigh.horse/users/commagray", + "https://mastodon.social/users/hirojin", + "https://mastodon.xyz/users/mareklach", + "https://chaos.social/users/benthor", + "https://mastodon.social/users/djperreault", + "https://mastodon.art/users/eylul", + "https://mastodon.opportunis.me/users/bob", + "https://tootplanet.space/users/Shutsumon", + "https://toot.cat/users/woozle", + "https://mastodon.social/users/StephenLB", + "https://sleeping.town/users/oct2pus", + "https://mastodon.indie.host/users/stragu", + "https://social.coop/users/gilscottfitzgerald", + "https://icosahedron.website/users/joeld", + "https://mastodon.social/users/hellion", + "https://cybre.space/users/cooler_ranch", + "https://mastodon.social/users/kelsonv", + "https://mastodon.lat/users/scalpol", + "https://writing.exchange/users/hnb", + "https://hex.bz/users/Horst", + "https://mastodon.social/users/weddle", + "https://maly.io/users/sonya", + "https://social.coop/users/medusa", + "https://mastodon.social/users/DystopianK", + "https://mstdn.io/users/d_io", + "https://fosstodon.org/users/brandon", + "https://fosstodon.org/users/Cando", + "https://mastodon.host/users/panina", + "https://floss.social/users/tuxether", + "https://social.tchncs.de/users/suitbertmonz", + "https://mastodon.social/users/jrt", + "https://mastodon.social/users/sirikon", + "https://mstdn.io/users/yabirgb", + "https://mastodon.cloud/users/FerdiZ", + "https://mastodon.social/users/carlchenet", + "https://social.polonkai.eu/users/calendar_social", + "https://social.polonkai.eu/users/gergely", + "https://mastodon.social/users/Jelv", + "https://mastodon.social/users/srinicame", + "https://cybre.space/users/mastoabed", + "https://mastodon.social/users/tagomago", + "https://lgbt.io/users/bootblackCub", + "https://niu.moe/users/Nopplyy", + "https://mastodon.social/users/bpugh", + "https://www.w3.org/ns/activitystreams#Public" + ], + "type" : "Article", + "uploadMedia" : null, + "url" : "https://baptiste.gelez.xyz/~/PlumeDevelopment/this-month-in-plume-june-2018/" +} diff --git a/test/fixtures/tesla_mock/peertube.moe-vid.json b/test/fixtures/tesla_mock/peertube.moe-vid.json index 76296eb7d..ceebb90b7 100644 --- a/test/fixtures/tesla_mock/peertube.moe-vid.json +++ b/test/fixtures/tesla_mock/peertube.moe-vid.json @@ -1 +1,187 @@ -{"type":"Video","id":"https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3","name":"Friday Night","duration":"PT29S","uuid":"df5f464b-be8d-46fb-ad81-2d4c2d1630e3","tag":[{"type":"Hashtag","name":"feels"}],"views":12,"sensitive":false,"commentsEnabled":true,"published":"2018-03-23T16:43:22.988Z","updated":"2018-03-24T16:28:46.002Z","mediaType":"text/markdown","content":"tfw\r\n\r\n\r\nsong is 'my old piano' by diana ross","support":null,"icon":{"type":"Image","url":"https://peertube.moe/static/thumbnails/df5f464b-be8d-46fb-ad81-2d4c2d1630e3.jpg","mediaType":"image/jpeg","width":200,"height":110},"url":[{"type":"Link","mimeType":"video/mp4","href":"https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4","width":480,"size":5015880},{"type":"Link","mimeType":"application/x-bittorrent","href":"https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.torrent","width":480},{"type":"Link","mimeType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.torrent&xt=urn:btih:11d3af6b5c812a376c2b29cdbd46e5fb42ee730e&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4","width":480},{"type":"Link","mimeType":"video/mp4","href":"https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.mp4","width":360,"size":3620040},{"type":"Link","mimeType":"application/x-bittorrent","href":"https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.torrent","width":360},{"type":"Link","mimeType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.torrent&xt=urn:btih:1c3885b4d7cdb46193b62b9b76e72b1409cfb297&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.mp4","width":360},{"type":"Link","mimeType":"video/mp4","href":"https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.mp4","width":240,"size":2305488},{"type":"Link","mimeType":"application/x-bittorrent","href":"https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.torrent","width":240},{"type":"Link","mimeType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.torrent&xt=urn:btih:ac5773352d9e26f982d2da63acfb244f01ccafa4&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.mp4","width":240},{"type":"Link","mimeType":"video/mp4","href":"https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.mp4","width":720,"size":7928231},{"type":"Link","mimeType":"application/x-bittorrent","href":"https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.torrent","width":720},{"type":"Link","mimeType":"application/x-bittorrent;x-scheme-handler/magnet","href":"magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.torrent&xt=urn:btih:b591068f4533c4e2865bb4cbb89887aecccdc523&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.mp4","width":720},{"type":"Link","mimeType":"text/html","href":"https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3"}],"likes":{"id":"https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/likes","type":"OrderedCollection","totalItems":0,"orderedItems":[]},"dislikes":{"id":"https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/dislikes","type":"OrderedCollection","totalItems":0,"orderedItems":[]},"shares":{"id":"https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/announces","type":"OrderedCollection","totalItems":2,"orderedItems":["https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/announces/465","https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/announces/1"]},"comments":{"id":"https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/comments","type":"OrderedCollection","totalItems":0,"orderedItems":[]},"attributedTo":[{"type":"Group","id":"https://peertube.moe/video-channels/5224869f-aa63-4c83-ab3a-87c3a5ac440e"},{"type":"Person","id":"https://peertube.moe/accounts/7even"}],"to":["https://www.w3.org/ns/activitystreams#Public"],"cc":[],"@context":["https://www.w3.org/ns/activitystreams","https://w3id.org/security/v1",{"RsaSignature2017":"https://w3id.org/security#RsaSignature2017","Hashtag":"as:Hashtag","uuid":"http://schema.org/identifier","category":"http://schema.org/category","licence":"http://schema.org/license","sensitive":"as:sensitive","language":"http://schema.org/inLanguage","views":"http://schema.org/Number","size":"http://schema.org/Number","commentsEnabled":"http://schema.org/Boolean","support":"http://schema.org/Text"},{"likes":{"@id":"as:likes","@type":"@id"},"dislikes":{"@id":"as:dislikes","@type":"@id"},"shares":{"@id":"as:shares","@type":"@id"},"comments":{"@id":"as:comments","@type":"@id"}}]} \ No newline at end of file +{ + "@context" : [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + { + "Hashtag" : "as:Hashtag", + "RsaSignature2017" : "https://w3id.org/security#RsaSignature2017", + "category" : "http://schema.org/category", + "commentsEnabled" : "http://schema.org/Boolean", + "language" : "http://schema.org/inLanguage", + "licence" : "http://schema.org/license", + "sensitive" : "as:sensitive", + "size" : "http://schema.org/Number", + "support" : "http://schema.org/Text", + "uuid" : "http://schema.org/identifier", + "views" : "http://schema.org/Number" + }, + { + "comments" : { + "@id" : "as:comments", + "@type" : "@id" + }, + "dislikes" : { + "@id" : "as:dislikes", + "@type" : "@id" + }, + "likes" : { + "@id" : "as:likes", + "@type" : "@id" + }, + "shares" : { + "@id" : "as:shares", + "@type" : "@id" + } + } + ], + "attributedTo" : [ + { + "id" : "https://peertube.moe/video-channels/5224869f-aa63-4c83-ab3a-87c3a5ac440e", + "type" : "Group" + }, + { + "id" : "https://peertube.moe/accounts/7even", + "type" : "Person" + } + ], + "cc" : [], + "comments" : { + "id" : "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/comments", + "orderedItems" : [], + "totalItems" : 0, + "type" : "OrderedCollection" + }, + "commentsEnabled" : true, + "content" : "tfw\r\n\r\n\r\nsong is 'my old piano' by diana ross", + "dislikes" : { + "id" : "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/dislikes", + "orderedItems" : [], + "totalItems" : 0, + "type" : "OrderedCollection" + }, + "duration" : "PT29S", + "icon" : { + "height" : 110, + "mediaType" : "image/jpeg", + "type" : "Image", + "url" : "https://peertube.moe/static/thumbnails/df5f464b-be8d-46fb-ad81-2d4c2d1630e3.jpg", + "width" : 200 + }, + "id" : "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3", + "likes" : { + "id" : "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/likes", + "orderedItems" : [], + "totalItems" : 0, + "type" : "OrderedCollection" + }, + "mediaType" : "text/markdown", + "name" : "Friday Night", + "published" : "2018-03-23T16:43:22.988Z", + "sensitive" : false, + "shares" : { + "id" : "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/announces", + "orderedItems" : [ + "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/announces/465", + "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3/announces/1" + ], + "totalItems" : 2, + "type" : "OrderedCollection" + }, + "support" : null, + "tag" : [ + { + "name" : "feels", + "type" : "Hashtag" + } + ], + "to" : [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "type" : "Video", + "updated" : "2018-03-24T16:28:46.002Z", + "url" : [ + { + "href" : "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", + "mimeType" : "video/mp4", + "size" : 5015880, + "type" : "Link", + "width" : 480 + }, + { + "href" : "https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.torrent", + "mimeType" : "application/x-bittorrent", + "type" : "Link", + "width" : 480 + }, + { + "href" : "magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.torrent&xt=urn:btih:11d3af6b5c812a376c2b29cdbd46e5fb42ee730e&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4", + "mimeType" : "application/x-bittorrent;x-scheme-handler/magnet", + "type" : "Link", + "width" : 480 + }, + { + "href" : "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.mp4", + "mimeType" : "video/mp4", + "size" : 3620040, + "type" : "Link", + "width" : 360 + }, + { + "href" : "https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.torrent", + "mimeType" : "application/x-bittorrent", + "type" : "Link", + "width" : 360 + }, + { + "href" : "magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.torrent&xt=urn:btih:1c3885b4d7cdb46193b62b9b76e72b1409cfb297&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-360.mp4", + "mimeType" : "application/x-bittorrent;x-scheme-handler/magnet", + "type" : "Link", + "width" : 360 + }, + { + "href" : "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.mp4", + "mimeType" : "video/mp4", + "size" : 2305488, + "type" : "Link", + "width" : 240 + }, + { + "href" : "https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.torrent", + "mimeType" : "application/x-bittorrent", + "type" : "Link", + "width" : 240 + }, + { + "href" : "magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.torrent&xt=urn:btih:ac5773352d9e26f982d2da63acfb244f01ccafa4&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-240.mp4", + "mimeType" : "application/x-bittorrent;x-scheme-handler/magnet", + "type" : "Link", + "width" : 240 + }, + { + "href" : "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.mp4", + "mimeType" : "video/mp4", + "size" : 7928231, + "type" : "Link", + "width" : 720 + }, + { + "href" : "https://peertube.moe/static/torrents/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.torrent", + "mimeType" : "application/x-bittorrent", + "type" : "Link", + "width" : 720 + }, + { + "href" : "magnet:?xs=https%3A%2F%2Fpeertube.moe%2Fstatic%2Ftorrents%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.torrent&xt=urn:btih:b591068f4533c4e2865bb4cbb89887aecccdc523&dn=Friday+Night&tr=wss%3A%2F%2Fpeertube.moe%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube.moe%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube.moe%2Fstatic%2Fwebseed%2Fdf5f464b-be8d-46fb-ad81-2d4c2d1630e3-720.mp4", + "mimeType" : "application/x-bittorrent;x-scheme-handler/magnet", + "type" : "Link", + "width" : 720 + }, + { + "href" : "https://peertube.moe/videos/watch/df5f464b-be8d-46fb-ad81-2d4c2d1630e3", + "mimeType" : "text/html", + "type" : "Link" + } + ], + "uuid" : "df5f464b-be8d-46fb-ad81-2d4c2d1630e3", + "views" : 12 +} diff --git a/test/html_test.exs b/test/html_test.exs index 0a4b4ebbc..f8907c8b4 100644 --- a/test/html_test.exs +++ b/test/html_test.exs @@ -237,5 +237,19 @@ defmodule Pleroma.HTMLTest do assert {:ok, nil} = HTML.extract_first_external_url(object, object.data["content"]) end + + test "skips attachment links" do + user = insert(:user) + + {:ok, activity} = + CommonAPI.post(user, %{ + status: + "image.png" + }) + + object = Object.normalize(activity) + + assert {:ok, nil} = HTML.extract_first_external_url(object, object.data["content"]) + end end end diff --git a/test/http/adapter_helper/hackney_test.exs b/test/http/adapter_helper/hackney_test.exs index 3f7e708e0..f2361ff0b 100644 --- a/test/http/adapter_helper/hackney_test.exs +++ b/test/http/adapter_helper/hackney_test.exs @@ -31,17 +31,5 @@ defmodule Pleroma.HTTP.AdapterHelper.HackneyTest do assert opts[:b] == 1 refute Keyword.has_key?(opts, :proxy) end - - test "add opts for https" do - uri = URI.parse("https://domain.com") - - opts = Hackney.options(uri) - - assert opts[:ssl_options] == [ - partial_chain: &:hackney_connect.partial_chain/1, - versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"], - server_name_indication: 'domain.com' - ] - end end end diff --git a/test/http/ex_aws_test.exs b/test/http/ex_aws_test.exs new file mode 100644 index 000000000..d0b00ca26 --- /dev/null +++ b/test/http/ex_aws_test.exs @@ -0,0 +1,54 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.ExAwsTest do + use ExUnit.Case + + import Tesla.Mock + alias Pleroma.HTTP + + @url "https://s3.amazonaws.com/test_bucket/test_image.jpg" + + setup do + mock(fn + %{method: :get, url: @url, headers: [{"x-amz-bucket-region", "us-east-1"}]} -> + %Tesla.Env{ + status: 200, + body: "image-content", + headers: [{"x-amz-bucket-region", "us-east-1"}] + } + + %{method: :post, url: @url, body: "image-content-2"} -> + %Tesla.Env{status: 200, body: "image-content-2"} + end) + + :ok + end + + describe "request" do + test "get" do + assert HTTP.ExAws.request(:get, @url, "", [{"x-amz-bucket-region", "us-east-1"}]) == { + :ok, + %{ + body: "image-content", + headers: [{"x-amz-bucket-region", "us-east-1"}], + status_code: 200 + } + } + end + + test "post" do + assert HTTP.ExAws.request(:post, @url, "image-content-2", [ + {"x-amz-bucket-region", "us-east-1"} + ]) == { + :ok, + %{ + body: "image-content-2", + headers: [], + status_code: 200 + } + } + end + end +end diff --git a/test/http/tzdata_test.exs b/test/http/tzdata_test.exs new file mode 100644 index 000000000..3e605d33b --- /dev/null +++ b/test/http/tzdata_test.exs @@ -0,0 +1,35 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.TzdataTest do + use ExUnit.Case + + import Tesla.Mock + alias Pleroma.HTTP + @url "https://data.iana.org/time-zones/tzdata-latest.tar.gz" + + setup do + mock(fn + %{method: :head, url: @url} -> + %Tesla.Env{status: 200, body: ""} + + %{method: :get, url: @url} -> + %Tesla.Env{status: 200, body: "hello"} + end) + + :ok + end + + describe "head/1" do + test "returns successfully result" do + assert HTTP.Tzdata.head(@url, [], []) == {:ok, {200, []}} + end + end + + describe "get/1" do + test "returns successfully result" do + assert HTTP.Tzdata.get(@url, [], []) == {:ok, {200, [], "hello"}} + end + end +end diff --git a/test/http_test.exs b/test/http_test.exs index 618485b55..d394bb942 100644 --- a/test/http_test.exs +++ b/test/http_test.exs @@ -17,6 +17,9 @@ defmodule Pleroma.HTTPTest do } -> json(%{"my" => "data"}) + %{method: :head, url: "http://example.com/hello"} -> + %Tesla.Env{status: 200, body: ""} + %{method: :get, url: "http://example.com/hello"} -> %Tesla.Env{status: 200, body: "hello"} @@ -27,6 +30,12 @@ defmodule Pleroma.HTTPTest do :ok end + describe "head/1" do + test "returns successfully result" do + assert HTTP.head("http://example.com/hello") == {:ok, %Tesla.Env{status: 200, body: ""}} + end + end + describe "get/1" do test "returns successfully result" do assert HTTP.get("http://example.com/hello") == { diff --git a/test/instance_static/emoji/test_pack/blank2.png b/test/instance_static/emoji/test_pack/blank2.png new file mode 100644 index 000000000..8f50fa023 Binary files /dev/null and b/test/instance_static/emoji/test_pack/blank2.png differ diff --git a/test/instance_static/emoji/test_pack/pack.json b/test/instance_static/emoji/test_pack/pack.json index 481891b08..5b33fbb32 100644 --- a/test/instance_static/emoji/test_pack/pack.json +++ b/test/instance_static/emoji/test_pack/pack.json @@ -1,6 +1,7 @@ { "files": { - "blank": "blank.png" + "blank": "blank.png", + "blank2": "blank2.png" }, "pack": { "description": "Test description", diff --git a/test/instance_static/emoji/test_pack_nonshared/nonshared.zip b/test/instance_static/emoji/test_pack_nonshared/nonshared.zip index 148446c64..59bff37f0 100644 Binary files a/test/instance_static/emoji/test_pack_nonshared/nonshared.zip and b/test/instance_static/emoji/test_pack_nonshared/nonshared.zip differ diff --git a/test/instance_static/emoji/test_pack_nonshared/pack.json b/test/instance_static/emoji/test_pack_nonshared/pack.json index 93d643a5f..09f6274d1 100644 --- a/test/instance_static/emoji/test_pack_nonshared/pack.json +++ b/test/instance_static/emoji/test_pack_nonshared/pack.json @@ -4,7 +4,7 @@ "homepage": "https://pleroma.social", "description": "Test description", "fallback-src": "https://nonshared-pack", - "fallback-src-sha256": "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF", + "fallback-src-sha256": "1967BB4E42BCC34BCC12D57BE7811D3B7BE52F965BCE45C87BD377B9499CE11D", "share-files": false }, "files": { diff --git a/test/instance_static/local_pack/files.json b/test/instance_static/local_pack/files.json new file mode 100644 index 000000000..279770998 --- /dev/null +++ b/test/instance_static/local_pack/files.json @@ -0,0 +1,3 @@ +{ + "blank": "blank.png" +} \ No newline at end of file diff --git a/test/instance_static/local_pack/manifest.json b/test/instance_static/local_pack/manifest.json new file mode 100644 index 000000000..01067042f --- /dev/null +++ b/test/instance_static/local_pack/manifest.json @@ -0,0 +1,10 @@ +{ + "local": { + "src_sha256": "384025A1AC6314473863A11AC7AB38A12C01B851A3F82359B89B4D4211D3291D", + "src": "test/fixtures/emoji/packs/blank.png.zip", + "license": "Apache 2.0", + "homepage": "https://example.com", + "files": "files.json", + "description": "Some local pack" + } +} \ No newline at end of file diff --git a/test/migration_helper/notification_backfill_test.exs b/test/migration_helper/notification_backfill_test.exs new file mode 100644 index 000000000..2a62a2b00 --- /dev/null +++ b/test/migration_helper/notification_backfill_test.exs @@ -0,0 +1,56 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.MigrationHelper.NotificationBackfillTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.MigrationHelper.NotificationBackfill + alias Pleroma.Notification + alias Pleroma.Repo + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + describe "fill_in_notification_types" do + test "it fills in missing notification types" do + user = insert(:user) + other_user = insert(:user) + + {:ok, post} = CommonAPI.post(user, %{status: "yeah, @#{other_user.nickname}"}) + {:ok, chat} = CommonAPI.post_chat_message(user, other_user, "yo") + {:ok, react} = CommonAPI.react_with_emoji(post.id, other_user, "☕") + {:ok, like} = CommonAPI.favorite(other_user, post.id) + {:ok, react_2} = CommonAPI.react_with_emoji(post.id, other_user, "☕") + + data = + react_2.data + |> Map.put("type", "EmojiReaction") + + {:ok, react_2} = + react_2 + |> Activity.change(%{data: data}) + |> Repo.update() + + assert {5, nil} = Repo.update_all(Notification, set: [type: nil]) + + NotificationBackfill.fill_in_notification_types() + + assert %{type: "mention"} = + Repo.get_by(Notification, user_id: other_user.id, activity_id: post.id) + + assert %{type: "favourite"} = + Repo.get_by(Notification, user_id: user.id, activity_id: like.id) + + assert %{type: "pleroma:emoji_reaction"} = + Repo.get_by(Notification, user_id: user.id, activity_id: react.id) + + assert %{type: "pleroma:emoji_reaction"} = + Repo.get_by(Notification, user_id: user.id, activity_id: react_2.id) + + assert %{type: "pleroma:chat_mention"} = + Repo.get_by(Notification, user_id: other_user.id, activity_id: chat.id) + end + end +end diff --git a/test/notification_test.exs b/test/notification_test.exs index 111ff09f4..6add3f7eb 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -10,6 +10,7 @@ defmodule Pleroma.NotificationTest do alias Pleroma.FollowingRelationship alias Pleroma.Notification + alias Pleroma.Repo alias Pleroma.Tests.ObanHelpers alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub @@ -21,6 +22,16 @@ defmodule Pleroma.NotificationTest do alias Pleroma.Web.Streamer describe "create_notifications" do + test "never returns nil" do + user = insert(:user) + other_user = insert(:user, %{invisible: true}) + + {:ok, activity} = CommonAPI.post(user, %{status: "yeah"}) + {:ok, activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + + refute {:ok, [nil]} == Notification.create_notifications(activity) + end + test "creates a notification for an emoji reaction" do user = insert(:user) other_user = insert(:user) @@ -31,6 +42,7 @@ defmodule Pleroma.NotificationTest do {:ok, [notification]} = Notification.create_notifications(activity) assert notification.user_id == user.id + assert notification.type == "pleroma:emoji_reaction" end test "notifies someone when they are directly addressed" do @@ -48,6 +60,7 @@ defmodule Pleroma.NotificationTest do notified_ids = Enum.sort([notification.user_id, other_notification.user_id]) assert notified_ids == [other_user.id, third_user.id] assert notification.activity_id == activity.id + assert notification.type == "mention" assert other_notification.activity_id == activity.id assert [%Pleroma.Marker{unread_count: 2}] = @@ -303,6 +316,14 @@ defmodule Pleroma.NotificationTest do assert {:ok, []} == Notification.create_notifications(status) end + + test "it disables notifications from people who are invisible" do + author = insert(:user, invisible: true) + user = insert(:user) + + {:ok, status} = CommonAPI.post(author, %{status: "hey @#{user.nickname}"}) + refute Notification.create_notification(status, user) + end end describe "follow / follow_request notifications" do @@ -335,9 +356,12 @@ defmodule Pleroma.NotificationTest do # After request is accepted, the same notification is rendered with type "follow": assert {:ok, _} = CommonAPI.accept_follow_request(user, followed_user) - notification_id = notification.id - assert [%{id: ^notification_id}] = Notification.for_user(followed_user) - assert %{type: "follow"} = NotificationView.render("show.json", render_opts) + notification = + Repo.get(Notification, notification.id) + |> Repo.preload(:activity) + + assert %{type: "follow"} = + NotificationView.render("show.json", notification: notification, for: followed_user) end test "it doesn't create a notification for follow-unfollow-follow chains" do @@ -454,8 +478,7 @@ defmodule Pleroma.NotificationTest do status: "hey again @#{other_user.nickname}!" }) - [n2, n1] = notifs = Notification.for_user(other_user) - assert length(notifs) == 2 + [n2, n1] = Notification.for_user(other_user) assert n2.id > n1.id @@ -464,7 +487,9 @@ defmodule Pleroma.NotificationTest do status: "hey yet again @#{other_user.nickname}!" }) - Notification.set_read_up_to(other_user, n2.id) + [_, read_notification] = Notification.set_read_up_to(other_user, n2.id) + + assert read_notification.activity.object [n3, n2, n1] = Notification.for_user(other_user) @@ -648,7 +673,7 @@ defmodule Pleroma.NotificationTest do status: "hey @#{other_user.nickname}!" }) - {:ok, activity_two, _} = CommonAPI.repeat(activity_one.id, third_user) + {:ok, activity_two} = CommonAPI.repeat(activity_one.id, third_user) {enabled_receivers, _disabled_receivers} = Notification.get_notified_from_activity(activity_two) @@ -778,7 +803,7 @@ defmodule Pleroma.NotificationTest do assert Enum.empty?(Notification.for_user(user)) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) assert length(Notification.for_user(user)) == 1 @@ -795,7 +820,7 @@ defmodule Pleroma.NotificationTest do assert Enum.empty?(Notification.for_user(user)) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) assert length(Notification.for_user(user)) == 1 @@ -972,7 +997,9 @@ defmodule Pleroma.NotificationTest do {:ok, _activity} = CommonAPI.post(muted, %{status: "hey @#{user.nickname}"}) - assert length(Notification.for_user(user)) == 1 + [notification] = Notification.for_user(user) + + assert notification.activity.object end test "it doesn't return notifications for muted user with notifications" do diff --git a/test/object/fetcher_test.exs b/test/object/fetcher_test.exs index c06e91f12..d9098ea1b 100644 --- a/test/object/fetcher_test.exs +++ b/test/object/fetcher_test.exs @@ -26,6 +26,46 @@ defmodule Pleroma.Object.FetcherTest do :ok end + describe "error cases" do + setup do + mock(fn + %{method: :get, url: "https://social.sakamoto.gq/notice/9wTkLEnuq47B25EehM"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json") + } + + %{method: :get, url: "https://social.sakamoto.gq/users/eal"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/fetch_mocks/eal.json") + } + + %{method: :get, url: "https://busshi.moe/users/tuxcrafting/statuses/104410921027210069"} -> + %Tesla.Env{ + status: 200, + body: File.read!("test/fixtures/fetch_mocks/104410921027210069.json") + } + + %{method: :get, url: "https://busshi.moe/users/tuxcrafting"} -> + %Tesla.Env{ + status: 500 + } + end) + + :ok + end + + @tag capture_log: true + test "it works when fetching the OP actor errors out" do + # Here we simulate a case where the author of the OP can't be read + assert {:ok, _} = + Fetcher.fetch_object_from_id( + "https://social.sakamoto.gq/notice/9wTkLEnuq47B25EehM" + ) + end + end + describe "max thread distance restriction" do @ap_id "http://mastodon.example.org/@admin/99541947525187367" setup do: clear_config([:instance, :federation_incoming_replies_max_depth]) diff --git a/test/pagination_test.exs b/test/pagination_test.exs index d5b1b782d..9165427ae 100644 --- a/test/pagination_test.exs +++ b/test/pagination_test.exs @@ -21,7 +21,7 @@ defmodule Pleroma.PaginationTest do id = Enum.at(notes, 2).id |> Integer.to_string() %{total: total, items: paginated} = - Pagination.fetch_paginated(Object, %{"min_id" => id, "total" => true}) + Pagination.fetch_paginated(Object, %{min_id: id, total: true}) assert length(paginated) == 2 assert total == 5 @@ -31,7 +31,7 @@ defmodule Pleroma.PaginationTest do id = Enum.at(notes, 2).id |> Integer.to_string() %{total: total, items: paginated} = - Pagination.fetch_paginated(Object, %{"since_id" => id, "total" => true}) + Pagination.fetch_paginated(Object, %{since_id: id, total: true}) assert length(paginated) == 2 assert total == 5 @@ -41,7 +41,7 @@ defmodule Pleroma.PaginationTest do id = Enum.at(notes, 1).id |> Integer.to_string() %{total: total, items: paginated} = - Pagination.fetch_paginated(Object, %{"max_id" => id, "total" => true}) + Pagination.fetch_paginated(Object, %{max_id: id, total: true}) assert length(paginated) == 1 assert total == 5 @@ -50,7 +50,7 @@ defmodule Pleroma.PaginationTest do test "paginates by min_id & limit", %{notes: notes} do id = Enum.at(notes, 2).id |> Integer.to_string() - paginated = Pagination.fetch_paginated(Object, %{"min_id" => id, "limit" => 1}) + paginated = Pagination.fetch_paginated(Object, %{min_id: id, limit: 1}) assert length(paginated) == 1 end @@ -64,13 +64,13 @@ defmodule Pleroma.PaginationTest do end test "paginates by limit" do - paginated = Pagination.fetch_paginated(Object, %{"limit" => 2}, :offset) + paginated = Pagination.fetch_paginated(Object, %{limit: 2}, :offset) assert length(paginated) == 2 end test "paginates by limit & offset" do - paginated = Pagination.fetch_paginated(Object, %{"limit" => 2, "offset" => 4}, :offset) + paginated = Pagination.fetch_paginated(Object, %{limit: 2, offset: 4}, :offset) assert length(paginated) == 1 end diff --git a/test/plugs/authentication_plug_test.exs b/test/plugs/authentication_plug_test.exs index 3c70c1747..777ae15ae 100644 --- a/test/plugs/authentication_plug_test.exs +++ b/test/plugs/authentication_plug_test.exs @@ -68,6 +68,7 @@ defmodule Pleroma.Plugs.AuthenticationPlugTest do assert "$pbkdf2" <> _ = user.password_hash end + @tag :skip_on_mac test "with a crypt hash, it updates to a pkbdf2 hash", %{conn: conn} do user = insert(:user, diff --git a/test/plugs/http_security_plug_test.exs b/test/plugs/http_security_plug_test.exs index 84e4c274f..63b4d3f31 100644 --- a/test/plugs/http_security_plug_test.exs +++ b/test/plugs/http_security_plug_test.exs @@ -67,7 +67,7 @@ defmodule Pleroma.Web.Plugs.HTTPSecurityPlugTest do [csp] = Conn.get_resp_header(conn, "content-security-policy") - assert csp =~ ~r|report-uri https://endpoint.com; report-to csp-endpoint;| + assert csp =~ ~r|report-uri https://endpoint.com;report-to csp-endpoint;| [reply_to] = Conn.get_resp_header(conn, "reply-to") diff --git a/test/plugs/instance_static_test.exs b/test/plugs/instance_static_test.exs index b8f070d6a..be2613ad0 100644 --- a/test/plugs/instance_static_test.exs +++ b/test/plugs/instance_static_test.exs @@ -16,7 +16,7 @@ defmodule Pleroma.Web.RuntimeStaticPlugTest do test "overrides index" do bundled_index = get(build_conn(), "/") - assert html_response(bundled_index, 200) == File.read!("priv/static/index.html") + refute html_response(bundled_index, 200) == "hello world" File.write!(@dir <> "/index.html", "hello world") diff --git a/test/repo_test.exs b/test/repo_test.exs index daffc6542..92e827c95 100644 --- a/test/repo_test.exs +++ b/test/repo_test.exs @@ -4,9 +4,7 @@ defmodule Pleroma.RepoTest do use Pleroma.DataCase - import ExUnit.CaptureLog import Pleroma.Factory - import Mock alias Pleroma.User @@ -49,36 +47,4 @@ defmodule Pleroma.RepoTest do assert Repo.get_assoc(token, :user) == {:error, :not_found} end end - - describe "check_migrations_applied!" do - setup_with_mocks([ - {Ecto.Migrator, [], - [ - with_repo: fn repo, fun -> passthrough([repo, fun]) end, - migrations: fn Pleroma.Repo -> - [ - {:up, 20_191_128_153_944, "fix_missing_following_count"}, - {:up, 20_191_203_043_610, "create_report_notes"}, - {:down, 20_191_220_174_645, "add_scopes_to_pleroma_feo_auth_records"} - ] - end - ]} - ]) do - :ok - end - - setup do: clear_config([:i_am_aware_this_may_cause_data_loss, :disable_migration_check]) - - test "raises if it detects unapplied migrations" do - assert_raise Pleroma.Repo.UnappliedMigrationsError, fn -> - capture_log(&Repo.check_migrations_applied!/0) - end - end - - test "doesn't do anything if disabled" do - Pleroma.Config.put([:i_am_aware_this_may_cause_data_loss, :disable_migration_check], true) - - assert :ok == Repo.check_migrations_applied!() - end - end end diff --git a/test/stats_test.exs b/test/stats_test.exs index 4b76e2e78..f09d8d31a 100644 --- a/test/stats_test.exs +++ b/test/stats_test.exs @@ -17,10 +17,11 @@ defmodule Pleroma.StatsTest do end end - describe "status visibility count" do + describe "status visibility sum count" do test "on new status" do + instance2 = "instance2.tld" user = insert(:user) - other_user = insert(:user) + other_user = insert(:user, %{ap_id: "https://#{instance2}/@actor"}) CommonAPI.post(user, %{visibility: "public", status: "hey"}) @@ -45,24 +46,24 @@ defmodule Pleroma.StatsTest do }) end) - assert %{direct: 3, private: 4, public: 1, unlisted: 2} = + assert %{"direct" => 3, "private" => 4, "public" => 1, "unlisted" => 2} = Pleroma.Stats.get_status_visibility_count() end test "on status delete" do user = insert(:user) {:ok, activity} = CommonAPI.post(user, %{visibility: "public", status: "hey"}) - assert %{public: 1} = Pleroma.Stats.get_status_visibility_count() + assert %{"public" => 1} = Pleroma.Stats.get_status_visibility_count() CommonAPI.delete(activity.id, user) - assert %{public: 0} = Pleroma.Stats.get_status_visibility_count() + assert %{"public" => 0} = Pleroma.Stats.get_status_visibility_count() end test "on status visibility update" do user = insert(:user) {:ok, activity} = CommonAPI.post(user, %{visibility: "public", status: "hey"}) - assert %{public: 1, private: 0} = Pleroma.Stats.get_status_visibility_count() + assert %{"public" => 1, "private" => 0} = Pleroma.Stats.get_status_visibility_count() {:ok, _} = CommonAPI.update_activity_scope(activity.id, %{visibility: "private"}) - assert %{public: 0, private: 1} = Pleroma.Stats.get_status_visibility_count() + assert %{"public" => 0, "private" => 1} = Pleroma.Stats.get_status_visibility_count() end test "doesn't count unrelated activities" do @@ -73,8 +74,46 @@ defmodule Pleroma.StatsTest do CommonAPI.favorite(other_user, activity.id) CommonAPI.repeat(activity.id, other_user) - assert %{direct: 0, private: 0, public: 1, unlisted: 0} = + assert %{"direct" => 0, "private" => 0, "public" => 1, "unlisted" => 0} = Pleroma.Stats.get_status_visibility_count() end end + + describe "status visibility by instance count" do + test "single instance" do + local_instance = Pleroma.Web.Endpoint.url() |> String.split("//") |> Enum.at(1) + instance2 = "instance2.tld" + user1 = insert(:user) + user2 = insert(:user, %{ap_id: "https://#{instance2}/@actor"}) + + CommonAPI.post(user1, %{visibility: "public", status: "hey"}) + + Enum.each(1..5, fn _ -> + CommonAPI.post(user1, %{ + visibility: "unlisted", + status: "hey" + }) + end) + + Enum.each(1..10, fn _ -> + CommonAPI.post(user1, %{ + visibility: "direct", + status: "hey @#{user2.nickname}" + }) + end) + + Enum.each(1..20, fn _ -> + CommonAPI.post(user2, %{ + visibility: "private", + status: "hey" + }) + end) + + assert %{"direct" => 10, "private" => 0, "public" => 1, "unlisted" => 5} = + Pleroma.Stats.get_status_visibility_count(local_instance) + + assert %{"direct" => 0, "private" => 20, "public" => 0, "unlisted" => 0} = + Pleroma.Stats.get_status_visibility_count(instance2) + end + end end diff --git a/test/support/api_spec_helpers.ex b/test/support/api_spec_helpers.ex index 80c69c788..46388f92c 100644 --- a/test/support/api_spec_helpers.ex +++ b/test/support/api_spec_helpers.ex @@ -51,7 +51,7 @@ defmodule Pleroma.Tests.ApiSpecHelpers do |> Map.take([:delete, :get, :head, :options, :patch, :post, :put, :trace]) |> Map.values() |> Enum.reject(&is_nil/1) - |> Enum.uniq() end) + |> Enum.uniq() end end diff --git a/test/support/factory.ex b/test/support/factory.ex index d4284831c..6e22b66a4 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -34,14 +34,16 @@ defmodule Pleroma.Factory do last_digest_emailed_at: NaiveDateTime.utc_now(), last_refreshed_at: NaiveDateTime.utc_now(), notification_settings: %Pleroma.User.NotificationSetting{}, - multi_factor_authentication_settings: %Pleroma.MFA.Settings{} + multi_factor_authentication_settings: %Pleroma.MFA.Settings{}, + ap_enabled: true } %{ user | ap_id: User.ap_id(user), follower_address: User.ap_followers(user), - following_address: User.ap_following(user) + following_address: User.ap_following(user), + raw_bio: user.bio } end @@ -395,24 +397,17 @@ defmodule Pleroma.Factory do } end - def config_factory do + def config_factory(attrs \\ %{}) do %Pleroma.ConfigDB{ - key: - sequence(:key, fn key -> - # Atom dynamic registration hack in tests - "some_key_#{key}" - |> String.to_atom() - |> inspect() - end), - group: ":pleroma", + key: sequence(:key, &String.to_atom("some_key_#{&1}")), + group: :pleroma, value: sequence( :value, - fn key -> - :erlang.term_to_binary(%{another_key: "#{key}somevalue", another: "#{key}somevalue"}) - end + &%{another_key: "#{&1}somevalue", another: "#{&1}somevalue"} ) } + |> merge_attributes(attrs) end def marker_factory do diff --git a/test/support/http_request_mock.ex b/test/support/http_request_mock.ex index 3a95e92da..3d5128835 100644 --- a/test/support/http_request_mock.ex +++ b/test/support/http_request_mock.ex @@ -1291,6 +1291,10 @@ defmodule HttpRequestMock do }} end + def get("https://example.org/emoji/firedfox.png", _, _, _) do + {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/image.jpg")}} + end + def get("https://skippers-bin.com/users/7v1w1r8ce6", _, _, _) do {:ok, %Tesla.Env{status: 200, body: File.read!("test/fixtures/tesla_mock/sjw.json")}} end diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs index 04bc947a9..71f36c0e3 100644 --- a/test/tasks/config_test.exs +++ b/test/tasks/config_test.exs @@ -5,6 +5,8 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do use Pleroma.DataCase + import Pleroma.Factory + alias Pleroma.ConfigDB alias Pleroma.Repo @@ -48,25 +50,21 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do config3 = ConfigDB.get_by_params(%{group: ":quack", key: ":level"}) refute ConfigDB.get_by_params(%{group: ":pleroma", key: "Pleroma.Repo"}) refute ConfigDB.get_by_params(%{group: ":postgrex", key: ":json_library"}) + refute ConfigDB.get_by_params(%{group: ":pleroma", key: ":database"}) - assert ConfigDB.from_binary(config1.value) == [key: "value", key2: [Repo]] - assert ConfigDB.from_binary(config2.value) == [key: "value2", key2: ["Activity"]] - assert ConfigDB.from_binary(config3.value) == :info + assert config1.value == [key: "value", key2: [Repo]] + assert config2.value == [key: "value2", key2: ["Activity"]] + assert config3.value == :info end test "config table is truncated before migration" do - ConfigDB.create(%{ - group: ":pleroma", - key: ":first_setting", - value: [key: "value", key2: ["Activity"]] - }) - + insert(:config, key: :first_setting, value: [key: "value", key2: ["Activity"]]) assert Repo.aggregate(ConfigDB, :count, :id) == 1 Mix.Tasks.Pleroma.Config.migrate_to_db("test/fixtures/config/temp.secret.exs") config = ConfigDB.get_by_params(%{group: ":pleroma", key: ":first_setting"}) - assert ConfigDB.from_binary(config.value) == [key: "value", key2: [Repo]] + assert config.value == [key: "value", key2: [Repo]] end end @@ -82,19 +80,9 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do end test "settings are migrated to file and deleted from db", %{temp_file: temp_file} do - ConfigDB.create(%{ - group: ":pleroma", - key: ":setting_first", - value: [key: "value", key2: ["Activity"]] - }) - - ConfigDB.create(%{ - group: ":pleroma", - key: ":setting_second", - value: [key: "value2", key2: [Repo]] - }) - - ConfigDB.create(%{group: ":quack", key: ":level", value: :info}) + insert(:config, key: :setting_first, value: [key: "value", key2: ["Activity"]]) + insert(:config, key: :setting_second, value: [key: "value2", key2: [Repo]]) + insert(:config, group: :quack, key: :level, value: :info) Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "--env", "temp", "-d"]) @@ -107,9 +95,8 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do end test "load a settings with large values and pass to file", %{temp_file: temp_file} do - ConfigDB.create(%{ - group: ":pleroma", - key: ":instance", + insert(:config, + key: :instance, value: [ name: "Pleroma", email: "example@example.com", @@ -134,14 +121,11 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do federation_reachability_timeout_days: 7, federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher], allow_relay: true, - rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy, public: true, quarantined_instances: [], managed_config: true, static_dir: "instance/static/", allowed_post_formats: ["text/plain", "text/html", "text/markdown", "text/bbcode"], - mrf_transparency: true, - mrf_transparency_exclusions: [], autofollowed_nicknames: [], max_pinned_statuses: 1, attachment_links: false, @@ -163,7 +147,6 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do extended_nickname_format: true, multi_factor_authentication: [ totp: [ - # digits 6 or 8 digits: 6, period: 30 ], @@ -173,7 +156,7 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do ] ] ] - }) + ) Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "--env", "temp", "-d"]) @@ -189,7 +172,7 @@ defmodule Mix.Tasks.Pleroma.ConfigTest do end assert file == - "#{header}\n\nconfig :pleroma, :instance,\n name: \"Pleroma\",\n email: \"example@example.com\",\n notify_email: \"noreply@example.com\",\n description: \"A Pleroma instance, an alternative fediverse server\",\n limit: 5000,\n chat_limit: 5000,\n remote_limit: 100_000,\n upload_limit: 16_000_000,\n avatar_upload_limit: 2_000_000,\n background_upload_limit: 4_000_000,\n banner_upload_limit: 4_000_000,\n poll_limits: %{\n max_expiration: 31_536_000,\n max_option_chars: 200,\n max_options: 20,\n min_expiration: 0\n },\n registrations_open: true,\n federating: true,\n federation_incoming_replies_max_depth: 100,\n federation_reachability_timeout_days: 7,\n federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher],\n allow_relay: true,\n rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy,\n public: true,\n quarantined_instances: [],\n managed_config: true,\n static_dir: \"instance/static/\",\n allowed_post_formats: [\"text/plain\", \"text/html\", \"text/markdown\", \"text/bbcode\"],\n mrf_transparency: true,\n mrf_transparency_exclusions: [],\n autofollowed_nicknames: [],\n max_pinned_statuses: 1,\n attachment_links: false,\n welcome_user_nickname: nil,\n welcome_message: nil,\n max_report_comment_size: 1000,\n safe_dm_mentions: false,\n healthcheck: false,\n remote_post_retention_days: 90,\n skip_thread_containment: true,\n limit_to_local_content: :unauthenticated,\n user_bio_length: 5000,\n user_name_length: 100,\n max_account_fields: 10,\n max_remote_account_fields: 20,\n account_field_name_length: 512,\n account_field_value_length: 2048,\n external_user_synchronization: true,\n extended_nickname_format: true,\n multi_factor_authentication: [\n totp: [digits: 6, period: 30],\n backup_codes: [number: 2, length: 6]\n ]\n" + "#{header}\n\nconfig :pleroma, :instance,\n name: \"Pleroma\",\n email: \"example@example.com\",\n notify_email: \"noreply@example.com\",\n description: \"A Pleroma instance, an alternative fediverse server\",\n limit: 5000,\n chat_limit: 5000,\n remote_limit: 100_000,\n upload_limit: 16_000_000,\n avatar_upload_limit: 2_000_000,\n background_upload_limit: 4_000_000,\n banner_upload_limit: 4_000_000,\n poll_limits: %{\n max_expiration: 31_536_000,\n max_option_chars: 200,\n max_options: 20,\n min_expiration: 0\n },\n registrations_open: true,\n federating: true,\n federation_incoming_replies_max_depth: 100,\n federation_reachability_timeout_days: 7,\n federation_publisher_modules: [Pleroma.Web.ActivityPub.Publisher],\n allow_relay: true,\n public: true,\n quarantined_instances: [],\n managed_config: true,\n static_dir: \"instance/static/\",\n allowed_post_formats: [\"text/plain\", \"text/html\", \"text/markdown\", \"text/bbcode\"],\n autofollowed_nicknames: [],\n max_pinned_statuses: 1,\n attachment_links: false,\n welcome_user_nickname: nil,\n welcome_message: nil,\n max_report_comment_size: 1000,\n safe_dm_mentions: false,\n healthcheck: false,\n remote_post_retention_days: 90,\n skip_thread_containment: true,\n limit_to_local_content: :unauthenticated,\n user_bio_length: 5000,\n user_name_length: 100,\n max_account_fields: 10,\n max_remote_account_fields: 20,\n account_field_name_length: 512,\n account_field_value_length: 2048,\n external_user_synchronization: true,\n extended_nickname_format: true,\n multi_factor_authentication: [\n totp: [digits: 6, period: 30],\n backup_codes: [number: 2, length: 6]\n ]\n" end end end diff --git a/test/tasks/emoji_test.exs b/test/tasks/emoji_test.exs index f5de3ef0e..499f098c2 100644 --- a/test/tasks/emoji_test.exs +++ b/test/tasks/emoji_test.exs @@ -73,6 +73,19 @@ defmodule Mix.Tasks.Pleroma.EmojiTest do on_exit(fn -> File.rm_rf!("test/instance_static/emoji/finmoji") end) end + test "install local emoji pack" do + assert capture_io(fn -> + Emoji.run([ + "get-packs", + "local", + "--manifest", + "test/instance_static/local_pack/manifest.json" + ]) + end) =~ "Writing pack.json for" + + on_exit(fn -> File.rm_rf!("test/instance_static/emoji/local") end) + end + test "pack not found" do mock(fn %{ diff --git a/test/tasks/instance_test.exs b/test/tasks/instance_test.exs index f6a4ba508..3b4c041d9 100644 --- a/test/tasks/instance_test.exs +++ b/test/tasks/instance_test.exs @@ -63,7 +63,7 @@ defmodule Pleroma.InstanceTest do "--uploads-dir", "test/uploads", "--static-dir", - "instance/static/" + "./test/../test/instance/static/" ]) end @@ -83,6 +83,7 @@ defmodule Pleroma.InstanceTest do assert generated_config =~ "configurable_from_database: true" assert generated_config =~ "http: [ip: {127, 0, 0, 1}, port: 4000]" assert File.read!(tmp_path() <> "setup.psql") == generated_setup_psql() + assert File.exists?(Path.expand("./test/instance/static/robots.txt")) end defp generated_setup_psql do diff --git a/test/tasks/refresh_counter_cache_test.exs b/test/tasks/refresh_counter_cache_test.exs index 851971a77..6a1a9ac17 100644 --- a/test/tasks/refresh_counter_cache_test.exs +++ b/test/tasks/refresh_counter_cache_test.exs @@ -37,7 +37,7 @@ defmodule Mix.Tasks.Pleroma.RefreshCounterCacheTest do assert capture_io(fn -> Mix.Tasks.Pleroma.RefreshCounterCache.run([]) end) =~ "Done\n" - assert %{direct: 3, private: 4, public: 1, unlisted: 2} = + assert %{"direct" => 3, "private" => 4, "public" => 1, "unlisted" => 2} = Pleroma.Stats.get_status_visibility_count() end end diff --git a/test/tasks/relay_test.exs b/test/tasks/relay_test.exs index d3d88467d..a8ba0658d 100644 --- a/test/tasks/relay_test.exs +++ b/test/tasks/relay_test.exs @@ -62,10 +62,11 @@ defmodule Mix.Tasks.Pleroma.RelayTest do [undo_activity] = ActivityPub.fetch_activities([], %{ - "type" => "Undo", - "actor_id" => follower_id, - "limit" => 1, - "skip_preload" => true + type: "Undo", + actor_id: follower_id, + limit: 1, + skip_preload: true, + invisible_actors: true }) assert undo_activity.data["type"] == "Undo" diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index 4aa873f0b..9220d23fc 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -4,6 +4,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do alias Pleroma.Activity + alias Pleroma.MFA alias Pleroma.Object alias Pleroma.Repo alias Pleroma.Tests.ObanHelpers @@ -91,6 +92,7 @@ defmodule Mix.Tasks.Pleroma.UserTest do describe "running rm" do test "user is deleted" do + clear_config([:instance, :federating], true) user = insert(:user) with_mock Pleroma.Web.Federator, @@ -108,8 +110,10 @@ defmodule Mix.Tasks.Pleroma.UserTest do test "a remote user's create activity is deleted when the object has been pruned" do user = insert(:user) - {:ok, post} = CommonAPI.post(user, %{status: "uguu"}) + + clear_config([:instance, :federating], true) + object = Object.normalize(post) Object.prune(object) @@ -169,31 +173,31 @@ defmodule Mix.Tasks.Pleroma.UserTest do end end - describe "running unsubscribe" do + describe "running deactivate" do test "user is unsubscribed" do followed = insert(:user) + remote_followed = insert(:user, local: false) user = insert(:user) + User.follow(user, followed, :follow_accept) + User.follow(user, remote_followed, :follow_accept) - Mix.Tasks.Pleroma.User.run(["unsubscribe", user.nickname]) + Mix.Tasks.Pleroma.User.run(["deactivate", user.nickname]) assert_received {:mix_shell, :info, [message]} assert message =~ "Deactivating" - assert_received {:mix_shell, :info, [message]} - assert message =~ "Unsubscribing" - # Note that the task has delay :timer.sleep(500) assert_received {:mix_shell, :info, [message]} assert message =~ "Successfully unsubscribed" user = User.get_cached_by_nickname(user.nickname) - assert Enum.empty?(User.get_friends(user)) + assert Enum.empty?(Enum.filter(User.get_friends(user), & &1.local)) assert user.deactivated end - test "no user to unsubscribe" do - Mix.Tasks.Pleroma.User.run(["unsubscribe", "nonexistent"]) + test "no user to deactivate" do + Mix.Tasks.Pleroma.User.run(["deactivate", "nonexistent"]) assert_received {:mix_shell, :error, [message]} assert message =~ "No user" @@ -275,6 +279,35 @@ defmodule Mix.Tasks.Pleroma.UserTest do end end + describe "running reset_mfa" do + test "disables MFA" do + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: "xx", confirmed: true} + } + ) + + Mix.Tasks.Pleroma.User.run(["reset_mfa", user.nickname]) + + assert_received {:mix_shell, :info, [message]} + assert message == "Multi-Factor Authentication disabled for #{user.nickname}" + + assert %{enabled: false, totp: false} == + user.nickname + |> User.get_cached_by_nickname() + |> MFA.mfa_settings() + end + + test "no user to reset MFA" do + Mix.Tasks.Pleroma.User.run(["reset_password", "nonexistent"]) + + assert_received {:mix_shell, :error, [message]} + assert message =~ "No local user" + end + end + describe "running invite" do test "invite token is generated" do assert capture_io(fn -> diff --git a/test/upload/filter/mogrify_test.exs b/test/upload/filter/mogrify_test.exs index b6a463e8c..62ca30487 100644 --- a/test/upload/filter/mogrify_test.exs +++ b/test/upload/filter/mogrify_test.exs @@ -6,21 +6,17 @@ defmodule Pleroma.Upload.Filter.MogrifyTest do use Pleroma.DataCase import Mock - alias Pleroma.Config - alias Pleroma.Upload alias Pleroma.Upload.Filter - setup do: clear_config([Filter.Mogrify, :args]) - test "apply mogrify filter" do - Config.put([Filter.Mogrify, :args], [{"tint", "40"}]) + clear_config(Filter.Mogrify, args: [{"tint", "40"}]) File.cp!( "test/fixtures/image.jpg", "test/fixtures/image_tmp.jpg" ) - upload = %Upload{ + upload = %Pleroma.Upload{ name: "an… image.jpg", content_type: "image/jpg", path: Path.absname("test/fixtures/image_tmp.jpg"), diff --git a/test/upload_test.exs b/test/upload_test.exs index 060a940bb..2abf0edec 100644 --- a/test/upload_test.exs +++ b/test/upload_test.exs @@ -54,6 +54,7 @@ defmodule Pleroma.UploadTest do %{ "name" => "image.jpg", "type" => "Document", + "mediaType" => "image/jpeg", "url" => [ %{ "href" => "http://localhost:4001/media/post-process-file.jpg", diff --git a/test/user_test.exs b/test/user_test.exs index 863e0106c..7126bb539 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -199,6 +199,16 @@ defmodule Pleroma.UserTest do assert [^pending_follower] = User.get_follow_requests(locked) end + test "doesn't return follow requests for deactivated accounts" do + locked = insert(:user, locked: true) + pending_follower = insert(:user, %{deactivated: true}) + + CommonAPI.follow(pending_follower, locked) + + assert true == pending_follower.deactivated + assert [] = User.get_follow_requests(locked) + end + test "clears follow requests when requester is blocked" do followed = insert(:user, locked: true) follower = insert(:user) @@ -586,6 +596,51 @@ defmodule Pleroma.UserTest do refute user.last_refreshed_at == orig_user.last_refreshed_at end + + test "if nicknames clash, the old user gets a prefix with the old id to the nickname" do + a_week_ago = NaiveDateTime.add(NaiveDateTime.utc_now(), -604_800) + + orig_user = + insert( + :user, + local: false, + nickname: "admin@mastodon.example.org", + ap_id: "http://mastodon.example.org/users/harinezumigari", + 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") + + assert user.inbox + + refute user.id == orig_user.id + + orig_user = User.get_by_id(orig_user.id) + + assert orig_user.nickname == "#{orig_user.id}.admin@mastodon.example.org" + end + + @tag capture_log: true + test "it returns the old user if stale, but unfetchable" do + a_week_ago = NaiveDateTime.add(NaiveDateTime.utc_now(), -604_800) + + orig_user = + insert( + :user, + local: false, + nickname: "admin@mastodon.example.org", + ap_id: "http://mastodon.example.org/users/raymoo", + 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/raymoo") + + assert user.last_refreshed_at == orig_user.last_refreshed_at + end end test "returns an ap_id for a user" do @@ -992,7 +1047,7 @@ defmodule Pleroma.UserTest do user = insert(:user, local: true) {:ok, activity} = CommonAPI.post(actor, %{status: "hello"}) - {:ok, announce, _} = CommonAPI.repeat(activity.id, user) + {:ok, announce} = CommonAPI.repeat(activity.id, user) recipients = User.get_recipients_from_activity(announce) @@ -1102,7 +1157,7 @@ defmodule Pleroma.UserTest do assert [%{activity | thread_muted?: CommonAPI.thread_muted?(user2, activity)}] == ActivityPub.fetch_activities([user2.ap_id | User.following(user2)], %{ - "user" => user2 + user: user2 }) {:ok, _user} = User.deactivate(user) @@ -1112,7 +1167,7 @@ defmodule Pleroma.UserTest do assert [] == ActivityPub.fetch_activities([user2.ap_id | User.following(user2)], %{ - "user" => user2 + user: user2 }) end end @@ -1139,6 +1194,9 @@ defmodule Pleroma.UserTest do follower = insert(:user) {:ok, follower} = User.follow(follower, user) + locked_user = insert(:user, name: "locked", locked: true) + {:ok, _} = User.follow(user, locked_user, :follow_pending) + object = insert(:note, user: user) activity = insert(:note_activity, user: user, note: object) @@ -1147,7 +1205,7 @@ defmodule Pleroma.UserTest do {:ok, like} = CommonAPI.favorite(user, activity_two.id) {:ok, like_two} = CommonAPI.favorite(follower, activity.id) - {:ok, repeat, _} = CommonAPI.repeat(activity_two.id, user) + {:ok, repeat} = CommonAPI.repeat(activity_two.id, user) {:ok, job} = User.delete(user) {:ok, _user} = ObanHelpers.perform(job) @@ -1157,6 +1215,8 @@ defmodule Pleroma.UserTest do refute User.following?(follower, user) assert %{deactivated: true} = User.get_by_id(user.id) + assert [] == User.get_follow_requests(locked_user) + user_activities = user.ap_id |> Activity.Queries.by_actor() @@ -1317,11 +1377,11 @@ defmodule Pleroma.UserTest do end end - describe "visible_for?/2" do + describe "visible_for/2" do test "returns true when the account is itself" do user = insert(:user, local: true) - assert User.visible_for?(user, user) + assert User.visible_for(user, user) == :visible end test "returns false when the account is unauthenticated and auth is required" do @@ -1330,14 +1390,14 @@ defmodule Pleroma.UserTest do user = insert(:user, local: true, confirmation_pending: true) other_user = insert(:user, local: true) - refute User.visible_for?(user, other_user) + refute User.visible_for(user, other_user) == :visible end test "returns true when the account is unauthenticated and auth is not required" do user = insert(:user, local: true, confirmation_pending: true) other_user = insert(:user, local: true) - assert User.visible_for?(user, other_user) + assert User.visible_for(user, other_user) == :visible end test "returns true when the account is unauthenticated and being viewed by a privileged account (auth required)" do @@ -1346,7 +1406,7 @@ defmodule Pleroma.UserTest do 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) == :visible end end @@ -1777,4 +1837,16 @@ defmodule Pleroma.UserTest do assert result.email_notifications["digest"] == false end end + + test "avatar fallback" do + user = insert(:user) + assert User.avatar_url(user) =~ "/images/avi.png" + + clear_config([:assets, :default_user_avatar], "avatar.png") + + user = User.get_cached_by_nickname_or_id(user.nickname) + assert User.avatar_url(user) =~ "avatar.png" + + assert User.avatar_url(user, no_default: true) == nil + end end diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index c432c90e3..e722f7c04 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do use Pleroma.Web.ConnCase use Oban.Testing, repo: Pleroma.Repo - import Pleroma.Factory alias Pleroma.Activity alias Pleroma.Config alias Pleroma.Delivery @@ -14,13 +13,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do alias Pleroma.Object alias Pleroma.Tests.ObanHelpers alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.ObjectView alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.UserView alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI + alias Pleroma.Web.Endpoint alias Pleroma.Workers.ReceiverWorker + import Pleroma.Factory + + require Pleroma.Constants + setup_all do Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) :ok @@ -168,6 +173,60 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do end end + describe "mastodon compatibility routes" do + test "it returns a json representation of the object with accept application/json", %{ + conn: conn + } do + {:ok, object} = + %{ + "type" => "Note", + "content" => "hey", + "id" => Endpoint.url() <> "/users/raymoo/statuses/999999999", + "actor" => Endpoint.url() <> "/users/raymoo", + "to" => [Pleroma.Constants.as_public()] + } + |> Object.create() + + conn = + conn + |> put_req_header("accept", "application/json") + |> get("/users/raymoo/statuses/999999999") + + assert json_response(conn, 200) == ObjectView.render("object.json", %{object: object}) + end + + test "it returns a json representation of the activity with accept application/json", %{ + conn: conn + } do + {:ok, object} = + %{ + "type" => "Note", + "content" => "hey", + "id" => Endpoint.url() <> "/users/raymoo/statuses/999999999", + "actor" => Endpoint.url() <> "/users/raymoo", + "to" => [Pleroma.Constants.as_public()] + } + |> Object.create() + + {:ok, activity, _} = + %{ + "id" => object.data["id"] <> "/activity", + "type" => "Create", + "object" => object.data["id"], + "actor" => object.data["actor"], + "to" => object.data["to"] + } + |> ActivityPub.persist(local: true) + + conn = + conn + |> put_req_header("accept", "application/json") + |> get("/users/raymoo/statuses/999999999/activity") + + assert json_response(conn, 200) == ObjectView.render("object.json", %{object: activity}) + end + end + describe "/objects/:uuid" do test "it returns a json representation of the object with accept application/json", %{ conn: conn @@ -392,6 +451,36 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do assert Activity.get_by_ap_id(data["id"]) end + @tag capture_log: true + test "it inserts an incoming activity into the database" <> + "even if we can't fetch the user but have it in our db", + %{conn: conn} do + user = + insert(:user, + ap_id: "https://mastodon.example.org/users/raymoo", + ap_enabled: true, + local: false, + last_refreshed_at: nil + ) + + data = + File.read!("test/fixtures/mastodon-post-activity.json") + |> Poison.decode!() + |> Map.put("actor", user.ap_id) + |> put_in(["object", "attridbutedTo"], user.ap_id) + + conn = + conn + |> assign(:valid_signature, true) + |> put_req_header("content-type", "application/activity+json") + |> post("/inbox", data) + + assert "ok" == json_response(conn, 200) + + ObanHelpers.perform(all_enqueued(worker: ReceiverWorker)) + assert Activity.get_by_ap_id(data["id"]) + end + test "it clears `unreachable` federation status of the sender", %{conn: conn} do data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!() @@ -447,6 +536,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do assert_receive {:mix_shell, :info, ["relay.mastodon.host"]} end + @tag capture_log: true test "without valid signature, " <> "it only accepts Create activities and requires enabled federation", %{conn: conn} do @@ -559,11 +649,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do test "it accepts announces with to as string instead of array", %{conn: conn} do user = insert(:user) + {:ok, post} = CommonAPI.post(user, %{status: "hey"}) + announcer = insert(:user, local: false) + data = %{ "@context" => "https://www.w3.org/ns/activitystreams", - "actor" => "http://mastodon.example.org/users/admin", - "id" => "http://mastodon.example.org/users/admin/statuses/19512778738411822/activity", - "object" => "https://mastodon.social/users/emelie/statuses/101849165031453009", + "actor" => announcer.ap_id, + "id" => "#{announcer.ap_id}/statuses/19512778738411822/activity", + "object" => post.data["object"], "to" => "https://www.w3.org/ns/activitystreams#Public", "cc" => [user.ap_id], "type" => "Announce" @@ -715,17 +808,63 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do end describe "GET /users/:nickname/outbox" do + test "it paginates correctly", %{conn: conn} do + user = insert(:user) + conn = assign(conn, :user, user) + outbox_endpoint = user.ap_id <> "/outbox" + + _posts = + for i <- 0..25 do + {:ok, activity} = CommonAPI.post(user, %{status: "post #{i}"}) + activity + end + + result = + conn + |> put_req_header("accept", "application/activity+json") + |> get(outbox_endpoint <> "?page=true") + |> json_response(200) + + result_ids = Enum.map(result["orderedItems"], fn x -> x["id"] end) + assert length(result["orderedItems"]) == 20 + assert length(result_ids) == 20 + assert result["next"] + assert String.starts_with?(result["next"], outbox_endpoint) + + result_next = + conn + |> put_req_header("accept", "application/activity+json") + |> get(result["next"]) + |> json_response(200) + + result_next_ids = Enum.map(result_next["orderedItems"], fn x -> x["id"] end) + assert length(result_next["orderedItems"]) == 6 + assert length(result_next_ids) == 6 + refute Enum.find(result_next_ids, fn x -> x in result_ids end) + refute Enum.find(result_ids, fn x -> x in result_next_ids end) + assert String.starts_with?(result["id"], outbox_endpoint) + + result_next_again = + conn + |> put_req_header("accept", "application/activity+json") + |> get(result_next["id"]) + |> json_response(200) + + assert result_next == result_next_again + end + test "it returns 200 even if there're no activities", %{conn: conn} do user = insert(:user) + outbox_endpoint = user.ap_id <> "/outbox" conn = conn |> assign(:user, user) |> put_req_header("accept", "application/activity+json") - |> get("/users/#{user.nickname}/outbox") + |> get(outbox_endpoint) result = json_response(conn, 200) - assert user.ap_id <> "/outbox" == result["id"] + assert outbox_endpoint == result["id"] end test "it returns a note activity in a collection", %{conn: conn} do diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 77bd07edf..575e0c5db 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -82,30 +82,28 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, private_activity} = CommonAPI.post(user, %{status: ".", visibility: "private"}) - activities = - ActivityPub.fetch_activities([], %{:visibility => "direct", "actor_id" => user.ap_id}) + activities = ActivityPub.fetch_activities([], %{visibility: "direct", actor_id: user.ap_id}) assert activities == [direct_activity] activities = - ActivityPub.fetch_activities([], %{:visibility => "unlisted", "actor_id" => user.ap_id}) + ActivityPub.fetch_activities([], %{visibility: "unlisted", actor_id: user.ap_id}) assert activities == [unlisted_activity] activities = - ActivityPub.fetch_activities([], %{:visibility => "private", "actor_id" => user.ap_id}) + ActivityPub.fetch_activities([], %{visibility: "private", actor_id: user.ap_id}) assert activities == [private_activity] - activities = - ActivityPub.fetch_activities([], %{:visibility => "public", "actor_id" => user.ap_id}) + activities = ActivityPub.fetch_activities([], %{visibility: "public", actor_id: user.ap_id}) assert activities == [public_activity] activities = ActivityPub.fetch_activities([], %{ - :visibility => ~w[private public], - "actor_id" => user.ap_id + visibility: ~w[private public], + actor_id: user.ap_id }) assert activities == [public_activity, private_activity] @@ -126,8 +124,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do activities = ActivityPub.fetch_activities([], %{ - "exclude_visibilities" => "direct", - "actor_id" => user.ap_id + exclude_visibilities: "direct", + actor_id: user.ap_id }) assert public_activity in activities @@ -137,8 +135,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do activities = ActivityPub.fetch_activities([], %{ - "exclude_visibilities" => "unlisted", - "actor_id" => user.ap_id + exclude_visibilities: "unlisted", + actor_id: user.ap_id }) assert public_activity in activities @@ -148,8 +146,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do activities = ActivityPub.fetch_activities([], %{ - "exclude_visibilities" => "private", - "actor_id" => user.ap_id + exclude_visibilities: "private", + actor_id: user.ap_id }) assert public_activity in activities @@ -159,8 +157,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do activities = ActivityPub.fetch_activities([], %{ - "exclude_visibilities" => "public", - "actor_id" => user.ap_id + exclude_visibilities: "public", + actor_id: user.ap_id }) refute public_activity in activities @@ -193,23 +191,22 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, status_two} = CommonAPI.post(user, %{status: ". #essais"}) {:ok, status_three} = CommonAPI.post(user, %{status: ". #test #reject"}) - fetch_one = ActivityPub.fetch_activities([], %{"type" => "Create", "tag" => "test"}) + fetch_one = ActivityPub.fetch_activities([], %{type: "Create", tag: "test"}) - fetch_two = - ActivityPub.fetch_activities([], %{"type" => "Create", "tag" => ["test", "essais"]}) + fetch_two = ActivityPub.fetch_activities([], %{type: "Create", tag: ["test", "essais"]}) fetch_three = ActivityPub.fetch_activities([], %{ - "type" => "Create", - "tag" => ["test", "essais"], - "tag_reject" => ["reject"] + type: "Create", + tag: ["test", "essais"], + tag_reject: ["reject"] }) fetch_four = ActivityPub.fetch_activities([], %{ - "type" => "Create", - "tag" => ["test"], - "tag_all" => ["test", "reject"] + type: "Create", + tag: ["test"], + tag_all: ["test", "reject"] }) assert fetch_one == [status_one, status_three] @@ -375,7 +372,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do _listen_activity_2 = insert(:listen) _listen_activity_3 = insert(:listen) - timeline = ActivityPub.fetch_activities([], %{"type" => ["Listen"]}) + timeline = ActivityPub.fetch_activities([], %{type: ["Listen"]}) assert length(timeline) == 3 end @@ -507,7 +504,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, _user_relationship} = User.block(user, %{ap_id: activity_five.data["actor"]}) - activities = ActivityPub.fetch_activities_for_context("2hu", %{"blocking_user" => user}) + activities = ActivityPub.fetch_activities_for_context("2hu", %{blocking_user: user}) assert activities == [activity_two, activity] end end @@ -520,8 +517,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do booster = insert(:user) {:ok, _user_relationship} = User.block(user, %{ap_id: activity_one.data["actor"]}) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: user, skip_preload: true}) assert Enum.member?(activities, activity_two) assert Enum.member?(activities, activity_three) @@ -529,28 +525,25 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, _user_block} = User.unblock(user, %{ap_id: activity_one.data["actor"]}) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: user, skip_preload: true}) assert Enum.member?(activities, activity_two) assert Enum.member?(activities, activity_three) assert Enum.member?(activities, activity_one) {:ok, _user_relationship} = User.block(user, %{ap_id: activity_three.data["actor"]}) - {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(activity_three.id, booster) + {:ok, %{data: %{"object" => id}}} = CommonAPI.repeat(activity_three.id, booster) %Activity{} = boost_activity = Activity.get_create_by_object_ap_id(id) activity_three = Activity.get_by_id(activity_three.id) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: user, skip_preload: true}) assert Enum.member?(activities, activity_two) refute Enum.member?(activities, activity_three) refute Enum.member?(activities, boost_activity) assert Enum.member?(activities, activity_one) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => nil, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: nil, skip_preload: true}) assert Enum.member?(activities, activity_two) assert Enum.member?(activities, activity_three) @@ -573,7 +566,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, activity_four} = CommonAPI.post(blockee, %{status: "hey! @#{blocker.nickname}"}) - activities = ActivityPub.fetch_activities([], %{"blocking_user" => blocker}) + activities = ActivityPub.fetch_activities([], %{blocking_user: blocker}) assert Enum.member?(activities, activity_one) refute Enum.member?(activities, activity_two) @@ -581,7 +574,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do refute Enum.member?(activities, activity_four) end - test "doesn't return announce activities concerning blocked users" do + test "doesn't return announce activities with blocked users in 'to'" do blocker = insert(:user) blockee = insert(:user) friend = insert(:user) @@ -592,10 +585,43 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, activity_two} = CommonAPI.post(blockee, %{status: "hey! @#{friend.nickname}"}) - {:ok, activity_three, _} = CommonAPI.repeat(activity_two.id, friend) + {:ok, activity_three} = CommonAPI.repeat(activity_two.id, friend) activities = - ActivityPub.fetch_activities([], %{"blocking_user" => blocker}) + ActivityPub.fetch_activities([], %{blocking_user: blocker}) + |> Enum.map(fn act -> act.id end) + + assert Enum.member?(activities, activity_one.id) + refute Enum.member?(activities, activity_two.id) + refute Enum.member?(activities, activity_three.id) + end + + test "doesn't return announce activities with blocked users in 'cc'" do + blocker = insert(:user) + blockee = insert(:user) + friend = insert(:user) + + {:ok, _user_relationship} = User.block(blocker, blockee) + + {:ok, activity_one} = CommonAPI.post(friend, %{status: "hey!"}) + + {:ok, activity_two} = CommonAPI.post(blockee, %{status: "hey! @#{friend.nickname}"}) + + assert object = Pleroma.Object.normalize(activity_two) + + data = %{ + "actor" => friend.ap_id, + "object" => object.data["id"], + "context" => object.data["context"], + "type" => "Announce", + "to" => ["https://www.w3.org/ns/activitystreams#Public"], + "cc" => [blockee.ap_id] + } + + assert {:ok, activity_three} = ActivityPub.insert(data) + + activities = + ActivityPub.fetch_activities([], %{blocking_user: blocker}) |> Enum.map(fn act -> act.id end) assert Enum.member?(activities, activity_one.id) @@ -611,17 +637,15 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do user = insert(:user) {:ok, user} = User.block_domain(user, domain) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: user, skip_preload: true}) refute activity in activities followed_user = insert(:user) ActivityPub.follow(user, followed_user) - {:ok, repeat_activity, _} = CommonAPI.repeat(activity.id, followed_user) + {:ok, repeat_activity} = CommonAPI.repeat(activity.id, followed_user) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: user, skip_preload: true}) refute repeat_activity in activities end @@ -641,8 +665,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do note = insert(:note, %{data: %{"actor" => domain_user.ap_id}}) activity = insert(:note_activity, %{note: note}) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => blocker, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: blocker, skip_preload: true}) assert activity in activities @@ -651,10 +674,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do another_user = insert(:user, %{ap_id: "https://#{domain}/@meanie2"}) bad_note = insert(:note, %{data: %{"actor" => another_user.ap_id}}) bad_activity = insert(:note_activity, %{note: bad_note}) - {:ok, repeat_activity, _} = CommonAPI.repeat(bad_activity.id, domain_user) + {:ok, repeat_activity} = CommonAPI.repeat(bad_activity.id, domain_user) - activities = - ActivityPub.fetch_activities([], %{"blocking_user" => blocker, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{blocking_user: blocker, skip_preload: true}) refute repeat_activity in activities end @@ -669,8 +691,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do activity_one_actor = User.get_by_ap_id(activity_one.data["actor"]) {:ok, _user_relationships} = User.mute(user, activity_one_actor) - activities = - ActivityPub.fetch_activities([], %{"muting_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{muting_user: user, skip_preload: true}) assert Enum.member?(activities, activity_two) assert Enum.member?(activities, activity_three) @@ -679,9 +700,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do # Calling with 'with_muted' will deliver muted activities, too. activities = ActivityPub.fetch_activities([], %{ - "muting_user" => user, - "with_muted" => true, - "skip_preload" => true + muting_user: user, + with_muted: true, + skip_preload: true }) assert Enum.member?(activities, activity_two) @@ -690,8 +711,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, _user_mute} = User.unmute(user, activity_one_actor) - activities = - ActivityPub.fetch_activities([], %{"muting_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{muting_user: user, skip_preload: true}) assert Enum.member?(activities, activity_two) assert Enum.member?(activities, activity_three) @@ -699,19 +719,18 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do activity_three_actor = User.get_by_ap_id(activity_three.data["actor"]) {:ok, _user_relationships} = User.mute(user, activity_three_actor) - {:ok, _announce, %{data: %{"id" => id}}} = CommonAPI.repeat(activity_three.id, booster) + {:ok, %{data: %{"object" => id}}} = CommonAPI.repeat(activity_three.id, booster) %Activity{} = boost_activity = Activity.get_create_by_object_ap_id(id) activity_three = Activity.get_by_id(activity_three.id) - activities = - ActivityPub.fetch_activities([], %{"muting_user" => user, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{muting_user: user, skip_preload: true}) assert Enum.member?(activities, activity_two) refute Enum.member?(activities, activity_three) refute Enum.member?(activities, boost_activity) assert Enum.member?(activities, activity_one) - activities = ActivityPub.fetch_activities([], %{"muting_user" => nil, "skip_preload" => true}) + activities = ActivityPub.fetch_activities([], %{muting_user: nil, skip_preload: true}) assert Enum.member?(activities, activity_two) assert Enum.member?(activities, activity_three) @@ -727,7 +746,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, _activity_two} = CommonAPI.add_mute(user, activity_two) - assert [_activity_one] = ActivityPub.fetch_activities([], %{"muting_user" => user}) + assert [_activity_one] = ActivityPub.fetch_activities([], %{muting_user: user}) end test "returns thread muted activities when with_muted is set" do @@ -739,7 +758,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, _activity_two} = CommonAPI.add_mute(user, activity_two) assert [_activity_two, _activity_one] = - ActivityPub.fetch_activities([], %{"muting_user" => user, "with_muted" => true}) + ActivityPub.fetch_activities([], %{muting_user: user, with_muted: true}) end test "does include announces on request" do @@ -749,7 +768,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, user} = User.follow(user, booster) - {:ok, announce, _object} = CommonAPI.repeat(activity_three.id, booster) + {:ok, announce} = CommonAPI.repeat(activity_three.id, booster) [announce_activity] = ActivityPub.fetch_activities([user.ap_id | User.following(user)]) @@ -761,7 +780,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, expected_activity} = ActivityBuilder.insert(%{"type" => "Create"}, %{:user => user}) {:ok, _} = ActivityBuilder.insert(%{"type" => "Announce"}, %{:user => user}) - [activity] = ActivityPub.fetch_user_activities(user, nil, %{"exclude_reblogs" => "true"}) + [activity] = ActivityPub.fetch_user_activities(user, nil, %{exclude_reblogs: true}) assert activity == expected_activity end @@ -804,7 +823,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do expected_activities = ActivityBuilder.insert_list(10) since_id = List.last(activities).id - activities = ActivityPub.fetch_public_activities(%{"since_id" => since_id}) + activities = ActivityPub.fetch_public_activities(%{since_id: since_id}) assert collect_ids(activities) == collect_ids(expected_activities) assert length(activities) == 10 @@ -819,7 +838,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do |> ActivityBuilder.insert_list() |> List.first() - activities = ActivityPub.fetch_public_activities(%{"max_id" => max_id}) + activities = ActivityPub.fetch_public_activities(%{max_id: max_id}) assert length(activities) == 20 assert collect_ids(activities) == collect_ids(expected_activities) @@ -831,8 +850,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do later_activities = ActivityBuilder.insert_list(10) - activities = - ActivityPub.fetch_public_activities(%{"page" => "2", "page_size" => "20"}, :offset) + activities = ActivityPub.fetch_public_activities(%{page: "2", page_size: "20"}, :offset) assert length(activities) == 20 @@ -846,9 +864,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do booster = insert(:user) {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, booster) - {:ok, activity, _} = CommonAPI.repeat(activity.id, booster) + {:ok, activity} = CommonAPI.repeat(activity.id, booster) - activities = ActivityPub.fetch_activities([], %{"muting_user" => user}) + activities = ActivityPub.fetch_activities([], %{muting_user: user}) refute Enum.any?(activities, fn %{id: id} -> id == activity.id end) end @@ -860,83 +878,14 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, _reblog_mute} = CommonAPI.hide_reblogs(user, booster) {:ok, _reblog_mute} = CommonAPI.show_reblogs(user, booster) - {:ok, activity, _} = CommonAPI.repeat(activity.id, booster) + {:ok, activity} = CommonAPI.repeat(activity.id, booster) - activities = ActivityPub.fetch_activities([], %{"muting_user" => user}) + activities = ActivityPub.fetch_activities([], %{muting_user: user}) assert Enum.any?(activities, fn %{id: id} -> id == activity.id end) end end - describe "announcing an object" do - test "adds an announce activity to the db" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - {:ok, announce_activity, object} = ActivityPub.announce(user, object) - assert object.data["announcement_count"] == 1 - assert object.data["announcements"] == [user.ap_id] - - assert announce_activity.data["to"] == [ - User.ap_followers(user), - note_activity.data["actor"] - ] - - assert announce_activity.data["object"] == object.data["id"] - assert announce_activity.data["actor"] == user.ap_id - assert announce_activity.data["context"] == object.data["context"] - end - - test "reverts annouce from object on error" do - note_activity = insert(:note_activity) - object = Object.normalize(note_activity) - user = insert(:user) - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.announce(user, object) - end - - reloaded_object = Object.get_by_ap_id(object.data["id"]) - assert reloaded_object == object - refute reloaded_object.data["announcement_count"] - refute reloaded_object.data["announcements"] - end - end - - describe "announcing a private object" do - test "adds an announce activity to the db if the audience is not widened" do - user = insert(:user) - {:ok, note_activity} = CommonAPI.post(user, %{status: ".", visibility: "private"}) - object = Object.normalize(note_activity) - - {:ok, announce_activity, object} = ActivityPub.announce(user, object, nil, true, false) - - assert announce_activity.data["to"] == [User.ap_followers(user)] - - assert announce_activity.data["object"] == object.data["id"] - assert announce_activity.data["actor"] == user.ap_id - assert announce_activity.data["context"] == object.data["context"] - end - - test "does not add an announce activity to the db if the audience is widened" do - user = insert(:user) - {:ok, note_activity} = CommonAPI.post(user, %{status: ".", visibility: "private"}) - object = Object.normalize(note_activity) - - assert {:error, _} = ActivityPub.announce(user, object, nil, true, true) - end - - test "does not add an announce activity to the db if the announcer is not the author" do - user = insert(:user) - announcer = insert(:user) - {:ok, note_activity} = CommonAPI.post(user, %{status: ".", visibility: "private"}) - object = Object.normalize(note_activity) - - assert {:error, _} = ActivityPub.announce(announcer, object, nil, true, false) - end - end - describe "uploading files" do test "copies the file to the configured folder" do file = %Plug.Upload{ @@ -1043,54 +992,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do end end - describe "blocking" do - test "reverts block activity on error" do - [blocker, blocked] = insert_list(2, :user) - - with_mock(Utils, [:passthrough], maybe_federate: fn _ -> {:error, :reverted} end) do - assert {:error, :reverted} = ActivityPub.block(blocker, blocked) - end - - assert Repo.aggregate(Activity, :count, :id) == 0 - assert Repo.aggregate(Object, :count, :id) == 0 - end - - test "creates a block activity" do - clear_config([:instance, :federating], true) - blocker = insert(:user) - blocked = insert(:user) - - with_mock Pleroma.Web.Federator, - publish: fn _ -> nil end do - {:ok, activity} = ActivityPub.block(blocker, blocked) - - assert activity.data["type"] == "Block" - assert activity.data["actor"] == blocker.ap_id - assert activity.data["object"] == blocked.ap_id - - assert called(Pleroma.Web.Federator.publish(activity)) - end - end - - test "works with outgoing blocks disabled, but doesn't federate" do - clear_config([:instance, :federating], true) - clear_config([:activitypub, :outgoing_blocks], false) - blocker = insert(:user) - blocked = insert(:user) - - with_mock Pleroma.Web.Federator, - publish: fn _ -> nil end do - {:ok, activity} = ActivityPub.block(blocker, blocked) - - assert activity.data["type"] == "Block" - assert activity.data["actor"] == blocker.ap_id - assert activity.data["object"] == blocked.ap_id - - refute called(Pleroma.Web.Federator.publish(:_)) - end - end - end - describe "timeline post-processing" do test "it filters broken threads" do user1 = insert(:user) @@ -1135,7 +1036,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert length(activities) == 3 activities = - ActivityPub.fetch_activities([user1.ap_id | User.following(user1)], %{"user" => user1}) + ActivityPub.fetch_activities([user1.ap_id | User.following(user1)], %{user: user1}) |> Enum.map(fn a -> a.id end) assert [public_activity.id, private_activity_1.id] == activities @@ -1143,52 +1044,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do end end - describe "update" do - setup do: clear_config([:instance, :max_pinned_statuses]) - - test "it creates an update activity with the new user data" do - user = insert(:user) - {:ok, user} = User.ensure_keys_present(user) - user_data = Pleroma.Web.ActivityPub.UserView.render("user.json", %{user: user}) - - {:ok, update} = - ActivityPub.update(%{ - actor: user_data["id"], - to: [user.follower_address], - cc: [], - object: user_data - }) - - assert update.data["actor"] == user.ap_id - assert update.data["to"] == [user.follower_address] - assert embedded_object = update.data["object"] - assert embedded_object["id"] == user_data["id"] - assert embedded_object["type"] == user_data["type"] - end - end - - test "returned pinned statuses" do - Config.put([:instance, :max_pinned_statuses], 3) - user = insert(:user) - - {:ok, activity_one} = CommonAPI.post(user, %{status: "HI!!!"}) - {:ok, activity_two} = CommonAPI.post(user, %{status: "HI!!!"}) - {:ok, activity_three} = CommonAPI.post(user, %{status: "HI!!!"}) - - CommonAPI.pin(activity_one.id, user) - user = refresh_record(user) - - CommonAPI.pin(activity_two.id, user) - user = refresh_record(user) - - CommonAPI.pin(activity_three.id, user) - user = refresh_record(user) - - activities = ActivityPub.fetch_user_activities(user, nil, %{"pinned" => "true"}) - - assert 3 = length(activities) - end - describe "flag/1" do setup do reporter = insert(:user) @@ -1295,7 +1150,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do activity = Repo.preload(activity, :bookmark) activity = %Activity{activity | thread_muted?: !!activity.thread_muted?} - assert ActivityPub.fetch_activities([], %{"user" => user}) == [activity] + assert ActivityPub.fetch_activities([], %{user: user}) == [activity] end def data_uri do @@ -1469,7 +1324,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert Enum.map(result, & &1.id) == [a1.id, a5.id, a3.id, a4.id] - result = ActivityPub.fetch_favourites(user, %{"limit" => 2}) + result = ActivityPub.fetch_favourites(user, %{limit: 2}) assert Enum.map(result, & &1.id) == [a1.id, a5.id] end end @@ -1539,7 +1394,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do {:ok, _reply} = CommonAPI.post(user, %{status: "yeah", in_reply_to_status_id: activity.id}) - [result] = ActivityPub.fetch_public_activities(%{"exclude_replies" => "true"}) + [result] = ActivityPub.fetch_public_activities(%{exclude_replies: true}) assert result.id == activity.id @@ -1552,11 +1407,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do test "public timeline", %{users: %{u1: user}} do activities_ids = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", false) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:local_only, false) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:reply_filtering_user, user) |> ActivityPub.fetch_public_activities() |> Enum.map(& &1.id) @@ -1573,12 +1428,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do } do activities_ids = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", false) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("reply_visibility", "following") - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:local_only, false) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:reply_visibility, "following") + |> Map.put(:reply_filtering_user, user) |> ActivityPub.fetch_public_activities() |> Enum.map(& &1.id) @@ -1600,12 +1455,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do } do activities_ids = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", false) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("reply_visibility", "self") - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:local_only, false) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:reply_visibility, "self") + |> Map.put(:reply_filtering_user, user) |> ActivityPub.fetch_public_activities() |> Enum.map(& &1.id) @@ -1624,11 +1479,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do } do params = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + |> Map.put(:reply_filtering_user, user) activities_ids = ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) @@ -1662,12 +1517,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do } do params = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - |> Map.put("reply_visibility", "following") - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + |> Map.put(:reply_visibility, "following") + |> Map.put(:reply_filtering_user, user) activities_ids = ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) @@ -1701,12 +1556,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do } do params = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - |> Map.put("reply_visibility", "self") - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + |> Map.put(:reply_visibility, "self") + |> Map.put(:reply_filtering_user, user) activities_ids = ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) @@ -1727,6 +1582,40 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do assert Enum.all?(visible_ids, &(&1 in activities_ids)) end + + test "filtering out announces where the user is the actor of the announced message" do + user = insert(:user) + other_user = insert(:user) + third_user = insert(:user) + User.follow(user, other_user) + + {:ok, post} = CommonAPI.post(user, %{status: "yo"}) + {:ok, other_post} = CommonAPI.post(third_user, %{status: "yo"}) + {:ok, _announce} = CommonAPI.repeat(post.id, other_user) + {:ok, _announce} = CommonAPI.repeat(post.id, third_user) + {:ok, announce} = CommonAPI.repeat(other_post.id, other_user) + + params = %{ + type: ["Announce"] + } + + results = + [user.ap_id | User.following(user)] + |> ActivityPub.fetch_activities(params) + + assert length(results) == 3 + + params = %{ + type: ["Announce"], + announce_filtering_user: user + } + + [result] = + [user.ap_id | User.following(user)] + |> ActivityPub.fetch_activities(params) + + assert result.id == announce.id + end end describe "replies filtering with private messages" do @@ -1735,11 +1624,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do test "public timeline", %{users: %{u1: user}} do activities_ids = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", false) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:local_only, false) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) |> ActivityPub.fetch_public_activities() |> Enum.map(& &1.id) @@ -1749,13 +1638,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do test "public timeline with default reply_visibility `following`", %{users: %{u1: user}} do activities_ids = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", false) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("reply_visibility", "following") - |> Map.put("reply_filtering_user", user) - |> Map.put("user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:local_only, false) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:reply_visibility, "following") + |> Map.put(:reply_filtering_user, user) + |> Map.put(:user, user) |> ActivityPub.fetch_public_activities() |> Enum.map(& &1.id) @@ -1765,13 +1654,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do test "public timeline with default reply_visibility `self`", %{users: %{u1: user}} do activities_ids = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("local_only", false) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("reply_visibility", "self") - |> Map.put("reply_filtering_user", user) - |> Map.put("user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:local_only, false) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:reply_visibility, "self") + |> Map.put(:reply_filtering_user, user) + |> Map.put(:user, user) |> ActivityPub.fetch_public_activities() |> Enum.map(& &1.id) @@ -1781,10 +1670,10 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do test "home timeline", %{users: %{u1: user}} do params = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) activities_ids = ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) @@ -1796,12 +1685,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do test "home timeline with default reply_visibility `following`", %{users: %{u1: user}} do params = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - |> Map.put("reply_visibility", "following") - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + |> Map.put(:reply_visibility, "following") + |> Map.put(:reply_filtering_user, user) activities_ids = ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) @@ -1820,12 +1709,12 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do } do params = %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) - |> Map.put("reply_visibility", "self") - |> Map.put("reply_filtering_user", user) + |> Map.put(:type, ["Create", "Announce"]) + |> Map.put(:blocking_user, user) + |> Map.put(:muting_user, user) + |> Map.put(:user, user) + |> Map.put(:reply_visibility, "self") + |> Map.put(:reply_filtering_user, user) activities_ids = ActivityPub.fetch_activities([user.ap_id | User.following(user)], params) @@ -2070,4 +1959,20 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do end) =~ "Follower/Following counter update for #{user.ap_id} failed" end end + + describe "global activity expiration" do + setup do: clear_config([:mrf, :policies]) + + test "creates an activity expiration for local Create activities" do + Pleroma.Config.put( + [:mrf, :policies], + Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy + ) + + {:ok, %{id: id_create}} = ActivityBuilder.insert(%{"type" => "Create", "context" => "3hu"}) + {:ok, _follow} = ActivityBuilder.insert(%{"type" => "Follow", "context" => "3hu"}) + + assert [%{activity_id: ^id_create}] = Pleroma.ActivityExpiration |> Repo.all() + end + end end diff --git a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs new file mode 100644 index 000000000..8babf49e7 --- /dev/null +++ b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs @@ -0,0 +1,77 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do + use ExUnit.Case, async: true + alias Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy + + @id Pleroma.Web.Endpoint.url() <> "/activities/cofe" + + test "adds `expires_at` property" do + assert {:ok, %{"type" => "Create", "expires_at" => expires_at}} = + ActivityExpirationPolicy.filter(%{ + "id" => @id, + "type" => "Create", + "object" => %{"type" => "Note"} + }) + + assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 + end + + test "keeps existing `expires_at` if it less than the config setting" do + expires_at = NaiveDateTime.utc_now() |> Timex.shift(days: 1) + + assert {:ok, %{"type" => "Create", "expires_at" => ^expires_at}} = + ActivityExpirationPolicy.filter(%{ + "id" => @id, + "type" => "Create", + "expires_at" => expires_at, + "object" => %{"type" => "Note"} + }) + end + + test "overwrites existing `expires_at` if it greater than the config setting" do + too_distant_future = NaiveDateTime.utc_now() |> Timex.shift(years: 2) + + assert {:ok, %{"type" => "Create", "expires_at" => expires_at}} = + ActivityExpirationPolicy.filter(%{ + "id" => @id, + "type" => "Create", + "expires_at" => too_distant_future, + "object" => %{"type" => "Note"} + }) + + assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 + end + + test "ignores remote activities" do + assert {:ok, activity} = + ActivityExpirationPolicy.filter(%{ + "id" => "https://example.com/123", + "type" => "Create", + "object" => %{"type" => "Note"} + }) + + refute Map.has_key?(activity, "expires_at") + end + + test "ignores non-Create/Note activities" do + assert {:ok, activity} = + ActivityExpirationPolicy.filter(%{ + "id" => "https://example.com/123", + "type" => "Follow" + }) + + refute Map.has_key?(activity, "expires_at") + + assert {:ok, activity} = + ActivityExpirationPolicy.filter(%{ + "id" => "https://example.com/123", + "type" => "Create", + "object" => %{"type" => "Cofe"} + }) + + refute Map.has_key?(activity, "expires_at") + end +end diff --git a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs index 1a13699be..6867c9853 100644 --- a/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs +++ b/test/web/activity_pub/mrf/anti_link_spam_policy_test.exs @@ -33,7 +33,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do describe "with new user" do test "it allows posts without links" do - user = insert(:user) + user = insert(:user, local: false) assert user.note_count == 0 @@ -45,7 +45,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do end test "it disallows posts with links" do - user = insert(:user) + user = insert(:user, local: false) assert user.note_count == 0 @@ -55,6 +55,18 @@ defmodule Pleroma.Web.ActivityPub.MRF.AntiLinkSpamPolicyTest do {:reject, _} = AntiLinkSpamPolicy.filter(message) end + + test "it allows posts with links for local users" do + user = insert(:user) + + assert user.note_count == 0 + + message = + @linkful_message + |> Map.put("actor", user.ap_id) + + {:ok, _message} = AntiLinkSpamPolicy.filter(message) + end end describe "with old user" do diff --git a/test/web/activity_pub/mrf/hellthread_policy_test.exs b/test/web/activity_pub/mrf/hellthread_policy_test.exs index 95ef0b168..6e9daa7f9 100644 --- a/test/web/activity_pub/mrf/hellthread_policy_test.exs +++ b/test/web/activity_pub/mrf/hellthread_policy_test.exs @@ -8,6 +8,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do import Pleroma.Web.ActivityPub.MRF.HellthreadPolicy + alias Pleroma.Web.CommonAPI + setup do user = insert(:user) @@ -20,7 +22,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do "https://instance.tld/users/user1", "https://instance.tld/users/user2", "https://instance.tld/users/user3" - ] + ], + "object" => %{ + "type" => "Note" + } } [user: user, message: message] @@ -28,6 +33,17 @@ defmodule Pleroma.Web.ActivityPub.MRF.HellthreadPolicyTest do setup do: clear_config(:mrf_hellthread) + test "doesn't die on chat messages" do + Pleroma.Config.put([:mrf_hellthread], %{delist_threshold: 2, reject_threshold: 0}) + + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post_chat_message(user, other_user, "moin") + + assert {:ok, _} = filter(activity.data) + end + describe "reject" do test "rejects the message if the recipient count is above reject_threshold", %{ message: message diff --git a/test/web/activity_pub/mrf/mrf_test.exs b/test/web/activity_pub/mrf/mrf_test.exs index c941066f2..a63b25423 100644 --- a/test/web/activity_pub/mrf/mrf_test.exs +++ b/test/web/activity_pub/mrf/mrf_test.exs @@ -60,8 +60,6 @@ defmodule Pleroma.Web.ActivityPub.MRFTest do end describe "describe/0" do - setup do: clear_config([:instance, :rewrite_policy]) - test "it works as expected with noop policy" do expected = %{ mrf_policies: ["NoOpPolicy"], @@ -72,7 +70,7 @@ defmodule Pleroma.Web.ActivityPub.MRFTest do end test "it works as expected with mock policy" do - Pleroma.Config.put([:instance, :rewrite_policy], [MRFModuleMock]) + clear_config([:mrf, :policies], [MRFModuleMock]) expected = %{ mrf_policies: ["MRFModuleMock"], diff --git a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs new file mode 100644 index 000000000..3f8222736 --- /dev/null +++ b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs @@ -0,0 +1,68 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do + use Pleroma.DataCase + + alias Pleroma.Config + alias Pleroma.Web.ActivityPub.MRF.StealEmojiPolicy + + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + :ok + end + + setup do + emoji_path = Path.join(Config.get([:instance, :static_dir]), "emoji/stolen") + File.rm_rf!(emoji_path) + File.mkdir!(emoji_path) + + Pleroma.Emoji.reload() + + on_exit(fn -> + File.rm_rf!(emoji_path) + end) + + :ok + end + + test "does nothing by default" do + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + refute "firedfox" in installed_emoji + + message = %{ + "type" => "Create", + "object" => %{ + "emoji" => [{"firedfox", "https://example.org/emoji/firedfox.png"}], + "actor" => "https://example.org/users/admin" + } + } + + assert {:ok, message} == StealEmojiPolicy.filter(message) + + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + refute "firedfox" in installed_emoji + end + + test "Steals emoji on unknown shortcode from allowed remote host" do + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + refute "firedfox" in installed_emoji + + message = %{ + "type" => "Create", + "object" => %{ + "emoji" => [{"firedfox", "https://example.org/emoji/firedfox.png"}], + "actor" => "https://example.org/users/admin" + } + } + + clear_config([:mrf_steal_emoji, :hosts], ["example.org"]) + clear_config([:mrf_steal_emoji, :size_limit], 284_468) + + assert {:ok, message} == StealEmojiPolicy.filter(message) + + installed_emoji = Pleroma.Emoji.get_all() |> Enum.map(fn {k, _} -> k end) + assert "firedfox" in installed_emoji + end +end diff --git a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs index 724bae058..ba1b69658 100644 --- a/test/web/activity_pub/mrf/user_allowlist_policy_test.exs +++ b/test/web/activity_pub/mrf/user_allowlist_policy_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.UserAllowListPolicyTest do alias Pleroma.Web.ActivityPub.MRF.UserAllowListPolicy - setup do: clear_config([:mrf_user_allowlist, :localhost]) + setup do: clear_config(:mrf_user_allowlist) test "pass filter if allow list is empty" do actor = insert(:user) @@ -17,14 +17,14 @@ defmodule Pleroma.Web.ActivityPub.MRF.UserAllowListPolicyTest do test "pass filter if allow list isn't empty and user in allow list" do actor = insert(:user) - Pleroma.Config.put([:mrf_user_allowlist, :localhost], [actor.ap_id, "test-ap-id"]) + Pleroma.Config.put([:mrf_user_allowlist], %{"localhost" => [actor.ap_id, "test-ap-id"]}) message = %{"actor" => actor.ap_id} assert UserAllowListPolicy.filter(message) == {:ok, message} end test "rejected if allow list isn't empty and user not in allow list" do actor = insert(:user) - Pleroma.Config.put([:mrf_user_allowlist, :localhost], ["test-ap-id"]) + Pleroma.Config.put([:mrf_user_allowlist], %{"localhost" => ["test-ap-id"]}) message = %{"actor" => actor.ap_id} assert UserAllowListPolicy.filter(message) == {:reject, nil} end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 96eff1c30..f38bf7e08 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -2,14 +2,264 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do use Pleroma.DataCase alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.ObjectValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI import Pleroma.Factory + describe "attachments" do + test "works with honkerific attachments" do + attachment = %{ + "mediaType" => "", + "name" => "", + "summary" => "298p3RG7j27tfsZ9RQ.jpg", + "type" => "Document", + "url" => "https://honk.tedunangst.com/d/298p3RG7j27tfsZ9RQ.jpg" + } + + assert {:ok, attachment} = + AttachmentValidator.cast_and_validate(attachment) + |> Ecto.Changeset.apply_action(:insert) + + assert attachment.mediaType == "application/octet-stream" + end + + test "it turns mastodon attachments into our attachments" do + attachment = %{ + "url" => + "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg", + "type" => "Document", + "name" => nil, + "mediaType" => "image/jpeg" + } + + {:ok, attachment} = + AttachmentValidator.cast_and_validate(attachment) + |> Ecto.Changeset.apply_action(:insert) + + assert [ + %{ + href: + "http://mastodon.example.org/system/media_attachments/files/000/000/002/original/334ce029e7bfb920.jpg", + type: "Link", + mediaType: "image/jpeg" + } + ] = attachment.url + + assert attachment.mediaType == "image/jpeg" + end + + test "it handles our own uploads" do + user = insert(:user) + + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id) + + {:ok, attachment} = + attachment.data + |> AttachmentValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) + + assert attachment.mediaType == "image/jpeg" + end + end + + describe "chat message create activities" do + test "it is invalid if the object already exists" do + user = insert(:user) + recipient = insert(:user) + {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "hey") + object = Object.normalize(activity, false) + + {:ok, create_data, _} = Builder.create(user, object.data, [recipient.ap_id]) + + {:error, cng} = ObjectValidator.validate(create_data, []) + + assert {:object, {"The object to create already exists", []}} in cng.errors + end + + test "it is invalid if the object data has a different `to` or `actor` field" do + user = insert(:user) + recipient = insert(:user) + {:ok, object_data, _} = Builder.chat_message(recipient, user.ap_id, "Hey") + + {:ok, create_data, _} = Builder.create(user, object_data, [recipient.ap_id]) + + {:error, cng} = ObjectValidator.validate(create_data, []) + + assert {:to, {"Recipients don't match with object recipients", []}} in cng.errors + assert {:actor, {"Actor doesn't match with object actor", []}} in cng.errors + end + end + + describe "chat messages" do + setup do + clear_config([:instance, :remote_limit]) + user = insert(:user) + recipient = insert(:user, local: false) + + {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey :firefox:") + + %{user: user, recipient: recipient, valid_chat_message: valid_chat_message} + end + + test "let's through some basic html", %{user: user, recipient: recipient} do + {:ok, valid_chat_message, _} = + Builder.chat_message( + user, + recipient.ap_id, + "hey example " + ) + + assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, []) + + assert object["content"] == + "hey example alert('uguu')" + end + + test "validates for a basic object we build", %{valid_chat_message: valid_chat_message} do + assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, []) + + assert Map.put(valid_chat_message, "attachment", nil) == object + end + + test "validates for a basic object with an attachment", %{ + valid_chat_message: valid_chat_message, + user: user + } do + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id) + + valid_chat_message = + valid_chat_message + |> Map.put("attachment", attachment.data) + + assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, []) + + assert object["attachment"] + end + + test "validates for a basic object with an attachment in an array", %{ + valid_chat_message: valid_chat_message, + user: user + } do + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id) + + valid_chat_message = + valid_chat_message + |> Map.put("attachment", [attachment.data]) + + assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, []) + + assert object["attachment"] + end + + test "validates for a basic object with an attachment but without content", %{ + valid_chat_message: valid_chat_message, + user: user + } do + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, attachment} = ActivityPub.upload(file, actor: user.ap_id) + + valid_chat_message = + valid_chat_message + |> Map.put("attachment", attachment.data) + |> Map.delete("content") + + assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, []) + + assert object["attachment"] + end + + test "does not validate if the message has no content", %{ + valid_chat_message: valid_chat_message + } do + contentless = + valid_chat_message + |> Map.delete("content") + + refute match?({:ok, _object, _meta}, ObjectValidator.validate(contentless, [])) + end + + test "does not validate if the message is longer than the remote_limit", %{ + valid_chat_message: valid_chat_message + } do + Pleroma.Config.put([:instance, :remote_limit], 2) + refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, [])) + end + + test "does not validate if the recipient is blocking the actor", %{ + valid_chat_message: valid_chat_message, + user: user, + recipient: recipient + } do + Pleroma.User.block(recipient, user) + refute match?({:ok, _object, _meta}, ObjectValidator.validate(valid_chat_message, [])) + end + + test "does not validate if the actor or the recipient is not in our system", %{ + valid_chat_message: valid_chat_message + } do + chat_message = + valid_chat_message + |> Map.put("actor", "https://raymoo.com/raymoo") + + {:error, _} = ObjectValidator.validate(chat_message, []) + + chat_message = + valid_chat_message + |> Map.put("to", ["https://raymoo.com/raymoo"]) + + {:error, _} = ObjectValidator.validate(chat_message, []) + end + + test "does not validate for a message with multiple recipients", %{ + valid_chat_message: valid_chat_message, + user: user, + recipient: recipient + } do + chat_message = + valid_chat_message + |> Map.put("to", [user.ap_id, recipient.ap_id]) + + assert {:error, _} = ObjectValidator.validate(chat_message, []) + end + + test "does not validate if it doesn't concern local users" do + user = insert(:user, local: false) + recipient = insert(:user, local: false) + + {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey") + assert {:error, _} = ObjectValidator.validate(valid_chat_message, []) + end + end + describe "EmojiReacts" do setup do user = insert(:user) @@ -280,4 +530,155 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do assert {:object, valid_like["object"]} in validated.changes end end + + describe "announces" do + setup do + user = insert(:user) + announcer = insert(:user) + {:ok, post_activity} = CommonAPI.post(user, %{status: "uguu"}) + + object = Object.normalize(post_activity, false) + {:ok, valid_announce, []} = Builder.announce(announcer, object) + + %{ + valid_announce: valid_announce, + user: user, + post_activity: post_activity, + announcer: announcer + } + end + + test "returns ok for a valid announce", %{valid_announce: valid_announce} do + assert {:ok, _object, _meta} = ObjectValidator.validate(valid_announce, []) + end + + test "returns an error if the object can't be found", %{valid_announce: valid_announce} do + without_object = + valid_announce + |> Map.delete("object") + + {:error, cng} = ObjectValidator.validate(without_object, []) + + assert {:object, {"can't be blank", [validation: :required]}} in cng.errors + + nonexisting_object = + valid_announce + |> Map.put("object", "https://gensokyo.2hu/objects/99999999") + + {:error, cng} = ObjectValidator.validate(nonexisting_object, []) + + assert {:object, {"can't find object", []}} in cng.errors + end + + test "returns an error if we don't have the actor", %{valid_announce: valid_announce} do + nonexisting_actor = + valid_announce + |> Map.put("actor", "https://gensokyo.2hu/users/raymoo") + + {:error, cng} = ObjectValidator.validate(nonexisting_actor, []) + + assert {:actor, {"can't find user", []}} in cng.errors + end + + test "returns an error if the actor already announced the object", %{ + valid_announce: valid_announce, + announcer: announcer, + post_activity: post_activity + } do + _announce = CommonAPI.repeat(post_activity.id, announcer) + + {:error, cng} = ObjectValidator.validate(valid_announce, []) + + assert {:actor, {"already announced this object", []}} in cng.errors + assert {:object, {"already announced by this actor", []}} in cng.errors + end + + test "returns an error if the actor can't announce the object", %{ + announcer: announcer, + user: user + } do + {:ok, post_activity} = + CommonAPI.post(user, %{status: "a secret post", visibility: "private"}) + + object = Object.normalize(post_activity, false) + + # Another user can't announce it + {:ok, announce, []} = Builder.announce(announcer, object, public: false) + + {:error, cng} = ObjectValidator.validate(announce, []) + + assert {:actor, {"can not announce this object", []}} in cng.errors + + # The actor of the object can announce it + {:ok, announce, []} = Builder.announce(user, object, public: false) + + assert {:ok, _, _} = ObjectValidator.validate(announce, []) + + # The actor of the object can not announce it publicly + {:ok, announce, []} = Builder.announce(user, object, public: true) + + {:error, cng} = ObjectValidator.validate(announce, []) + + assert {:actor, {"can not announce this object publicly", []}} in cng.errors + end + end + + describe "updates" do + setup do + user = insert(:user) + + object = %{ + "id" => user.ap_id, + "name" => "A new name", + "summary" => "A new bio" + } + + {:ok, valid_update, []} = Builder.update(user, object) + + %{user: user, valid_update: valid_update} + end + + test "validates a basic object", %{valid_update: valid_update} do + assert {:ok, _update, []} = ObjectValidator.validate(valid_update, []) + end + + test "returns an error if the object can't be updated by the actor", %{ + valid_update: valid_update + } do + other_user = insert(:user) + + update = + valid_update + |> Map.put("actor", other_user.ap_id) + + assert {:error, _cng} = ObjectValidator.validate(update, []) + end + end + + describe "blocks" do + setup do + user = insert(:user, local: false) + blocked = insert(:user) + + {:ok, valid_block, []} = Builder.block(user, blocked) + + %{user: user, valid_block: valid_block} + end + + test "validates a basic object", %{ + valid_block: valid_block + } do + assert {:ok, _block, []} = ObjectValidator.validate(valid_block, []) + end + + test "returns an error if we don't know the blocked user", %{ + valid_block: valid_block + } do + block = + valid_block + |> Map.put("object", "https://gensokyo.2hu/users/raymoo") + + assert {:error, _cng} = ObjectValidator.validate(block, []) + end + end end diff --git a/test/web/activity_pub/object_validators/types/date_time_test.exs b/test/web/activity_pub/object_validators/types/date_time_test.exs index 3e17a9497..43be8e936 100644 --- a/test/web/activity_pub/object_validators/types/date_time_test.exs +++ b/test/web/activity_pub/object_validators/types/date_time_test.exs @@ -1,5 +1,5 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTimeTest do - alias Pleroma.Web.ActivityPub.ObjectValidators.Types.DateTime + alias Pleroma.EctoType.ActivityPub.ObjectValidators.DateTime use Pleroma.DataCase test "it validates an xsd:Datetime" do diff --git a/test/web/activity_pub/object_validators/types/object_id_test.exs b/test/web/activity_pub/object_validators/types/object_id_test.exs index 834213182..e0ab76379 100644 --- a/test/web/activity_pub/object_validators/types/object_id_test.exs +++ b/test/web/activity_pub/object_validators/types/object_id_test.exs @@ -1,5 +1,9 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Pleroma.Web.ObjectValidators.Types.ObjectIDTest do - alias Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID + alias Pleroma.EctoType.ActivityPub.ObjectValidators.ObjectID use Pleroma.DataCase @uris [ diff --git a/test/web/activity_pub/object_validators/types/recipients_test.exs b/test/web/activity_pub/object_validators/types/recipients_test.exs index f278f039b..053916bdd 100644 --- a/test/web/activity_pub/object_validators/types/recipients_test.exs +++ b/test/web/activity_pub/object_validators/types/recipients_test.exs @@ -1,5 +1,5 @@ defmodule Pleroma.Web.ObjectValidators.Types.RecipientsTest do - alias Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients + alias Pleroma.EctoType.ActivityPub.ObjectValidators.Recipients use Pleroma.DataCase test "it asserts that all elements of the list are object ids" do diff --git a/test/web/activity_pub/object_validators/types/safe_text_test.exs b/test/web/activity_pub/object_validators/types/safe_text_test.exs new file mode 100644 index 000000000..9c08606f6 --- /dev/null +++ b/test/web/activity_pub/object_validators/types/safe_text_test.exs @@ -0,0 +1,30 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.SafeTextTest do + use Pleroma.DataCase + + alias Pleroma.EctoType.ActivityPub.ObjectValidators.SafeText + + test "it lets normal text go through" do + text = "hey how are you" + assert {:ok, text} == SafeText.cast(text) + end + + test "it removes html tags from text" do + text = "hey look xss " + assert {:ok, "hey look xss alert('foo')"} == SafeText.cast(text) + end + + test "it keeps basic html tags" do + text = "hey look xss " + + assert {:ok, "hey look xss alert('foo')"} == + SafeText.cast(text) + end + + test "errors for non-text" do + assert :error == SafeText.cast(1) + end +end diff --git a/test/web/activity_pub/pipeline_test.exs b/test/web/activity_pub/pipeline_test.exs index f3c437498..8deb64501 100644 --- a/test/web/activity_pub/pipeline_test.exs +++ b/test/web/activity_pub/pipeline_test.exs @@ -9,6 +9,11 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do import Pleroma.Factory describe "common_pipeline/2" do + setup do + clear_config([:instance, :federating], true) + :ok + end + test "it goes through validation, filtering, persisting, side effects and federation for local activities" do activity = insert(:note_activity) meta = [local: true] @@ -28,7 +33,10 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do { Pleroma.Web.ActivityPub.SideEffects, [], - [handle: fn o, m -> {:ok, o, m} end] + [ + handle: fn o, m -> {:ok, o, m} end, + handle_after_transaction: fn m -> m end + ] }, { Pleroma.Web.Federator, @@ -66,7 +74,46 @@ defmodule Pleroma.Web.ActivityPub.PipelineTest do { Pleroma.Web.ActivityPub.SideEffects, [], - [handle: fn o, m -> {:ok, o, m} end] + [handle: fn o, m -> {:ok, o, m} end, handle_after_transaction: fn m -> m end] + }, + { + Pleroma.Web.Federator, + [], + [] + } + ]) do + assert {:ok, ^activity, ^meta} = + Pleroma.Web.ActivityPub.Pipeline.common_pipeline(activity, meta) + + assert_called(Pleroma.Web.ActivityPub.ObjectValidator.validate(activity, meta)) + assert_called(Pleroma.Web.ActivityPub.MRF.filter(activity)) + assert_called(Pleroma.Web.ActivityPub.ActivityPub.persist(activity, meta)) + assert_called(Pleroma.Web.ActivityPub.SideEffects.handle(activity, meta)) + end + end + + test "it goes through validation, filtering, persisting, side effects without federation for local activities if federation is deactivated" do + clear_config([:instance, :federating], false) + + activity = insert(:note_activity) + meta = [local: true] + + with_mocks([ + {Pleroma.Web.ActivityPub.ObjectValidator, [], [validate: fn o, m -> {:ok, o, m} end]}, + { + Pleroma.Web.ActivityPub.MRF, + [], + [filter: fn o -> {:ok, o} end] + }, + { + Pleroma.Web.ActivityPub.ActivityPub, + [], + [persist: fn o, m -> {:ok, o, m} end] + }, + { + Pleroma.Web.ActivityPub.SideEffects, + [], + [handle: fn o, m -> {:ok, o, m} end, handle_after_transaction: fn m -> m end] }, { Pleroma.Web.Federator, diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index 9e16e39c4..b3b573c9b 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do use Pleroma.DataCase alias Pleroma.Activity - alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Relay @@ -95,21 +94,21 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do end) assert capture_log(fn -> - assert Relay.publish(activity) == {:error, nil} - end) =~ "[error] error: nil" + assert Relay.publish(activity) == {:error, false} + end) =~ "[error] error: false" end test_with_mock "returns announce activity and publish to federate", Pleroma.Web.Federator, [:passthrough], [] do - Pleroma.Config.put([:instance, :federating], true) + clear_config([:instance, :federating], true) service_actor = Relay.get_actor() note = insert(:note_activity) - assert {:ok, %Activity{} = activity, %Object{} = obj} = Relay.publish(note) + assert {:ok, %Activity{} = activity} = Relay.publish(note) assert activity.data["type"] == "Announce" assert activity.data["actor"] == service_actor.ap_id - assert activity.data["object"] == obj.data["id"] + assert activity.data["to"] == [service_actor.follower_address] assert called(Pleroma.Web.Federator.publish(activity)) end @@ -117,13 +116,12 @@ defmodule Pleroma.Web.ActivityPub.RelayTest do Pleroma.Web.Federator, [:passthrough], [] do - Pleroma.Config.put([:instance, :federating], false) + clear_config([:instance, :federating], false) service_actor = Relay.get_actor() note = insert(:note_activity) - assert {:ok, %Activity{} = activity, %Object{} = obj} = Relay.publish(note) + assert {:ok, %Activity{} = activity} = Relay.publish(note) assert activity.data["type"] == "Announce" assert activity.data["actor"] == service_actor.ap_id - assert activity.data["object"] == obj.data["id"] refute called(Pleroma.Web.Federator.publish(activity)) end end diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index a46254a05..2649b060a 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do use Pleroma.DataCase alias Pleroma.Activity + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -20,6 +22,114 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do import Pleroma.Factory import Mock + describe "handle_after_transaction" do + test "it streams out notifications and streams" do + author = insert(:user, local: true) + recipient = insert(:user, local: true) + + {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + assert [notification] = meta[:notifications] + + with_mocks([ + { + Pleroma.Web.Streamer, + [], + [ + stream: fn _, _ -> nil end + ] + }, + { + Pleroma.Web.Push, + [], + [ + send: fn _ -> nil end + ] + } + ]) do + SideEffects.handle_after_transaction(meta) + + assert called(Pleroma.Web.Streamer.stream(["user", "user:notification"], notification)) + assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], :_)) + assert called(Pleroma.Web.Push.send(notification)) + end + end + end + + describe "blocking users" do + setup do + user = insert(:user) + blocked = insert(:user) + User.follow(blocked, user) + User.follow(user, blocked) + + {:ok, block_data, []} = Builder.block(user, blocked) + {:ok, block, _meta} = ActivityPub.persist(block_data, local: true) + + %{user: user, blocked: blocked, block: block} + end + + test "it unfollows and blocks", %{user: user, blocked: blocked, block: block} do + assert User.following?(user, blocked) + assert User.following?(blocked, user) + + {:ok, _, _} = SideEffects.handle(block) + + refute User.following?(user, blocked) + refute User.following?(blocked, user) + assert User.blocks?(user, blocked) + end + + test "it blocks but does not unfollow if the relevant setting is set", %{ + user: user, + blocked: blocked, + block: block + } do + clear_config([:activitypub, :unfollow_blocked], false) + assert User.following?(user, blocked) + assert User.following?(blocked, user) + + {:ok, _, _} = SideEffects.handle(block) + + refute User.following?(user, blocked) + assert User.following?(blocked, user) + assert User.blocks?(user, blocked) + end + end + + describe "update users" do + setup do + user = insert(:user) + {:ok, update_data, []} = Builder.update(user, %{"id" => user.ap_id, "name" => "new name!"}) + {:ok, update, _meta} = ActivityPub.persist(update_data, local: true) + + %{user: user, update_data: update_data, update: update} + end + + test "it updates the user", %{user: user, update: update} do + {:ok, _, _} = SideEffects.handle(update) + user = User.get_by_id(user.id) + assert user.name == "new name!" + end + + test "it uses a given changeset to update", %{user: user, update: update} do + changeset = Ecto.Changeset.change(user, %{default_scope: "direct"}) + + assert user.default_scope == "public" + {:ok, _, _} = SideEffects.handle(update, user_update_changeset: changeset) + user = User.get_by_id(user.id) + assert user.default_scope == "direct" + end + end + describe "delete objects" do setup do user = insert(:user) @@ -172,9 +282,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do {:ok, post} = CommonAPI.post(poster, %{status: "hey"}) {:ok, like} = CommonAPI.favorite(user, post.id) {:ok, reaction} = CommonAPI.react_with_emoji(post.id, user, "👍") - {:ok, announce, _} = CommonAPI.repeat(post.id, user) - {:ok, block} = ActivityPub.block(user, poster) - User.block(user, poster) + {:ok, announce} = CommonAPI.repeat(post.id, user) + {:ok, block} = CommonAPI.block(user, poster) {:ok, undo_data, _meta} = Builder.undo(user, like) {:ok, like_undo, _meta} = ActivityPub.persist(undo_data, local: true) @@ -289,4 +398,221 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id) end end + + describe "creation of ChatMessages" do + test "notifies the recipient" do + author = insert(:user, local: false) + recipient = insert(:user, local: true) + + {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, _meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + assert Repo.get_by(Notification, user_id: recipient.id, activity_id: create_activity.id) + end + + test "it streams the created ChatMessage" do + author = insert(:user, local: true) + recipient = insert(:user, local: true) + + {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + assert [_, _] = meta[:streamables] + end + + test "it creates a Chat and MessageReferences for the local users and bumps the unread count, except for the author" do + author = insert(:user, local: true) + recipient = insert(:user, local: true) + + {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + with_mocks([ + { + Pleroma.Web.Streamer, + [], + [ + stream: fn _, _ -> nil end + ] + }, + { + Pleroma.Web.Push, + [], + [ + send: fn _ -> nil end + ] + } + ]) do + {:ok, _create_activity, meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + # The notification gets created + assert [notification] = meta[:notifications] + assert notification.activity_id == create_activity.id + + # But it is not sent out + refute called(Pleroma.Web.Streamer.stream(["user", "user:notification"], notification)) + refute called(Pleroma.Web.Push.send(notification)) + + # Same for the user chat stream + assert [{topics, _}, _] = meta[:streamables] + assert topics == ["user", "user:pleroma_chat"] + refute called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], :_)) + + chat = Chat.get(author.id, recipient.ap_id) + + [cm_ref] = MessageReference.for_chat_query(chat) |> Repo.all() + + assert cm_ref.object.data["content"] == "hey" + assert cm_ref.unread == false + + chat = Chat.get(recipient.id, author.ap_id) + + [cm_ref] = MessageReference.for_chat_query(chat) |> Repo.all() + + assert cm_ref.object.data["content"] == "hey" + assert cm_ref.unread == true + end + end + + test "it creates a Chat for the local users and bumps the unread count" do + author = insert(:user, local: false) + recipient = insert(:user, local: true) + + {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, _meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + # An object is created + assert Object.get_by_ap_id(chat_message_data["id"]) + + # The remote user won't get a chat + chat = Chat.get(author.id, recipient.ap_id) + refute chat + + # The local user will get a chat + chat = Chat.get(recipient.id, author.ap_id) + assert chat + + author = insert(:user, local: true) + recipient = insert(:user, local: true) + + {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, _meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + # Both users are local and get the chat + chat = Chat.get(author.id, recipient.ap_id) + assert chat + + chat = Chat.get(recipient.id, author.ap_id) + assert chat + end + end + + describe "announce objects" do + setup do + poster = insert(:user) + user = insert(:user) + {:ok, post} = CommonAPI.post(poster, %{status: "hey"}) + {:ok, private_post} = CommonAPI.post(poster, %{status: "hey", visibility: "private"}) + + {:ok, announce_data, _meta} = Builder.announce(user, post.object, public: true) + + {:ok, private_announce_data, _meta} = + Builder.announce(user, private_post.object, public: false) + + {:ok, relay_announce_data, _meta} = + Builder.announce(Pleroma.Web.ActivityPub.Relay.get_actor(), post.object, public: true) + + {:ok, announce, _meta} = ActivityPub.persist(announce_data, local: true) + {:ok, private_announce, _meta} = ActivityPub.persist(private_announce_data, local: true) + {:ok, relay_announce, _meta} = ActivityPub.persist(relay_announce_data, local: true) + + %{ + announce: announce, + user: user, + poster: poster, + private_announce: private_announce, + relay_announce: relay_announce + } + end + + test "adds the announce to the original object", %{announce: announce, user: user} do + {:ok, announce, _} = SideEffects.handle(announce) + object = Object.get_by_ap_id(announce.data["object"]) + assert object.data["announcement_count"] == 1 + assert user.ap_id in object.data["announcements"] + end + + test "does not add the announce to the original object if the actor is a service actor", %{ + relay_announce: announce + } do + {:ok, announce, _} = SideEffects.handle(announce) + object = Object.get_by_ap_id(announce.data["object"]) + assert object.data["announcement_count"] == nil + end + + test "creates a notification", %{announce: announce, poster: poster} do + {:ok, announce, _} = SideEffects.handle(announce) + assert Repo.get_by(Notification, user_id: poster.id, activity_id: announce.id) + end + + test "it streams out the announce", %{announce: announce} do + with_mocks([ + { + Pleroma.Web.Streamer, + [], + [ + stream: fn _, _ -> nil end + ] + }, + { + Pleroma.Web.Push, + [], + [ + send: fn _ -> nil end + ] + } + ]) do + {:ok, announce, _} = SideEffects.handle(announce) + + assert called( + Pleroma.Web.Streamer.stream(["user", "list", "public", "public:local"], announce) + ) + + assert called(Pleroma.Web.Push.send(:_)) + end + end + end end diff --git a/test/web/activity_pub/transmogrifier/announce_handling_test.exs b/test/web/activity_pub/transmogrifier/announce_handling_test.exs new file mode 100644 index 000000000..e895636b5 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/announce_handling_test.exs @@ -0,0 +1,172 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "it works for incoming honk announces" do + user = insert(:user, ap_id: "https://honktest/u/test", local: false) + other_user = insert(:user) + {:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"}) + + announce = %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "actor" => "https://honktest/u/test", + "id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx", + "object" => post.data["object"], + "published" => "2019-06-25T19:33:58Z", + "to" => "https://www.w3.org/ns/activitystreams#Public", + "type" => "Announce" + } + + {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(announce) + + object = Object.get_by_ap_id(post.data["object"]) + + assert length(object.data["announcements"]) == 1 + assert user.ap_id in object.data["announcements"] + end + + test "it works for incoming announces with actor being inlined (kroeg)" do + data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Poison.decode!() + + _user = insert(:user, local: false, ap_id: data["actor"]["id"]) + other_user = insert(:user) + + {:ok, post} = CommonAPI.post(other_user, %{status: "kroegeroeg"}) + + data = + data + |> put_in(["object", "id"], post.data["object"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "https://puckipedia.com/" + end + + test "it works for incoming announces, fetching the announced object" do + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", "http://mastodon.example.org/users/admin/statuses/99541947525187367") + + Tesla.Mock.mock(fn + %{method: :get} -> + %Tesla.Env{status: 200, body: File.read!("test/fixtures/mastodon-note-object.json")} + end) + + _user = insert(:user, local: false, ap_id: data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Announce" + + assert data["id"] == + "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" + + assert data["object"] == + "http://mastodon.example.org/users/admin/statuses/99541947525187367" + + assert(Activity.get_create_by_object_ap_id(data["object"])) + end + + @tag capture_log: true + test "it works for incoming announces with an existing activity" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) + + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + + _user = insert(:user, local: false, ap_id: data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Announce" + + assert data["id"] == + "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" + + assert data["object"] == activity.data["object"] + + assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id + end + + # Ignore inlined activities for now + @tag skip: true + test "it works for incoming announces with an inlined activity" do + data = + File.read!("test/fixtures/mastodon-announce-private.json") + |> Poison.decode!() + + _user = + insert(:user, + local: false, + ap_id: data["actor"], + follower_address: data["actor"] <> "/followers" + ) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["actor"] == "http://mastodon.example.org/users/admin" + assert data["type"] == "Announce" + + assert data["id"] == + "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" + + object = Object.normalize(data["object"]) + + assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368" + assert object.data["content"] == "this is a private toot" + end + + @tag capture_log: true + test "it rejects incoming announces with an inlined activity from another origin" do + Tesla.Mock.mock(fn + %{method: :get} -> %Tesla.Env{status: 404, body: ""} + end) + + data = + File.read!("test/fixtures/bogus-mastodon-announce.json") + |> Poison.decode!() + + _user = insert(:user, local: false, ap_id: data["actor"]) + + assert {:error, e} = Transmogrifier.handle_incoming(data) + end + + test "it does not clobber the addressing on announce activities" do + user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) + + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", Object.normalize(activity).data["id"]) + |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"]) + |> Map.put("cc", []) + + _user = + insert(:user, + local: false, + ap_id: data["actor"], + follower_address: "http://mastodon.example.org/users/admin/followers" + ) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["to"] == ["http://mastodon.example.org/users/admin/followers"] + end +end diff --git a/test/web/activity_pub/transmogrifier/block_handling_test.exs b/test/web/activity_pub/transmogrifier/block_handling_test.exs new file mode 100644 index 000000000..71f1a0ed5 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/block_handling_test.exs @@ -0,0 +1,63 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.BlockHandlingTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.User + alias Pleroma.Web.ActivityPub.Transmogrifier + + import Pleroma.Factory + + test "it works for incoming blocks" do + user = insert(:user) + + data = + File.read!("test/fixtures/mastodon-block-activity.json") + |> Poison.decode!() + |> Map.put("object", user.ap_id) + + blocker = insert(:user, ap_id: data["actor"]) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["type"] == "Block" + assert data["object"] == user.ap_id + assert data["actor"] == "http://mastodon.example.org/users/admin" + + assert User.blocks?(blocker, user) + end + + test "incoming blocks successfully tear down any follow relationship" do + blocker = insert(:user) + blocked = insert(:user) + + data = + File.read!("test/fixtures/mastodon-block-activity.json") + |> Poison.decode!() + |> Map.put("object", blocked.ap_id) + |> Map.put("actor", blocker.ap_id) + + {:ok, blocker} = User.follow(blocker, blocked) + {:ok, blocked} = User.follow(blocked, blocker) + + assert User.following?(blocker, blocked) + assert User.following?(blocked, blocker) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + + assert data["type"] == "Block" + assert data["object"] == blocked.ap_id + assert data["actor"] == blocker.ap_id + + blocker = User.get_cached_by_ap_id(data["actor"]) + blocked = User.get_cached_by_ap_id(data["object"]) + + assert User.blocks?(blocker, blocked) + + refute User.following?(blocker, blocked) + refute User.following?(blocked, blocker) + end +end diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs new file mode 100644 index 000000000..d6736dc3e --- /dev/null +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -0,0 +1,153 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageTest do + use Pleroma.DataCase + + import Pleroma.Factory + + alias Pleroma.Activity + alias Pleroma.Chat + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.Transmogrifier + + describe "handle_incoming" do + test "handles chonks with attachment" do + data = %{ + "@context" => "https://www.w3.org/ns/activitystreams", + "actor" => "https://honk.tedunangst.com/u/tedu", + "id" => "https://honk.tedunangst.com/u/tedu/honk/x6gt8X8PcyGkQcXxzg1T", + "object" => %{ + "attachment" => [ + %{ + "mediaType" => "image/jpeg", + "name" => "298p3RG7j27tfsZ9RQ.jpg", + "summary" => "298p3RG7j27tfsZ9RQ.jpg", + "type" => "Document", + "url" => "https://honk.tedunangst.com/d/298p3RG7j27tfsZ9RQ.jpg" + } + ], + "attributedTo" => "https://honk.tedunangst.com/u/tedu", + "content" => "", + "id" => "https://honk.tedunangst.com/u/tedu/chonk/26L4wl5yCbn4dr4y1b", + "published" => "2020-05-18T01:13:03Z", + "to" => [ + "https://dontbulling.me/users/lain" + ], + "type" => "ChatMessage" + }, + "published" => "2020-05-18T01:13:03Z", + "to" => [ + "https://dontbulling.me/users/lain" + ], + "type" => "Create" + } + + _user = insert(:user, ap_id: data["actor"]) + _user = insert(:user, ap_id: hd(data["to"])) + + assert {:ok, _activity} = Transmogrifier.handle_incoming(data) + end + + test "it rejects messages that don't contain content" do + data = + File.read!("test/fixtures/create-chat-message.json") + |> Poison.decode!() + + object = + data["object"] + |> Map.delete("content") + + data = + data + |> Map.put("object", object) + + _author = + insert(:user, ap_id: data["actor"], local: false, last_refreshed_at: DateTime.utc_now()) + + _recipient = + insert(:user, + ap_id: List.first(data["to"]), + local: true, + last_refreshed_at: DateTime.utc_now() + ) + + {:error, _} = Transmogrifier.handle_incoming(data) + end + + test "it rejects messages that don't concern local users" do + data = + File.read!("test/fixtures/create-chat-message.json") + |> Poison.decode!() + + _author = + insert(:user, ap_id: data["actor"], local: false, last_refreshed_at: DateTime.utc_now()) + + _recipient = + insert(:user, + ap_id: List.first(data["to"]), + local: false, + last_refreshed_at: DateTime.utc_now() + ) + + {:error, _} = Transmogrifier.handle_incoming(data) + end + + test "it rejects messages where the `to` field of activity and object don't match" do + data = + File.read!("test/fixtures/create-chat-message.json") + |> Poison.decode!() + + author = insert(:user, ap_id: data["actor"]) + _recipient = insert(:user, ap_id: List.first(data["to"])) + + data = + data + |> Map.put("to", author.ap_id) + + assert match?({:error, _}, Transmogrifier.handle_incoming(data)) + refute Object.get_by_ap_id(data["object"]["id"]) + end + + test "it fetches the actor if they aren't in our system" do + Tesla.Mock.mock(fn env -> apply(HttpRequestMock, :request, [env]) end) + + data = + File.read!("test/fixtures/create-chat-message.json") + |> Poison.decode!() + |> Map.put("actor", "http://mastodon.example.org/users/admin") + |> put_in(["object", "actor"], "http://mastodon.example.org/users/admin") + + _recipient = insert(:user, ap_id: List.first(data["to"]), local: true) + + {:ok, %Activity{} = _activity} = Transmogrifier.handle_incoming(data) + end + + test "it inserts it and creates a chat" do + data = + File.read!("test/fixtures/create-chat-message.json") + |> Poison.decode!() + + author = + insert(:user, ap_id: data["actor"], local: false, last_refreshed_at: DateTime.utc_now()) + + recipient = insert(:user, ap_id: List.first(data["to"]), local: true) + + {:ok, %Activity{} = activity} = Transmogrifier.handle_incoming(data) + assert activity.local == false + + assert activity.actor == author.ap_id + assert activity.recipients == [recipient.ap_id, author.ap_id] + + %Object{} = object = Object.get_by_ap_id(activity.data["object"]) + + assert object + assert object.data["content"] == "You expected a cute girl? Too bad. alert('XSS')" + assert match?(%{"firefox" => _}, object.data["emoji"]) + + refute Chat.get(author.id, recipient.ap_id) + assert Chat.get(recipient.id, author.ap_id) + end + end +end diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs index 967389fae..06c39eed6 100644 --- a/test/web/activity_pub/transmogrifier/follow_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -5,6 +5,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do use Pleroma.DataCase alias Pleroma.Activity + alias Pleroma.Notification alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.Transmogrifier @@ -12,6 +13,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do import Pleroma.Factory import Ecto.Query + import Mock setup_all do Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -57,9 +59,12 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do activity = Repo.get(Activity, activity.id) assert activity.data["state"] == "accept" assert User.following?(User.get_cached_by_ap_id(data["actor"]), user) + + [notification] = Notification.for_user(user) + assert notification.type == "follow" end - test "with locked accounts, it does not create a follow or an accept" do + test "with locked accounts, it does create a Follow, but not an Accept" do user = insert(:user, locked: true) data = @@ -81,6 +86,9 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do |> Repo.all() assert Enum.empty?(accepts) + + [notification] = Notification.for_user(user) + assert notification.type == "follow_request" end test "it works for follow requests when you are already followed, creating a new accept activity" do @@ -144,6 +152,23 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.FollowHandlingTest do assert activity.data["state"] == "reject" end + test "it rejects incoming follow requests if the following errors for some reason" do + user = insert(:user) + + data = + File.read!("test/fixtures/mastodon-follow-activity.json") + |> Poison.decode!() + |> Map.put("object", user.ap_id) + + with_mock Pleroma.User, [:passthrough], follow: fn _, _ -> {:error, :testing} end do + {:ok, %Activity{data: %{"id" => id}}} = Transmogrifier.handle_incoming(data) + + %Activity{} = activity = Activity.get_by_ap_id(id) + + assert activity.data["state"] == "reject" + end + end + test "it works for incoming follow requests from hubzilla" do user = insert(:user) diff --git a/test/web/activity_pub/transmogrifier/user_update_handling_test.exs b/test/web/activity_pub/transmogrifier/user_update_handling_test.exs new file mode 100644 index 000000000..64636656c --- /dev/null +++ b/test/web/activity_pub/transmogrifier/user_update_handling_test.exs @@ -0,0 +1,159 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.Transmogrifier.UserUpdateHandlingTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.User + alias Pleroma.Web.ActivityPub.Transmogrifier + + import Pleroma.Factory + + test "it works for incoming update activities" do + user = insert(:user, local: false) + + update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!() + + object = + update_data["object"] + |> Map.put("actor", user.ap_id) + |> Map.put("id", user.ap_id) + + update_data = + update_data + |> Map.put("actor", user.ap_id) + |> Map.put("object", object) + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(update_data) + + assert data["id"] == update_data["id"] + + user = User.get_cached_by_ap_id(data["actor"]) + assert user.name == "gargle" + + assert user.avatar["url"] == [ + %{ + "href" => + "https://cd.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg" + } + ] + + assert user.banner["url"] == [ + %{ + "href" => + "https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" + } + ] + + assert user.bio == "

    Some bio

    " + end + + test "it works with alsoKnownAs" do + %{ap_id: actor} = insert(:user, local: false) + + assert User.get_cached_by_ap_id(actor).also_known_as == [] + + {:ok, _activity} = + "test/fixtures/mastodon-update.json" + |> File.read!() + |> Poison.decode!() + |> Map.put("actor", actor) + |> Map.update!("object", fn object -> + object + |> Map.put("actor", actor) + |> Map.put("id", actor) + |> Map.put("alsoKnownAs", [ + "http://mastodon.example.org/users/foo", + "http://example.org/users/bar" + ]) + end) + |> Transmogrifier.handle_incoming() + + assert User.get_cached_by_ap_id(actor).also_known_as == [ + "http://mastodon.example.org/users/foo", + "http://example.org/users/bar" + ] + end + + test "it works with custom profile fields" do + user = insert(:user, local: false) + + assert user.fields == [] + + update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!() + + object = + update_data["object"] + |> Map.put("actor", user.ap_id) + |> Map.put("id", user.ap_id) + + update_data = + update_data + |> Map.put("actor", user.ap_id) + |> Map.put("object", object) + + {:ok, _update_activity} = Transmogrifier.handle_incoming(update_data) + + user = User.get_cached_by_ap_id(user.ap_id) + + assert user.fields == [ + %{"name" => "foo", "value" => "updated"}, + %{"name" => "foo1", "value" => "updated"} + ] + + Pleroma.Config.put([:instance, :max_remote_account_fields], 2) + + update_data = + update_data + |> put_in(["object", "attachment"], [ + %{"name" => "foo", "type" => "PropertyValue", "value" => "bar"}, + %{"name" => "foo11", "type" => "PropertyValue", "value" => "bar11"}, + %{"name" => "foo22", "type" => "PropertyValue", "value" => "bar22"} + ]) + |> Map.put("id", update_data["id"] <> ".") + + {:ok, _} = Transmogrifier.handle_incoming(update_data) + + user = User.get_cached_by_ap_id(user.ap_id) + + assert user.fields == [ + %{"name" => "foo", "value" => "updated"}, + %{"name" => "foo1", "value" => "updated"} + ] + + update_data = + update_data + |> put_in(["object", "attachment"], []) + |> Map.put("id", update_data["id"] <> ".") + + {:ok, _} = Transmogrifier.handle_incoming(update_data) + + user = User.get_cached_by_ap_id(user.ap_id) + + assert user.fields == [] + end + + test "it works for incoming update activities which lock the account" do + user = insert(:user, local: false) + + update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!() + + object = + update_data["object"] + |> Map.put("actor", user.ap_id) + |> Map.put("id", user.ap_id) + |> Map.put("manuallyApprovesFollowers", true) + + update_data = + update_data + |> Map.put("actor", user.ap_id) + |> Map.put("object", object) + + {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(update_data) + + user = User.get_cached_by_ap_id(user.ap_id) + assert user.locked == true + end +end diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 0a54e3bb9..6a53fd3f0 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -28,6 +28,63 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do setup do: clear_config([:instance, :max_remote_account_fields]) describe "handle_incoming" do + test "it works for incoming notices with tag not being an array (kroeg)" do + data = File.read!("test/fixtures/kroeg-array-less-emoji.json") |> Poison.decode!() + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + object = Object.normalize(data["object"]) + + assert object.data["emoji"] == %{ + "icon_e_smile" => "https://puckipedia.com/forum/images/smilies/icon_e_smile.png" + } + + data = File.read!("test/fixtures/kroeg-array-less-hashtag.json") |> Poison.decode!() + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + object = Object.normalize(data["object"]) + + assert "test" in object.data["tag"] + end + + test "it works for incoming notices with url not being a string (prismo)" do + data = File.read!("test/fixtures/prismo-url-map.json") |> Poison.decode!() + + {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) + object = Object.normalize(data["object"]) + + assert object.data["url"] == "https://prismo.news/posts/83" + end + + test "it cleans up incoming notices which are not really DMs" do + user = insert(:user) + other_user = insert(:user) + + to = [user.ap_id, other_user.ap_id] + + data = + File.read!("test/fixtures/mastodon-post-activity.json") + |> Poison.decode!() + |> Map.put("to", to) + |> Map.put("cc", []) + + object = + data["object"] + |> Map.put("to", to) + |> Map.put("cc", []) + + data = Map.put(data, "object", object) + + {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) + + assert data["to"] == [] + assert data["cc"] == to + + object_data = Object.normalize(activity).data + + assert object_data["to"] == [] + assert object_data["cc"] == to + end + test "it ignores an incoming notice if we already have it" do activity = insert(:note_activity) @@ -260,172 +317,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do "

    henlo from my Psion netBook

    message sent from my Psion netBook

    " end - test "it works for incoming honk announces" do - _user = insert(:user, ap_id: "https://honktest/u/test", local: false) - other_user = insert(:user) - {:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"}) - - announce = %{ - "@context" => "https://www.w3.org/ns/activitystreams", - "actor" => "https://honktest/u/test", - "id" => "https://honktest/u/test/bonk/1793M7B9MQ48847vdx", - "object" => post.data["object"], - "published" => "2019-06-25T19:33:58Z", - "to" => "https://www.w3.org/ns/activitystreams#Public", - "type" => "Announce" - } - - {:ok, %Activity{local: false}} = Transmogrifier.handle_incoming(announce) - end - - test "it works for incoming announces with actor being inlined (kroeg)" do - data = File.read!("test/fixtures/kroeg-announce-with-inline-actor.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "https://puckipedia.com/" - end - - test "it works for incoming notices with tag not being an array (kroeg)" do - data = File.read!("test/fixtures/kroeg-array-less-emoji.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - object = Object.normalize(data["object"]) - - assert object.data["emoji"] == %{ - "icon_e_smile" => "https://puckipedia.com/forum/images/smilies/icon_e_smile.png" - } - - data = File.read!("test/fixtures/kroeg-array-less-hashtag.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - object = Object.normalize(data["object"]) - - assert "test" in object.data["tag"] - end - - test "it works for incoming notices with url not being a string (prismo)" do - data = File.read!("test/fixtures/prismo-url-map.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - object = Object.normalize(data["object"]) - - assert object.data["url"] == "https://prismo.news/posts/83" - end - - test "it cleans up incoming notices which are not really DMs" do - user = insert(:user) - other_user = insert(:user) - - to = [user.ap_id, other_user.ap_id] - - data = - File.read!("test/fixtures/mastodon-post-activity.json") - |> Poison.decode!() - |> Map.put("to", to) - |> Map.put("cc", []) - - object = - data["object"] - |> Map.put("to", to) - |> Map.put("cc", []) - - data = Map.put(data, "object", object) - - {:ok, %Activity{data: data, local: false} = activity} = Transmogrifier.handle_incoming(data) - - assert data["to"] == [] - assert data["cc"] == to - - object_data = Object.normalize(activity).data - - assert object_data["to"] == [] - assert object_data["cc"] == to - end - - test "it works for incoming announces" do - data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Announce" - - assert data["id"] == - "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" - - assert data["object"] == - "http://mastodon.example.org/users/admin/statuses/99541947525187367" - - assert Activity.get_create_by_object_ap_id(data["object"]) - end - - test "it works for incoming announces with an existing activity" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) - - data = - File.read!("test/fixtures/mastodon-announce.json") - |> Poison.decode!() - |> Map.put("object", activity.data["object"]) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Announce" - - assert data["id"] == - "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" - - assert data["object"] == activity.data["object"] - - assert Activity.get_create_by_object_ap_id(data["object"]).id == activity.id - end - - test "it works for incoming announces with an inlined activity" do - data = - File.read!("test/fixtures/mastodon-announce-private.json") - |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["actor"] == "http://mastodon.example.org/users/admin" - assert data["type"] == "Announce" - - assert data["id"] == - "http://mastodon.example.org/users/admin/statuses/99542391527669785/activity" - - object = Object.normalize(data["object"]) - - assert object.data["id"] == "http://mastodon.example.org/@admin/99541947525187368" - assert object.data["content"] == "this is a private toot" - end - - @tag capture_log: true - test "it rejects incoming announces with an inlined activity from another origin" do - data = - File.read!("test/fixtures/bogus-mastodon-announce.json") - |> Poison.decode!() - - assert :error = Transmogrifier.handle_incoming(data) - end - - test "it does not clobber the addressing on announce activities" do - user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) - - data = - File.read!("test/fixtures/mastodon-announce.json") - |> Poison.decode!() - |> Map.put("object", Object.normalize(activity).data["id"]) - |> Map.put("to", ["http://mastodon.example.org/users/admin/followers"]) - |> Map.put("cc", []) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["to"] == ["http://mastodon.example.org/users/admin/followers"] - end - test "it ensures that as:Public activities make it to their followers collection" do user = insert(:user) @@ -510,162 +401,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do refute Map.has_key?(object_data, "reaction_count") end - test "it works for incoming update activities" do - data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!() - - object = - update_data["object"] - |> Map.put("actor", data["actor"]) - |> Map.put("id", data["actor"]) - - update_data = - update_data - |> Map.put("actor", data["actor"]) - |> Map.put("object", object) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(update_data) - - assert data["id"] == update_data["id"] - - user = User.get_cached_by_ap_id(data["actor"]) - assert user.name == "gargle" - - assert user.avatar["url"] == [ - %{ - "href" => - "https://cd.niu.moe/accounts/avatars/000/033/323/original/fd7f8ae0b3ffedc9.jpeg" - } - ] - - assert user.banner["url"] == [ - %{ - "href" => - "https://cd.niu.moe/accounts/headers/000/033/323/original/850b3448fa5fd477.png" - } - ] - - assert user.bio == "

    Some bio

    " - end - - test "it works with alsoKnownAs" do - {:ok, %Activity{data: %{"actor" => actor}}} = - "test/fixtures/mastodon-post-activity.json" - |> File.read!() - |> Poison.decode!() - |> Transmogrifier.handle_incoming() - - assert User.get_cached_by_ap_id(actor).also_known_as == ["http://example.org/users/foo"] - - {:ok, _activity} = - "test/fixtures/mastodon-update.json" - |> File.read!() - |> Poison.decode!() - |> Map.put("actor", actor) - |> Map.update!("object", fn object -> - object - |> Map.put("actor", actor) - |> Map.put("id", actor) - |> Map.put("alsoKnownAs", [ - "http://mastodon.example.org/users/foo", - "http://example.org/users/bar" - ]) - end) - |> Transmogrifier.handle_incoming() - - assert User.get_cached_by_ap_id(actor).also_known_as == [ - "http://mastodon.example.org/users/foo", - "http://example.org/users/bar" - ] - end - - test "it works with custom profile fields" do - {:ok, activity} = - "test/fixtures/mastodon-post-activity.json" - |> File.read!() - |> Poison.decode!() - |> Transmogrifier.handle_incoming() - - user = User.get_cached_by_ap_id(activity.actor) - - assert user.fields == [ - %{"name" => "foo", "value" => "bar"}, - %{"name" => "foo1", "value" => "bar1"} - ] - - update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!() - - object = - update_data["object"] - |> Map.put("actor", user.ap_id) - |> Map.put("id", user.ap_id) - - update_data = - update_data - |> Map.put("actor", user.ap_id) - |> Map.put("object", object) - - {:ok, _update_activity} = Transmogrifier.handle_incoming(update_data) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.fields == [ - %{"name" => "foo", "value" => "updated"}, - %{"name" => "foo1", "value" => "updated"} - ] - - Pleroma.Config.put([:instance, :max_remote_account_fields], 2) - - update_data = - put_in(update_data, ["object", "attachment"], [ - %{"name" => "foo", "type" => "PropertyValue", "value" => "bar"}, - %{"name" => "foo11", "type" => "PropertyValue", "value" => "bar11"}, - %{"name" => "foo22", "type" => "PropertyValue", "value" => "bar22"} - ]) - - {:ok, _} = Transmogrifier.handle_incoming(update_data) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.fields == [ - %{"name" => "foo", "value" => "updated"}, - %{"name" => "foo1", "value" => "updated"} - ] - - update_data = put_in(update_data, ["object", "attachment"], []) - - {:ok, _} = Transmogrifier.handle_incoming(update_data) - - user = User.get_cached_by_ap_id(user.ap_id) - - assert user.fields == [] - end - - test "it works for incoming update activities which lock the account" do - data = File.read!("test/fixtures/mastodon-post-activity.json") |> Poison.decode!() - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - update_data = File.read!("test/fixtures/mastodon-update.json") |> Poison.decode!() - - object = - update_data["object"] - |> Map.put("actor", data["actor"]) - |> Map.put("id", data["actor"]) - |> Map.put("manuallyApprovesFollowers", true) - - update_data = - update_data - |> Map.put("actor", data["actor"]) - |> Map.put("object", object) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(update_data) - - user = User.get_cached_by_ap_id(data["actor"]) - assert user.locked == true - end - test "it works for incomming unfollows with an existing follow" do user = insert(:user) @@ -710,56 +445,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do assert [^pending_follower] = User.get_follow_requests(user) end - test "it works for incoming blocks" do - user = insert(:user) - - data = - File.read!("test/fixtures/mastodon-block-activity.json") - |> Poison.decode!() - |> Map.put("object", user.ap_id) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["type"] == "Block" - assert data["object"] == user.ap_id - assert data["actor"] == "http://mastodon.example.org/users/admin" - - blocker = User.get_cached_by_ap_id(data["actor"]) - - assert User.blocks?(blocker, user) - end - - test "incoming blocks successfully tear down any follow relationship" do - blocker = insert(:user) - blocked = insert(:user) - - data = - File.read!("test/fixtures/mastodon-block-activity.json") - |> Poison.decode!() - |> Map.put("object", blocked.ap_id) - |> Map.put("actor", blocker.ap_id) - - {:ok, blocker} = User.follow(blocker, blocked) - {:ok, blocked} = User.follow(blocked, blocker) - - assert User.following?(blocker, blocked) - assert User.following?(blocked, blocker) - - {:ok, %Activity{data: data, local: false}} = Transmogrifier.handle_incoming(data) - - assert data["type"] == "Block" - assert data["object"] == blocked.ap_id - assert data["actor"] == blocker.ap_id - - blocker = User.get_cached_by_ap_id(data["actor"]) - blocked = User.get_cached_by_ap_id(data["object"]) - - assert User.blocks?(blocker, blocked) - - refute User.following?(blocker, blocked) - refute User.following?(blocked, blocker) - end - test "it works for incoming accepts which were pre-accepted" do follower = insert(:user) followed = insert(:user) @@ -1188,7 +873,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do {:ok, activity} = CommonAPI.post(user, %{status: "hey", visibility: "private"}) - {:ok, announce_activity, _} = CommonAPI.repeat(activity.id, user) + {:ok, announce_activity} = CommonAPI.repeat(activity.id, user) {:ok, modified} = Transmogrifier.prepare_outgoing(announce_activity.data) @@ -1203,23 +888,28 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do {:ok, activity} = CommonAPI.post(user, %{status: "hey, @#{other_user.nickname}, how are ya? #2hu"}) - {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) - object = modified["object"] + with_mock Pleroma.Notification, + get_notified_from_activity: fn _, _ -> [] end do + {:ok, modified} = Transmogrifier.prepare_outgoing(activity.data) - expected_mention = %{ - "href" => other_user.ap_id, - "name" => "@#{other_user.nickname}", - "type" => "Mention" - } + object = modified["object"] - expected_tag = %{ - "href" => Pleroma.Web.Endpoint.url() <> "/tags/2hu", - "type" => "Hashtag", - "name" => "#2hu" - } + expected_mention = %{ + "href" => other_user.ap_id, + "name" => "@#{other_user.nickname}", + "type" => "Mention" + } - assert Enum.member?(object["tag"], expected_tag) - assert Enum.member?(object["tag"], expected_mention) + expected_tag = %{ + "href" => Pleroma.Web.Endpoint.url() <> "/tags/2hu", + "type" => "Hashtag", + "name" => "#2hu" + } + + refute called(Pleroma.Notification.get_notified_from_activity(:_, :_)) + assert Enum.member?(object["tag"], expected_tag) + assert Enum.member?(object["tag"], expected_mention) + end end test "it adds the sensitive property" do @@ -1438,7 +1128,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end @@ -1453,7 +1143,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end @@ -1468,7 +1158,7 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end end @@ -1675,9 +1365,6 @@ defmodule Pleroma.Web.ActivityPub.TransmogrifierTest do assert modified_object["inReplyToAtomUri"] == "https://shitposter.club/notice/2827873" - assert modified_object["conversation"] == - "tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26" - assert modified_object["context"] == "tag:shitposter.club,2017-05-05:objectType=thread:nonce=3c16e9c2681f6d26" end diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index 9e0a0f1c4..2f9ecb5a3 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -27,16 +27,6 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do end end - describe "fetch the latest Block" do - test "fetches the latest Block activity" do - blocker = insert(:user) - blocked = insert(:user) - {:ok, activity} = ActivityPub.block(blocker, blocked) - - assert activity == Utils.fetch_latest_block(blocker, blocked) - end - end - describe "determine_explicit_mentions()" do test "works with an object that has mentions" do object = %{ @@ -334,7 +324,7 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do assert object = Object.normalize(note_activity) actor = insert(:user) - {:ok, announce, _object} = ActivityPub.announce(actor, object) + {:ok, announce} = CommonAPI.repeat(note_activity.id, actor) assert Utils.get_existing_announce(actor.ap_id, object) == announce end end @@ -344,9 +334,9 @@ defmodule Pleroma.Web.ActivityPub.UtilsTest do user1 = insert(:user) user2 = insert(:user) - assert {:ok, %Activity{} = _} = ActivityPub.block(user1, user2) - assert {:ok, %Activity{} = _} = ActivityPub.block(user1, user2) - assert {:ok, %Activity{} = activity} = ActivityPub.block(user1, user2) + assert {:ok, %Activity{} = _} = CommonAPI.block(user1, user2) + assert {:ok, %Activity{} = _} = CommonAPI.block(user1, user2) + assert {:ok, %Activity{} = activity} = CommonAPI.block(user1, user2) assert Utils.fetch_latest_block(user1, user2) == activity end diff --git a/test/web/activity_pub/views/object_view_test.exs b/test/web/activity_pub/views/object_view_test.exs index 43f0617f0..f0389845d 100644 --- a/test/web/activity_pub/views/object_view_test.exs +++ b/test/web/activity_pub/views/object_view_test.exs @@ -73,7 +73,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectViewTest do object = Object.normalize(note) user = insert(:user) - {:ok, announce_activity, _} = CommonAPI.repeat(note.id, user) + {:ok, announce_activity} = CommonAPI.repeat(note.id, user) result = ObjectView.render("object.json", %{object: announce_activity}) diff --git a/test/web/activity_pub/views/user_view_test.exs b/test/web/activity_pub/views/user_view_test.exs index 20b0f223c..bec15a996 100644 --- a/test/web/activity_pub/views/user_view_test.exs +++ b/test/web/activity_pub/views/user_view_test.exs @@ -158,35 +158,4 @@ defmodule Pleroma.Web.ActivityPub.UserViewTest do assert %{"totalItems" => 1} = UserView.render("following.json", %{user: user}) end end - - test "activity collection page aginates correctly" do - user = insert(:user) - - posts = - for i <- 0..25 do - {:ok, activity} = CommonAPI.post(user, %{status: "post #{i}"}) - activity - end - - # outbox sorts chronologically, newest first, with ten per page - posts = Enum.reverse(posts) - - %{"next" => next_url} = - UserView.render("activity_collection_page.json", %{ - iri: "#{user.ap_id}/outbox", - activities: Enum.take(posts, 10) - }) - - next_id = Enum.at(posts, 9).id - assert next_url =~ next_id - - %{"next" => next_url} = - UserView.render("activity_collection_page.json", %{ - iri: "#{user.ap_id}/outbox", - activities: Enum.take(Enum.drop(posts, 10), 10) - }) - - next_id = Enum.at(posts, 19).id - assert next_url =~ next_id - end end diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs deleted file mode 100644 index 370d876d0..000000000 --- a/test/web/admin_api/admin_api_controller_test.exs +++ /dev/null @@ -1,3864 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do - use Pleroma.Web.ConnCase - use Oban.Testing, repo: Pleroma.Repo - - import ExUnit.CaptureLog - import Mock - import Pleroma.Factory - - alias Pleroma.Activity - alias Pleroma.Config - alias Pleroma.ConfigDB - alias Pleroma.HTML - alias Pleroma.MFA - alias Pleroma.ModerationLog - alias Pleroma.Repo - alias Pleroma.ReportNote - alias Pleroma.Tests.ObanHelpers - alias Pleroma.User - alias Pleroma.UserInviteToken - alias Pleroma.Web - alias Pleroma.Web.ActivityPub.Relay - alias Pleroma.Web.CommonAPI - alias Pleroma.Web.MediaProxy - - setup_all do - Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) - - :ok - end - - setup do - admin = insert(:user, is_admin: true) - token = insert(:oauth_admin_token, user: admin) - - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, token) - - {:ok, %{admin: admin, token: token, conn: conn}} - end - - describe "with [:auth, :enforce_oauth_admin_scope_usage]," do - setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], true) - - test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope", - %{admin: admin} do - user = insert(:user) - url = "/api/pleroma/admin/users/#{user.nickname}" - - good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) - good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) - good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"]) - - bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts"]) - bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"]) - bad_token3 = nil - - for good_token <- [good_token1, good_token2, good_token3] do - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, good_token) - |> get(url) - - assert json_response(conn, 200) - end - - for good_token <- [good_token1, good_token2, good_token3] do - conn = - build_conn() - |> assign(:user, nil) - |> assign(:token, good_token) - |> get(url) - - assert json_response(conn, :forbidden) - end - - for bad_token <- [bad_token1, bad_token2, bad_token3] do - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, bad_token) - |> get(url) - - assert json_response(conn, :forbidden) - end - end - end - - describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do - setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false) - - test "GET /api/pleroma/admin/users/:nickname requires " <> - "read:accounts or admin:read:accounts or broader scope", - %{admin: admin} do - user = insert(:user) - url = "/api/pleroma/admin/users/#{user.nickname}" - - good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) - good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) - good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"]) - good_token4 = insert(:oauth_token, user: admin, scopes: ["read:accounts"]) - good_token5 = insert(:oauth_token, user: admin, scopes: ["read"]) - - good_tokens = [good_token1, good_token2, good_token3, good_token4, good_token5] - - bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts:partial"]) - bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"]) - bad_token3 = nil - - for good_token <- good_tokens do - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, good_token) - |> get(url) - - assert json_response(conn, 200) - end - - for good_token <- good_tokens do - conn = - build_conn() - |> assign(:user, nil) - |> assign(:token, good_token) - |> get(url) - - assert json_response(conn, :forbidden) - end - - for bad_token <- [bad_token1, bad_token2, bad_token3] do - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, bad_token) - |> get(url) - - assert json_response(conn, :forbidden) - end - end - end - - describe "DELETE /api/pleroma/admin/users" do - test "single user", %{admin: admin, conn: conn} do - user = insert(:user) - - with_mock Pleroma.Web.Federator, - publish: fn _ -> nil end do - conn = - conn - |> put_req_header("accept", "application/json") - |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}") - - ObanHelpers.perform_all() - - assert User.get_by_nickname(user.nickname).deactivated - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deleted users: @#{user.nickname}" - - assert json_response(conn, 200) == [user.nickname] - - assert called(Pleroma.Web.Federator.publish(:_)) - end - end - - test "multiple users", %{admin: admin, conn: conn} do - user_one = insert(:user) - user_two = insert(:user) - - conn = - conn - |> put_req_header("accept", "application/json") - |> delete("/api/pleroma/admin/users", %{ - nicknames: [user_one.nickname, user_two.nickname] - }) - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}" - - response = json_response(conn, 200) - assert response -- [user_one.nickname, user_two.nickname] == [] - end - end - - describe "/api/pleroma/admin/users" do - test "Create", %{conn: conn} do - conn = - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users", %{ - "users" => [ - %{ - "nickname" => "lain", - "email" => "lain@example.org", - "password" => "test" - }, - %{ - "nickname" => "lain2", - "email" => "lain2@example.org", - "password" => "test" - } - ] - }) - - response = json_response(conn, 200) |> Enum.map(&Map.get(&1, "type")) - assert response == ["success", "success"] - - log_entry = Repo.one(ModerationLog) - - assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == [] - end - - test "Cannot create user with existing email", %{conn: conn} do - user = insert(:user) - - conn = - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users", %{ - "users" => [ - %{ - "nickname" => "lain", - "email" => user.email, - "password" => "test" - } - ] - }) - - assert json_response(conn, 409) == [ - %{ - "code" => 409, - "data" => %{ - "email" => user.email, - "nickname" => "lain" - }, - "error" => "email has already been taken", - "type" => "error" - } - ] - end - - test "Cannot create user with existing nickname", %{conn: conn} do - user = insert(:user) - - conn = - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users", %{ - "users" => [ - %{ - "nickname" => user.nickname, - "email" => "someuser@plerama.social", - "password" => "test" - } - ] - }) - - assert json_response(conn, 409) == [ - %{ - "code" => 409, - "data" => %{ - "email" => "someuser@plerama.social", - "nickname" => user.nickname - }, - "error" => "nickname has already been taken", - "type" => "error" - } - ] - end - - test "Multiple user creation works in transaction", %{conn: conn} do - user = insert(:user) - - conn = - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users", %{ - "users" => [ - %{ - "nickname" => "newuser", - "email" => "newuser@pleroma.social", - "password" => "test" - }, - %{ - "nickname" => "lain", - "email" => user.email, - "password" => "test" - } - ] - }) - - assert json_response(conn, 409) == [ - %{ - "code" => 409, - "data" => %{ - "email" => user.email, - "nickname" => "lain" - }, - "error" => "email has already been taken", - "type" => "error" - }, - %{ - "code" => 409, - "data" => %{ - "email" => "newuser@pleroma.social", - "nickname" => "newuser" - }, - "error" => "", - "type" => "error" - } - ] - - assert User.get_by_nickname("newuser") === nil - end - end - - describe "/api/pleroma/admin/users/:nickname" do - test "Show", %{conn: conn} do - user = insert(:user) - - conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") - - expected = %{ - "deactivated" => false, - "id" => to_string(user.id), - "local" => true, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - - assert expected == json_response(conn, 200) - end - - test "when the user doesn't exist", %{conn: conn} do - user = build(:user) - - conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") - - assert "Not found" == json_response(conn, 404) - end - end - - describe "/api/pleroma/admin/users/follow" do - test "allows to force-follow another user", %{admin: admin, conn: conn} do - user = insert(:user) - follower = insert(:user) - - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users/follow", %{ - "follower" => follower.nickname, - "followed" => user.nickname - }) - - user = User.get_cached_by_id(user.id) - follower = User.get_cached_by_id(follower.id) - - assert User.following?(follower, user) - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} made @#{follower.nickname} follow @#{user.nickname}" - end - end - - describe "/api/pleroma/admin/users/unfollow" do - test "allows to force-unfollow another user", %{admin: admin, conn: conn} do - user = insert(:user) - follower = insert(:user) - - User.follow(follower, user) - - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users/unfollow", %{ - "follower" => follower.nickname, - "followed" => user.nickname - }) - - user = User.get_cached_by_id(user.id) - follower = User.get_cached_by_id(follower.id) - - refute User.following?(follower, user) - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} made @#{follower.nickname} unfollow @#{user.nickname}" - end - end - - describe "PUT /api/pleroma/admin/users/tag" do - setup %{conn: conn} do - user1 = insert(:user, %{tags: ["x"]}) - user2 = insert(:user, %{tags: ["y"]}) - user3 = insert(:user, %{tags: ["unchanged"]}) - - conn = - conn - |> put_req_header("accept", "application/json") - |> put( - "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <> - "#{user2.nickname}&tags[]=foo&tags[]=bar" - ) - - %{conn: conn, user1: user1, user2: user2, user3: user3} - end - - test "it appends specified tags to users with specified nicknames", %{ - conn: conn, - admin: admin, - user1: user1, - user2: user2 - } do - assert json_response(conn, :no_content) - assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"] - assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"] - - log_entry = Repo.one(ModerationLog) - - users = - [user1.nickname, user2.nickname] - |> Enum.map(&"@#{&1}") - |> Enum.join(", ") - - tags = ["foo", "bar"] |> Enum.join(", ") - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} added tags: #{tags} to users: #{users}" - end - - test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do - assert json_response(conn, :no_content) - assert User.get_cached_by_id(user3.id).tags == ["unchanged"] - end - end - - describe "DELETE /api/pleroma/admin/users/tag" do - setup %{conn: conn} do - user1 = insert(:user, %{tags: ["x"]}) - user2 = insert(:user, %{tags: ["y", "z"]}) - user3 = insert(:user, %{tags: ["unchanged"]}) - - conn = - conn - |> put_req_header("accept", "application/json") - |> delete( - "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <> - "#{user2.nickname}&tags[]=x&tags[]=z" - ) - - %{conn: conn, user1: user1, user2: user2, user3: user3} - end - - test "it removes specified tags from users with specified nicknames", %{ - conn: conn, - admin: admin, - user1: user1, - user2: user2 - } do - assert json_response(conn, :no_content) - assert User.get_cached_by_id(user1.id).tags == [] - assert User.get_cached_by_id(user2.id).tags == ["y"] - - log_entry = Repo.one(ModerationLog) - - users = - [user1.nickname, user2.nickname] - |> Enum.map(&"@#{&1}") - |> Enum.join(", ") - - tags = ["x", "z"] |> Enum.join(", ") - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} removed tags: #{tags} from users: #{users}" - end - - test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do - assert json_response(conn, :no_content) - assert User.get_cached_by_id(user3.id).tags == ["unchanged"] - end - end - - describe "/api/pleroma/admin/users/:nickname/permission_group" do - test "GET is giving user_info", %{admin: admin, conn: conn} do - conn = - conn - |> put_req_header("accept", "application/json") - |> get("/api/pleroma/admin/users/#{admin.nickname}/permission_group/") - - assert json_response(conn, 200) == %{ - "is_admin" => true, - "is_moderator" => false - } - end - - test "/:right POST, can add to a permission group", %{admin: admin, conn: conn} do - user = insert(:user) - - conn = - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") - - assert json_response(conn, 200) == %{ - "is_admin" => true - } - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} made @#{user.nickname} admin" - end - - test "/:right POST, can add to a permission group (multiple)", %{admin: admin, conn: conn} do - user_one = insert(:user) - user_two = insert(:user) - - conn = - conn - |> put_req_header("accept", "application/json") - |> post("/api/pleroma/admin/users/permission_group/admin", %{ - nicknames: [user_one.nickname, user_two.nickname] - }) - - assert json_response(conn, 200) == %{"is_admin" => true} - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} made @#{user_one.nickname}, @#{user_two.nickname} admin" - end - - test "/:right DELETE, can remove from a permission group", %{admin: admin, conn: conn} do - user = insert(:user, is_admin: true) - - conn = - conn - |> put_req_header("accept", "application/json") - |> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") - - assert json_response(conn, 200) == %{"is_admin" => false} - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} revoked admin role from @#{user.nickname}" - end - - test "/:right DELETE, can remove from a permission group (multiple)", %{ - admin: admin, - conn: conn - } do - user_one = insert(:user, is_admin: true) - user_two = insert(:user, is_admin: true) - - conn = - conn - |> put_req_header("accept", "application/json") - |> delete("/api/pleroma/admin/users/permission_group/admin", %{ - nicknames: [user_one.nickname, user_two.nickname] - }) - - assert json_response(conn, 200) == %{"is_admin" => false} - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} revoked admin role from @#{user_one.nickname}, @#{ - user_two.nickname - }" - end - end - - describe "POST /api/pleroma/admin/email_invite, with valid config" do - setup do: clear_config([:instance, :registrations_open], false) - setup do: clear_config([:instance, :invites_enabled], true) - - test "sends invitation and returns 204", %{admin: admin, conn: conn} do - recipient_email = "foo@bar.com" - recipient_name = "J. D." - - conn = - post( - conn, - "/api/pleroma/admin/users/email_invite?email=#{recipient_email}&name=#{recipient_name}" - ) - - assert json_response(conn, :no_content) - - token_record = List.last(Repo.all(Pleroma.UserInviteToken)) - assert token_record - refute token_record.used - - notify_email = Config.get([:instance, :notify_email]) - instance_name = Config.get([:instance, :name]) - - email = - Pleroma.Emails.UserEmail.user_invitation_email( - admin, - token_record, - recipient_email, - recipient_name - ) - - Swoosh.TestAssertions.assert_email_sent( - from: {instance_name, notify_email}, - to: {recipient_name, recipient_email}, - html_body: email.html_body - ) - end - - test "it returns 403 if requested by a non-admin" do - non_admin_user = insert(:user) - token = insert(:oauth_token, user: non_admin_user) - - conn = - build_conn() - |> assign(:user, non_admin_user) - |> assign(:token, token) - |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") - - assert json_response(conn, :forbidden) - end - - test "email with +", %{conn: conn, admin: admin} do - recipient_email = "foo+bar@baz.com" - - conn - |> put_req_header("content-type", "application/json;charset=utf-8") - |> post("/api/pleroma/admin/users/email_invite", %{email: recipient_email}) - |> json_response(:no_content) - - token_record = - Pleroma.UserInviteToken - |> Repo.all() - |> List.last() - - assert token_record - refute token_record.used - - notify_email = Config.get([:instance, :notify_email]) - instance_name = Config.get([:instance, :name]) - - email = - Pleroma.Emails.UserEmail.user_invitation_email( - admin, - token_record, - recipient_email - ) - - Swoosh.TestAssertions.assert_email_sent( - from: {instance_name, notify_email}, - to: recipient_email, - html_body: email.html_body - ) - end - end - - describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do - setup do: clear_config([:instance, :registrations_open]) - setup do: clear_config([:instance, :invites_enabled]) - - test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do - Config.put([:instance, :registrations_open], false) - Config.put([:instance, :invites_enabled], false) - - conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") - - assert json_response(conn, :bad_request) == - "To send invites you need to set the `invites_enabled` option to true." - end - - test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do - Config.put([:instance, :registrations_open], true) - Config.put([:instance, :invites_enabled], true) - - conn = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") - - assert json_response(conn, :bad_request) == - "To send invites you need to set the `registrations_open` option to false." - end - end - - test "/api/pleroma/admin/users/:nickname/password_reset", %{conn: conn} do - user = insert(:user) - - conn = - conn - |> put_req_header("accept", "application/json") - |> get("/api/pleroma/admin/users/#{user.nickname}/password_reset") - - resp = json_response(conn, 200) - - assert Regex.match?(~r/(http:\/\/|https:\/\/)/, resp["link"]) - end - - describe "GET /api/pleroma/admin/users" do - test "renders users array for the first page", %{conn: conn, admin: admin} do - user = insert(:user, local: false, tags: ["foo", "bar"]) - conn = get(conn, "/api/pleroma/admin/users?page=1") - - users = - [ - %{ - "deactivated" => admin.deactivated, - "id" => admin.id, - "nickname" => admin.nickname, - "roles" => %{"admin" => true, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(admin) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false - }, - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => false, - "tags" => ["foo", "bar"], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - |> Enum.sort_by(& &1["nickname"]) - - assert json_response(conn, 200) == %{ - "count" => 2, - "page_size" => 50, - "users" => users - } - end - - test "pagination works correctly with service users", %{conn: conn} do - service1 = insert(:user, ap_id: Web.base_url() <> "/relay") - service2 = insert(:user, ap_id: Web.base_url() <> "/internal/fetch") - insert_list(25, :user) - - assert %{"count" => 26, "page_size" => 10, "users" => users1} = - conn - |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"}) - |> json_response(200) - - assert Enum.count(users1) == 10 - assert service1 not in [users1] - assert service2 not in [users1] - - assert %{"count" => 26, "page_size" => 10, "users" => users2} = - conn - |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"}) - |> json_response(200) - - assert Enum.count(users2) == 10 - assert service1 not in [users2] - assert service2 not in [users2] - - assert %{"count" => 26, "page_size" => 10, "users" => users3} = - conn - |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"}) - |> json_response(200) - - assert Enum.count(users3) == 6 - assert service1 not in [users3] - assert service2 not in [users3] - end - - test "renders empty array for the second page", %{conn: conn} do - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?page=2") - - assert json_response(conn, 200) == %{ - "count" => 2, - "page_size" => 50, - "users" => [] - } - end - - test "regular search", %{conn: conn} do - user = insert(:user, nickname: "bob") - - conn = get(conn, "/api/pleroma/admin/users?query=bo") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "search by domain", %{conn: conn} do - user = insert(:user, nickname: "nickname@domain.com") - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?query=domain.com") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "search by full nickname", %{conn: conn} do - user = insert(:user, nickname: "nickname@domain.com") - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "search by display name", %{conn: conn} do - user = insert(:user, name: "Display name") - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?name=display") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "search by email", %{conn: conn} do - user = insert(:user, email: "email@example.com") - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?email=email@example.com") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "regular search with page size", %{conn: conn} do - user = insert(:user, nickname: "aalice") - user2 = insert(:user, nickname: "alice") - - conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1") - - assert json_response(conn1, 200) == %{ - "count" => 2, - "page_size" => 1, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - - conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2") - - assert json_response(conn2, 200) == %{ - "count" => 2, - "page_size" => 1, - "users" => [ - %{ - "deactivated" => user2.deactivated, - "id" => user2.id, - "nickname" => user2.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user2) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user2.name || user2.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "only local users" do - admin = insert(:user, is_admin: true, nickname: "john") - token = insert(:oauth_admin_token, user: admin) - user = insert(:user, nickname: "bob") - - insert(:user, nickname: "bobb", local: false) - - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, token) - |> get("/api/pleroma/admin/users?query=bo&filters=local") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "only local users with no query", %{conn: conn, admin: old_admin} do - admin = insert(:user, is_admin: true, nickname: "john") - user = insert(:user, nickname: "bob") - - insert(:user, nickname: "bobb", local: false) - - conn = get(conn, "/api/pleroma/admin/users?filters=local") - - users = - [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - }, - %{ - "deactivated" => admin.deactivated, - "id" => admin.id, - "nickname" => admin.nickname, - "roles" => %{"admin" => true, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(admin) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false - }, - %{ - "deactivated" => false, - "id" => old_admin.id, - "local" => true, - "nickname" => old_admin.nickname, - "roles" => %{"admin" => true, "moderator" => false}, - "tags" => [], - "avatar" => User.avatar_url(old_admin) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(old_admin.name || old_admin.nickname), - "confirmation_pending" => false - } - ] - |> Enum.sort_by(& &1["nickname"]) - - assert json_response(conn, 200) == %{ - "count" => 3, - "page_size" => 50, - "users" => users - } - end - - test "load only admins", %{conn: conn, admin: admin} do - second_admin = insert(:user, is_admin: true) - insert(:user) - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?filters=is_admin") - - users = - [ - %{ - "deactivated" => false, - "id" => admin.id, - "nickname" => admin.nickname, - "roles" => %{"admin" => true, "moderator" => false}, - "local" => admin.local, - "tags" => [], - "avatar" => User.avatar_url(admin) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false - }, - %{ - "deactivated" => false, - "id" => second_admin.id, - "nickname" => second_admin.nickname, - "roles" => %{"admin" => true, "moderator" => false}, - "local" => second_admin.local, - "tags" => [], - "avatar" => User.avatar_url(second_admin) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(second_admin.name || second_admin.nickname), - "confirmation_pending" => false - } - ] - |> Enum.sort_by(& &1["nickname"]) - - assert json_response(conn, 200) == %{ - "count" => 2, - "page_size" => 50, - "users" => users - } - end - - test "load only moderators", %{conn: conn} do - moderator = insert(:user, is_moderator: true) - insert(:user) - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => false, - "id" => moderator.id, - "nickname" => moderator.nickname, - "roles" => %{"admin" => false, "moderator" => true}, - "local" => moderator.local, - "tags" => [], - "avatar" => User.avatar_url(moderator) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(moderator.name || moderator.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "load users with tags list", %{conn: conn} do - user1 = insert(:user, tags: ["first"]) - user2 = insert(:user, tags: ["second"]) - insert(:user) - insert(:user) - - conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second") - - users = - [ - %{ - "deactivated" => false, - "id" => user1.id, - "nickname" => user1.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => user1.local, - "tags" => ["first"], - "avatar" => User.avatar_url(user1) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user1.name || user1.nickname), - "confirmation_pending" => false - }, - %{ - "deactivated" => false, - "id" => user2.id, - "nickname" => user2.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => user2.local, - "tags" => ["second"], - "avatar" => User.avatar_url(user2) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user2.name || user2.nickname), - "confirmation_pending" => false - } - ] - |> Enum.sort_by(& &1["nickname"]) - - assert json_response(conn, 200) == %{ - "count" => 2, - "page_size" => 50, - "users" => users - } - end - - test "it works with multiple filters" do - admin = insert(:user, nickname: "john", is_admin: true) - token = insert(:oauth_admin_token, user: admin) - user = insert(:user, nickname: "bob", local: false, deactivated: true) - - insert(:user, nickname: "ken", local: true, deactivated: true) - insert(:user, nickname: "bobb", local: false, deactivated: false) - - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, token) - |> get("/api/pleroma/admin/users?filters=deactivated,external") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => user.local, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - ] - } - end - - test "it omits relay user", %{admin: admin, conn: conn} do - assert %User{} = Relay.get_actor() - - conn = get(conn, "/api/pleroma/admin/users") - - assert json_response(conn, 200) == %{ - "count" => 1, - "page_size" => 50, - "users" => [ - %{ - "deactivated" => admin.deactivated, - "id" => admin.id, - "nickname" => admin.nickname, - "roles" => %{"admin" => true, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(admin) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false - } - ] - } - end - end - - test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do - user_one = insert(:user, deactivated: true) - user_two = insert(:user, deactivated: true) - - conn = - patch( - conn, - "/api/pleroma/admin/users/activate", - %{nicknames: [user_one.nickname, user_two.nickname]} - ) - - response = json_response(conn, 200) - assert Enum.map(response["users"], & &1["deactivated"]) == [false, false] - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}" - end - - test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do - user_one = insert(:user, deactivated: false) - user_two = insert(:user, deactivated: false) - - conn = - patch( - conn, - "/api/pleroma/admin/users/deactivate", - %{nicknames: [user_one.nickname, user_two.nickname]} - ) - - response = json_response(conn, 200) - assert Enum.map(response["users"], & &1["deactivated"]) == [true, true] - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" - end - - test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do - user = insert(:user) - - conn = patch(conn, "/api/pleroma/admin/users/#{user.nickname}/toggle_activation") - - assert json_response(conn, 200) == - %{ - "deactivated" => !user.deactivated, - "id" => user.id, - "nickname" => user.nickname, - "roles" => %{"admin" => false, "moderator" => false}, - "local" => true, - "tags" => [], - "avatar" => User.avatar_url(user) |> MediaProxy.url(), - "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false - } - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deactivated users: @#{user.nickname}" - end - - describe "PUT disable_mfa" do - test "returns 200 and disable 2fa", %{conn: conn} do - user = - insert(:user, - multi_factor_authentication_settings: %MFA.Settings{ - enabled: true, - totp: %MFA.Settings.TOTP{secret: "otp_secret", confirmed: true} - } - ) - - response = - conn - |> put("/api/pleroma/admin/users/disable_mfa", %{nickname: user.nickname}) - |> json_response(200) - - assert response == user.nickname - mfa_settings = refresh_record(user).multi_factor_authentication_settings - - refute mfa_settings.enabled - refute mfa_settings.totp.confirmed - end - - test "returns 404 if user not found", %{conn: conn} do - response = - conn - |> put("/api/pleroma/admin/users/disable_mfa", %{nickname: "nickname"}) - |> json_response(404) - - assert response == "Not found" - end - end - - describe "POST /api/pleroma/admin/users/invite_token" do - test "without options", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/users/invite_token") - - invite_json = json_response(conn, 200) - invite = UserInviteToken.find_by_token!(invite_json["token"]) - refute invite.used - refute invite.expires_at - refute invite.max_use - assert invite.invite_type == "one_time" - end - - test "with expires_at", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/users/invite_token", %{ - "expires_at" => Date.to_string(Date.utc_today()) - }) - - invite_json = json_response(conn, 200) - invite = UserInviteToken.find_by_token!(invite_json["token"]) - - refute invite.used - assert invite.expires_at == Date.utc_today() - refute invite.max_use - assert invite.invite_type == "date_limited" - end - - test "with max_use", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/users/invite_token", %{"max_use" => 150}) - - invite_json = json_response(conn, 200) - invite = UserInviteToken.find_by_token!(invite_json["token"]) - refute invite.used - refute invite.expires_at - assert invite.max_use == 150 - assert invite.invite_type == "reusable" - end - - test "with max use and expires_at", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/users/invite_token", %{ - "max_use" => 150, - "expires_at" => Date.to_string(Date.utc_today()) - }) - - invite_json = json_response(conn, 200) - invite = UserInviteToken.find_by_token!(invite_json["token"]) - refute invite.used - assert invite.expires_at == Date.utc_today() - assert invite.max_use == 150 - assert invite.invite_type == "reusable_date_limited" - end - end - - describe "GET /api/pleroma/admin/users/invites" do - test "no invites", %{conn: conn} do - conn = get(conn, "/api/pleroma/admin/users/invites") - - assert json_response(conn, 200) == %{"invites" => []} - end - - test "with invite", %{conn: conn} do - {:ok, invite} = UserInviteToken.create_invite() - - conn = get(conn, "/api/pleroma/admin/users/invites") - - assert json_response(conn, 200) == %{ - "invites" => [ - %{ - "expires_at" => nil, - "id" => invite.id, - "invite_type" => "one_time", - "max_use" => nil, - "token" => invite.token, - "used" => false, - "uses" => 0 - } - ] - } - end - end - - describe "POST /api/pleroma/admin/users/revoke_invite" do - test "with token", %{conn: conn} do - {:ok, invite} = UserInviteToken.create_invite() - - conn = post(conn, "/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token}) - - assert json_response(conn, 200) == %{ - "expires_at" => nil, - "id" => invite.id, - "invite_type" => "one_time", - "max_use" => nil, - "token" => invite.token, - "used" => true, - "uses" => 0 - } - end - - test "with invalid token", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) - - assert json_response(conn, :not_found) == "Not found" - end - end - - describe "GET /api/pleroma/admin/reports/:id" do - test "returns report by its id", %{conn: conn} do - [reporter, target_user] = insert_pair(:user) - activity = insert(:note_activity, user: target_user) - - {:ok, %{id: report_id}} = - CommonAPI.report(reporter, %{ - account_id: target_user.id, - comment: "I feel offended", - status_ids: [activity.id] - }) - - response = - conn - |> get("/api/pleroma/admin/reports/#{report_id}") - |> json_response(:ok) - - assert response["id"] == report_id - end - - test "returns 404 when report id is invalid", %{conn: conn} do - conn = get(conn, "/api/pleroma/admin/reports/test") - - assert json_response(conn, :not_found) == "Not found" - end - end - - describe "PATCH /api/pleroma/admin/reports" do - setup do - [reporter, target_user] = insert_pair(:user) - activity = insert(:note_activity, user: target_user) - - {:ok, %{id: report_id}} = - CommonAPI.report(reporter, %{ - account_id: target_user.id, - comment: "I feel offended", - status_ids: [activity.id] - }) - - {:ok, %{id: second_report_id}} = - CommonAPI.report(reporter, %{ - account_id: target_user.id, - comment: "I feel very offended", - status_ids: [activity.id] - }) - - %{ - id: report_id, - second_report_id: second_report_id - } - end - - test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} do - read_token = insert(:oauth_token, user: admin, scopes: ["admin:read"]) - write_token = insert(:oauth_token, user: admin, scopes: ["admin:write:reports"]) - - response = - conn - |> assign(:token, read_token) - |> patch("/api/pleroma/admin/reports", %{ - "reports" => [%{"state" => "resolved", "id" => id}] - }) - |> json_response(403) - - assert response == %{ - "error" => "Insufficient permissions: admin:write:reports." - } - - conn - |> assign(:token, write_token) - |> patch("/api/pleroma/admin/reports", %{ - "reports" => [%{"state" => "resolved", "id" => id}] - }) - |> json_response(:no_content) - end - - test "mark report as resolved", %{conn: conn, id: id, admin: admin} do - conn - |> patch("/api/pleroma/admin/reports", %{ - "reports" => [ - %{"state" => "resolved", "id" => id} - ] - }) - |> json_response(:no_content) - - activity = Activity.get_by_id(id) - assert activity.data["state"] == "resolved" - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} updated report ##{id} with 'resolved' state" - end - - test "closes report", %{conn: conn, id: id, admin: admin} do - conn - |> patch("/api/pleroma/admin/reports", %{ - "reports" => [ - %{"state" => "closed", "id" => id} - ] - }) - |> json_response(:no_content) - - activity = Activity.get_by_id(id) - assert activity.data["state"] == "closed" - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} updated report ##{id} with 'closed' state" - end - - test "returns 400 when state is unknown", %{conn: conn, id: id} do - conn = - conn - |> patch("/api/pleroma/admin/reports", %{ - "reports" => [ - %{"state" => "test", "id" => id} - ] - }) - - assert hd(json_response(conn, :bad_request))["error"] == "Unsupported state" - end - - test "returns 404 when report is not exist", %{conn: conn} do - conn = - conn - |> patch("/api/pleroma/admin/reports", %{ - "reports" => [ - %{"state" => "closed", "id" => "test"} - ] - }) - - assert hd(json_response(conn, :bad_request))["error"] == "not_found" - end - - test "updates state of multiple reports", %{ - conn: conn, - id: id, - admin: admin, - second_report_id: second_report_id - } do - conn - |> patch("/api/pleroma/admin/reports", %{ - "reports" => [ - %{"state" => "resolved", "id" => id}, - %{"state" => "closed", "id" => second_report_id} - ] - }) - |> json_response(:no_content) - - activity = Activity.get_by_id(id) - second_activity = Activity.get_by_id(second_report_id) - assert activity.data["state"] == "resolved" - assert second_activity.data["state"] == "closed" - - [first_log_entry, second_log_entry] = Repo.all(ModerationLog) - - assert ModerationLog.get_log_entry_message(first_log_entry) == - "@#{admin.nickname} updated report ##{id} with 'resolved' state" - - assert ModerationLog.get_log_entry_message(second_log_entry) == - "@#{admin.nickname} updated report ##{second_report_id} with 'closed' state" - end - end - - describe "GET /api/pleroma/admin/reports" do - test "returns empty response when no reports created", %{conn: conn} do - response = - conn - |> get("/api/pleroma/admin/reports") - |> json_response(:ok) - - assert Enum.empty?(response["reports"]) - assert response["total"] == 0 - end - - test "returns reports", %{conn: conn} do - [reporter, target_user] = insert_pair(:user) - activity = insert(:note_activity, user: target_user) - - {:ok, %{id: report_id}} = - CommonAPI.report(reporter, %{ - account_id: target_user.id, - comment: "I feel offended", - status_ids: [activity.id] - }) - - response = - conn - |> get("/api/pleroma/admin/reports") - |> json_response(:ok) - - [report] = response["reports"] - - assert length(response["reports"]) == 1 - assert report["id"] == report_id - - assert response["total"] == 1 - end - - test "returns reports with specified state", %{conn: conn} do - [reporter, target_user] = insert_pair(:user) - activity = insert(:note_activity, user: target_user) - - {:ok, %{id: first_report_id}} = - CommonAPI.report(reporter, %{ - account_id: target_user.id, - comment: "I feel offended", - status_ids: [activity.id] - }) - - {:ok, %{id: second_report_id}} = - CommonAPI.report(reporter, %{ - account_id: target_user.id, - comment: "I don't like this user" - }) - - CommonAPI.update_report_state(second_report_id, "closed") - - response = - conn - |> get("/api/pleroma/admin/reports", %{ - "state" => "open" - }) - |> json_response(:ok) - - [open_report] = response["reports"] - - assert length(response["reports"]) == 1 - assert open_report["id"] == first_report_id - - assert response["total"] == 1 - - response = - conn - |> get("/api/pleroma/admin/reports", %{ - "state" => "closed" - }) - |> json_response(:ok) - - [closed_report] = response["reports"] - - assert length(response["reports"]) == 1 - assert closed_report["id"] == second_report_id - - assert response["total"] == 1 - - response = - conn - |> get("/api/pleroma/admin/reports", %{ - "state" => "resolved" - }) - |> json_response(:ok) - - assert Enum.empty?(response["reports"]) - assert response["total"] == 0 - end - - test "returns 403 when requested by a non-admin" do - user = insert(:user) - token = insert(:oauth_token, user: user) - - conn = - build_conn() - |> assign(:user, user) - |> assign(:token, token) - |> get("/api/pleroma/admin/reports") - - assert json_response(conn, :forbidden) == - %{"error" => "User is not an admin or OAuth admin scope is not granted."} - end - - test "returns 403 when requested by anonymous" do - conn = get(build_conn(), "/api/pleroma/admin/reports") - - assert json_response(conn, :forbidden) == %{"error" => "Invalid credentials."} - end - end - - describe "GET /api/pleroma/admin/statuses/:id" do - test "not found", %{conn: conn} do - assert conn - |> get("/api/pleroma/admin/statuses/not_found") - |> json_response(:not_found) - end - - test "shows activity", %{conn: conn} do - activity = insert(:note_activity) - - response = - conn - |> get("/api/pleroma/admin/statuses/#{activity.id}") - |> json_response(200) - - assert response["id"] == activity.id - end - end - - describe "PUT /api/pleroma/admin/statuses/:id" do - setup do - activity = insert(:note_activity) - - %{id: activity.id} - end - - test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"}) - |> json_response(:ok) - - assert response["sensitive"] - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} updated status ##{id}, set sensitive: 'true'" - - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"}) - |> json_response(:ok) - - refute response["sensitive"] - end - - test "change visibility flag", %{conn: conn, id: id, admin: admin} do - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "public"}) - |> json_response(:ok) - - assert response["visibility"] == "public" - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} updated status ##{id}, set visibility: 'public'" - - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "private"}) - |> json_response(:ok) - - assert response["visibility"] == "private" - - response = - conn - |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "unlisted"}) - |> json_response(:ok) - - assert response["visibility"] == "unlisted" - end - - test "returns 400 when visibility is unknown", %{conn: conn, id: id} do - conn = put(conn, "/api/pleroma/admin/statuses/#{id}", %{visibility: "test"}) - - assert json_response(conn, :bad_request) == "Unsupported visibility" - end - end - - describe "DELETE /api/pleroma/admin/statuses/:id" do - setup do - activity = insert(:note_activity) - - %{id: activity.id} - end - - test "deletes status", %{conn: conn, id: id, admin: admin} do - conn - |> delete("/api/pleroma/admin/statuses/#{id}") - |> json_response(:ok) - - refute Activity.get_by_id(id) - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} deleted status ##{id}" - end - - test "returns 404 when the status does not exist", %{conn: conn} do - conn = delete(conn, "/api/pleroma/admin/statuses/test") - - assert json_response(conn, :not_found) == "Not found" - end - end - - describe "GET /api/pleroma/admin/config" do - setup do: clear_config(:configurable_from_database, true) - - test "when configuration from database is off", %{conn: conn} do - Config.put(:configurable_from_database, false) - conn = get(conn, "/api/pleroma/admin/config") - - assert json_response(conn, 400) == - "To use this endpoint you need to enable configuration from database." - end - - test "with settings only in db", %{conn: conn} do - config1 = insert(:config) - config2 = insert(:config) - - conn = get(conn, "/api/pleroma/admin/config", %{"only_db" => true}) - - %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => key1, - "value" => _ - }, - %{ - "group" => ":pleroma", - "key" => key2, - "value" => _ - } - ] - } = json_response(conn, 200) - - assert key1 == config1.key - assert key2 == config2.key - end - - test "db is added to settings that are in db", %{conn: conn} do - _config = insert(:config, key: ":instance", value: ConfigDB.to_binary(name: "Some name")) - - %{"configs" => configs} = - conn - |> get("/api/pleroma/admin/config") - |> json_response(200) - - [instance_config] = - Enum.filter(configs, fn %{"group" => group, "key" => key} -> - group == ":pleroma" and key == ":instance" - end) - - assert instance_config["db"] == [":name"] - end - - test "merged default setting with db settings", %{conn: conn} do - config1 = insert(:config) - config2 = insert(:config) - - config3 = - insert(:config, - value: ConfigDB.to_binary(k1: :v1, k2: :v2) - ) - - %{"configs" => configs} = - conn - |> get("/api/pleroma/admin/config") - |> json_response(200) - - assert length(configs) > 3 - - received_configs = - Enum.filter(configs, fn %{"group" => group, "key" => key} -> - group == ":pleroma" and key in [config1.key, config2.key, config3.key] - end) - - assert length(received_configs) == 3 - - db_keys = - config3.value - |> ConfigDB.from_binary() - |> Keyword.keys() - |> ConfigDB.convert() - - Enum.each(received_configs, fn %{"value" => value, "db" => db} -> - assert db in [[config1.key], [config2.key], db_keys] - - assert value in [ - ConfigDB.from_binary_with_convert(config1.value), - ConfigDB.from_binary_with_convert(config2.value), - ConfigDB.from_binary_with_convert(config3.value) - ] - end) - end - - test "subkeys with full update right merge", %{conn: conn} do - config1 = - insert(:config, - key: ":emoji", - value: ConfigDB.to_binary(groups: [a: 1, b: 2], key: [a: 1]) - ) - - config2 = - insert(:config, - key: ":assets", - value: ConfigDB.to_binary(mascots: [a: 1, b: 2], key: [a: 1]) - ) - - %{"configs" => configs} = - conn - |> get("/api/pleroma/admin/config") - |> json_response(200) - - vals = - Enum.filter(configs, fn %{"group" => group, "key" => key} -> - group == ":pleroma" and key in [config1.key, config2.key] - end) - - emoji = Enum.find(vals, fn %{"key" => key} -> key == ":emoji" end) - assets = Enum.find(vals, fn %{"key" => key} -> key == ":assets" end) - - emoji_val = ConfigDB.transform_with_out_binary(emoji["value"]) - assets_val = ConfigDB.transform_with_out_binary(assets["value"]) - - assert emoji_val[:groups] == [a: 1, b: 2] - assert assets_val[:mascots] == [a: 1, b: 2] - end - end - - test "POST /api/pleroma/admin/config error", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/config", %{"configs" => []}) - - assert json_response(conn, 400) == - "To use this endpoint you need to enable configuration from database." - end - - describe "POST /api/pleroma/admin/config" do - setup do - http = Application.get_env(:pleroma, :http) - - on_exit(fn -> - Application.delete_env(:pleroma, :key1) - Application.delete_env(:pleroma, :key2) - Application.delete_env(:pleroma, :key3) - Application.delete_env(:pleroma, :key4) - Application.delete_env(:pleroma, :keyaa1) - Application.delete_env(:pleroma, :keyaa2) - Application.delete_env(:pleroma, Pleroma.Web.Endpoint.NotReal) - Application.delete_env(:pleroma, Pleroma.Captcha.NotReal) - Application.put_env(:pleroma, :http, http) - Application.put_env(:tesla, :adapter, Tesla.Mock) - Restarter.Pleroma.refresh() - end) - end - - setup do: clear_config(:configurable_from_database, true) - - @tag capture_log: true - test "create new config setting in db", %{conn: conn} do - ueberauth = Application.get_env(:ueberauth, Ueberauth) - on_exit(fn -> Application.put_env(:ueberauth, Ueberauth, ueberauth) end) - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{group: ":pleroma", key: ":key1", value: "value1"}, - %{ - group: ":ueberauth", - key: "Ueberauth", - value: [%{"tuple" => [":consumer_secret", "aaaa"]}] - }, - %{ - group: ":pleroma", - key: ":key2", - value: %{ - ":nested_1" => "nested_value1", - ":nested_2" => [ - %{":nested_22" => "nested_value222"}, - %{":nested_33" => %{":nested_44" => "nested_444"}} - ] - } - }, - %{ - group: ":pleroma", - key: ":key3", - value: [ - %{"nested_3" => ":nested_3", "nested_33" => "nested_33"}, - %{"nested_4" => true} - ] - }, - %{ - group: ":pleroma", - key: ":key4", - value: %{":nested_5" => ":upload", "endpoint" => "https://example.com"} - }, - %{ - group: ":idna", - key: ":key5", - value: %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]} - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => "value1", - "db" => [":key1"] - }, - %{ - "group" => ":ueberauth", - "key" => "Ueberauth", - "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}], - "db" => [":consumer_secret"] - }, - %{ - "group" => ":pleroma", - "key" => ":key2", - "value" => %{ - ":nested_1" => "nested_value1", - ":nested_2" => [ - %{":nested_22" => "nested_value222"}, - %{":nested_33" => %{":nested_44" => "nested_444"}} - ] - }, - "db" => [":key2"] - }, - %{ - "group" => ":pleroma", - "key" => ":key3", - "value" => [ - %{"nested_3" => ":nested_3", "nested_33" => "nested_33"}, - %{"nested_4" => true} - ], - "db" => [":key3"] - }, - %{ - "group" => ":pleroma", - "key" => ":key4", - "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"}, - "db" => [":key4"] - }, - %{ - "group" => ":idna", - "key" => ":key5", - "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}, - "db" => [":key5"] - } - ] - } - - assert Application.get_env(:pleroma, :key1) == "value1" - - assert Application.get_env(:pleroma, :key2) == %{ - nested_1: "nested_value1", - nested_2: [ - %{nested_22: "nested_value222"}, - %{nested_33: %{nested_44: "nested_444"}} - ] - } - - assert Application.get_env(:pleroma, :key3) == [ - %{"nested_3" => :nested_3, "nested_33" => "nested_33"}, - %{"nested_4" => true} - ] - - assert Application.get_env(:pleroma, :key4) == %{ - "endpoint" => "https://example.com", - nested_5: :upload - } - - assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []} - end - - test "save configs setting without explicit key", %{conn: conn} do - level = Application.get_env(:quack, :level) - meta = Application.get_env(:quack, :meta) - webhook_url = Application.get_env(:quack, :webhook_url) - - on_exit(fn -> - Application.put_env(:quack, :level, level) - Application.put_env(:quack, :meta, meta) - Application.put_env(:quack, :webhook_url, webhook_url) - end) - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - group: ":quack", - key: ":level", - value: ":info" - }, - %{ - group: ":quack", - key: ":meta", - value: [":none"] - }, - %{ - group: ":quack", - key: ":webhook_url", - value: "https://hooks.slack.com/services/KEY" - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":quack", - "key" => ":level", - "value" => ":info", - "db" => [":level"] - }, - %{ - "group" => ":quack", - "key" => ":meta", - "value" => [":none"], - "db" => [":meta"] - }, - %{ - "group" => ":quack", - "key" => ":webhook_url", - "value" => "https://hooks.slack.com/services/KEY", - "db" => [":webhook_url"] - } - ] - } - - assert Application.get_env(:quack, :level) == :info - assert Application.get_env(:quack, :meta) == [:none] - assert Application.get_env(:quack, :webhook_url) == "https://hooks.slack.com/services/KEY" - end - - test "saving config with partial update", %{conn: conn} do - config = insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: 2)) - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{group: config.group, key: config.key, value: [%{"tuple" => [":key3", 3]}]} - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => [ - %{"tuple" => [":key1", 1]}, - %{"tuple" => [":key2", 2]}, - %{"tuple" => [":key3", 3]} - ], - "db" => [":key1", ":key2", ":key3"] - } - ] - } - end - - test "saving config which need pleroma reboot", %{conn: conn} do - chat = Config.get(:chat) - on_exit(fn -> Config.put(:chat, chat) end) - - assert post( - conn, - "/api/pleroma/admin/config", - %{ - configs: [ - %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} - ] - } - ) - |> json_response(200) == %{ - "configs" => [ - %{ - "db" => [":enabled"], - "group" => ":pleroma", - "key" => ":chat", - "value" => [%{"tuple" => [":enabled", true]}] - } - ], - "need_reboot" => true - } - - configs = - conn - |> get("/api/pleroma/admin/config") - |> json_response(200) - - assert configs["need_reboot"] - - capture_log(fn -> - assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} - end) =~ "pleroma restarted" - - configs = - conn - |> get("/api/pleroma/admin/config") - |> json_response(200) - - assert configs["need_reboot"] == false - end - - test "update setting which need reboot, don't change reboot flag until reboot", %{conn: conn} do - chat = Config.get(:chat) - on_exit(fn -> Config.put(:chat, chat) end) - - assert post( - conn, - "/api/pleroma/admin/config", - %{ - configs: [ - %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} - ] - } - ) - |> json_response(200) == %{ - "configs" => [ - %{ - "db" => [":enabled"], - "group" => ":pleroma", - "key" => ":chat", - "value" => [%{"tuple" => [":enabled", true]}] - } - ], - "need_reboot" => true - } - - assert post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]} - ] - }) - |> json_response(200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => [ - %{"tuple" => [":key3", 3]} - ], - "db" => [":key3"] - } - ], - "need_reboot" => true - } - - capture_log(fn -> - assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} - end) =~ "pleroma restarted" - - configs = - conn - |> get("/api/pleroma/admin/config") - |> json_response(200) - - assert configs["need_reboot"] == false - end - - test "saving config with nested merge", %{conn: conn} do - config = - insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: [k1: 1, k2: 2])) - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - group: config.group, - key: config.key, - value: [ - %{"tuple" => [":key3", 3]}, - %{ - "tuple" => [ - ":key2", - [ - %{"tuple" => [":k2", 1]}, - %{"tuple" => [":k3", 3]} - ] - ] - } - ] - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => [ - %{"tuple" => [":key1", 1]}, - %{"tuple" => [":key3", 3]}, - %{ - "tuple" => [ - ":key2", - [ - %{"tuple" => [":k1", 1]}, - %{"tuple" => [":k2", 1]}, - %{"tuple" => [":k3", 3]} - ] - ] - } - ], - "db" => [":key1", ":key3", ":key2"] - } - ] - } - end - - test "saving special atoms", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => [ - %{ - "tuple" => [ - ":ssl_options", - [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}] - ] - } - ] - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => [ - %{ - "tuple" => [ - ":ssl_options", - [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}] - ] - } - ], - "db" => [":ssl_options"] - } - ] - } - - assert Application.get_env(:pleroma, :key1) == [ - ssl_options: [versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"]] - ] - end - - test "saving full setting if value is in full_key_update list", %{conn: conn} do - backends = Application.get_env(:logger, :backends) - on_exit(fn -> Application.put_env(:logger, :backends, backends) end) - - config = - insert(:config, - group: ":logger", - key: ":backends", - value: :erlang.term_to_binary([]) - ) - - Pleroma.Config.TransferTask.load_and_update_env([], false) - - assert Application.get_env(:logger, :backends) == [] - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - group: config.group, - key: config.key, - value: [":console"] - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":logger", - "key" => ":backends", - "value" => [ - ":console" - ], - "db" => [":backends"] - } - ] - } - - assert Application.get_env(:logger, :backends) == [ - :console - ] - end - - test "saving full setting if value is not keyword", %{conn: conn} do - config = - insert(:config, - group: ":tesla", - key: ":adapter", - value: :erlang.term_to_binary(Tesla.Adapter.Hackey) - ) - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{group: config.group, key: config.key, value: "Tesla.Adapter.Httpc"} - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":tesla", - "key" => ":adapter", - "value" => "Tesla.Adapter.Httpc", - "db" => [":adapter"] - } - ] - } - end - - test "update config setting & delete with fallback to default value", %{ - conn: conn, - admin: admin, - token: token - } do - ueberauth = Application.get_env(:ueberauth, Ueberauth) - config1 = insert(:config, key: ":keyaa1") - config2 = insert(:config, key: ":keyaa2") - - config3 = - insert(:config, - group: ":ueberauth", - key: "Ueberauth" - ) - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{group: config1.group, key: config1.key, value: "another_value"}, - %{group: config2.group, key: config2.key, value: "another_value"} - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => config1.key, - "value" => "another_value", - "db" => [":keyaa1"] - }, - %{ - "group" => ":pleroma", - "key" => config2.key, - "value" => "another_value", - "db" => [":keyaa2"] - } - ] - } - - assert Application.get_env(:pleroma, :keyaa1) == "another_value" - assert Application.get_env(:pleroma, :keyaa2) == "another_value" - assert Application.get_env(:ueberauth, Ueberauth) == ConfigDB.from_binary(config3.value) - - conn = - build_conn() - |> assign(:user, admin) - |> assign(:token, token) - |> post("/api/pleroma/admin/config", %{ - configs: [ - %{group: config2.group, key: config2.key, delete: true}, - %{ - group: ":ueberauth", - key: "Ueberauth", - delete: true - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [] - } - - assert Application.get_env(:ueberauth, Ueberauth) == ueberauth - refute Keyword.has_key?(Application.get_all_env(:pleroma), :keyaa2) - end - - test "common config example", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - "group" => ":pleroma", - "key" => "Pleroma.Captcha.NotReal", - "value" => [ - %{"tuple" => [":enabled", false]}, - %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]}, - %{"tuple" => [":seconds_valid", 60]}, - %{"tuple" => [":path", ""]}, - %{"tuple" => [":key1", nil]}, - %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}, - %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]}, - %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]}, - %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]}, - %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]}, - %{"tuple" => [":name", "Pleroma"]} - ] - } - ] - }) - - assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma" - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => "Pleroma.Captcha.NotReal", - "value" => [ - %{"tuple" => [":enabled", false]}, - %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]}, - %{"tuple" => [":seconds_valid", 60]}, - %{"tuple" => [":path", ""]}, - %{"tuple" => [":key1", nil]}, - %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}, - %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]}, - %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]}, - %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]}, - %{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]}, - %{"tuple" => [":name", "Pleroma"]} - ], - "db" => [ - ":enabled", - ":method", - ":seconds_valid", - ":path", - ":key1", - ":partial_chain", - ":regex1", - ":regex2", - ":regex3", - ":regex4", - ":name" - ] - } - ] - } - end - - test "tuples with more than two values", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - "group" => ":pleroma", - "key" => "Pleroma.Web.Endpoint.NotReal", - "value" => [ - %{ - "tuple" => [ - ":http", - [ - %{ - "tuple" => [ - ":key2", - [ - %{ - "tuple" => [ - ":_", - [ - %{ - "tuple" => [ - "/api/v1/streaming", - "Pleroma.Web.MastodonAPI.WebsocketHandler", - [] - ] - }, - %{ - "tuple" => [ - "/websocket", - "Phoenix.Endpoint.CowboyWebSocket", - %{ - "tuple" => [ - "Phoenix.Transports.WebSocket", - %{ - "tuple" => [ - "Pleroma.Web.Endpoint", - "Pleroma.Web.UserSocket", - [] - ] - } - ] - } - ] - }, - %{ - "tuple" => [ - ":_", - "Phoenix.Endpoint.Cowboy2Handler", - %{"tuple" => ["Pleroma.Web.Endpoint", []]} - ] - } - ] - ] - } - ] - ] - } - ] - ] - } - ] - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => "Pleroma.Web.Endpoint.NotReal", - "value" => [ - %{ - "tuple" => [ - ":http", - [ - %{ - "tuple" => [ - ":key2", - [ - %{ - "tuple" => [ - ":_", - [ - %{ - "tuple" => [ - "/api/v1/streaming", - "Pleroma.Web.MastodonAPI.WebsocketHandler", - [] - ] - }, - %{ - "tuple" => [ - "/websocket", - "Phoenix.Endpoint.CowboyWebSocket", - %{ - "tuple" => [ - "Phoenix.Transports.WebSocket", - %{ - "tuple" => [ - "Pleroma.Web.Endpoint", - "Pleroma.Web.UserSocket", - [] - ] - } - ] - } - ] - }, - %{ - "tuple" => [ - ":_", - "Phoenix.Endpoint.Cowboy2Handler", - %{"tuple" => ["Pleroma.Web.Endpoint", []]} - ] - } - ] - ] - } - ] - ] - } - ] - ] - } - ], - "db" => [":http"] - } - ] - } - end - - test "settings with nesting map", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => [ - %{"tuple" => [":key2", "some_val"]}, - %{ - "tuple" => [ - ":key3", - %{ - ":max_options" => 20, - ":max_option_chars" => 200, - ":min_expiration" => 0, - ":max_expiration" => 31_536_000, - "nested" => %{ - ":max_options" => 20, - ":max_option_chars" => 200, - ":min_expiration" => 0, - ":max_expiration" => 31_536_000 - } - } - ] - } - ] - } - ] - }) - - assert json_response(conn, 200) == - %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => [ - %{"tuple" => [":key2", "some_val"]}, - %{ - "tuple" => [ - ":key3", - %{ - ":max_expiration" => 31_536_000, - ":max_option_chars" => 200, - ":max_options" => 20, - ":min_expiration" => 0, - "nested" => %{ - ":max_expiration" => 31_536_000, - ":max_option_chars" => 200, - ":max_options" => 20, - ":min_expiration" => 0 - } - } - ] - } - ], - "db" => [":key2", ":key3"] - } - ] - } - end - - test "value as map", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => %{"key" => "some_val"} - } - ] - }) - - assert json_response(conn, 200) == - %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":key1", - "value" => %{"key" => "some_val"}, - "db" => [":key1"] - } - ] - } - end - - test "queues key as atom", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - "group" => ":oban", - "key" => ":queues", - "value" => [ - %{"tuple" => [":federator_incoming", 50]}, - %{"tuple" => [":federator_outgoing", 50]}, - %{"tuple" => [":web_push", 50]}, - %{"tuple" => [":mailer", 10]}, - %{"tuple" => [":transmogrifier", 20]}, - %{"tuple" => [":scheduled_activities", 10]}, - %{"tuple" => [":background", 5]} - ] - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":oban", - "key" => ":queues", - "value" => [ - %{"tuple" => [":federator_incoming", 50]}, - %{"tuple" => [":federator_outgoing", 50]}, - %{"tuple" => [":web_push", 50]}, - %{"tuple" => [":mailer", 10]}, - %{"tuple" => [":transmogrifier", 20]}, - %{"tuple" => [":scheduled_activities", 10]}, - %{"tuple" => [":background", 5]} - ], - "db" => [ - ":federator_incoming", - ":federator_outgoing", - ":web_push", - ":mailer", - ":transmogrifier", - ":scheduled_activities", - ":background" - ] - } - ] - } - end - - test "delete part of settings by atom subkeys", %{conn: conn} do - config = - insert(:config, - key: ":keyaa1", - value: :erlang.term_to_binary(subkey1: "val1", subkey2: "val2", subkey3: "val3") - ) - - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - group: config.group, - key: config.key, - subkeys: [":subkey1", ":subkey3"], - delete: true - } - ] - }) - - assert json_response(conn, 200) == %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":keyaa1", - "value" => [%{"tuple" => [":subkey2", "val2"]}], - "db" => [":subkey2"] - } - ] - } - end - - test "proxy tuple localhost", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - group: ":pleroma", - key: ":http", - value: [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} - ] - } - ] - }) - - assert %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":http", - "value" => value, - "db" => db - } - ] - } = json_response(conn, 200) - - assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} in value - assert ":proxy_url" in db - end - - test "proxy tuple domain", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - group: ":pleroma", - key: ":http", - value: [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} - ] - } - ] - }) - - assert %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":http", - "value" => value, - "db" => db - } - ] - } = json_response(conn, 200) - - assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} in value - assert ":proxy_url" in db - end - - test "proxy tuple ip", %{conn: conn} do - conn = - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{ - group: ":pleroma", - key: ":http", - value: [ - %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} - ] - } - ] - }) - - assert %{ - "configs" => [ - %{ - "group" => ":pleroma", - "key" => ":http", - "value" => value, - "db" => db - } - ] - } = json_response(conn, 200) - - assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} in value - assert ":proxy_url" in db - end - - test "doesn't set keys not in the whitelist", %{conn: conn} do - clear_config(:database_config_whitelist, [ - {:pleroma, :key1}, - {:pleroma, :key2}, - {:pleroma, Pleroma.Captcha.NotReal}, - {:not_real} - ]) - - post(conn, "/api/pleroma/admin/config", %{ - configs: [ - %{group: ":pleroma", key: ":key1", value: "value1"}, - %{group: ":pleroma", key: ":key2", value: "value2"}, - %{group: ":pleroma", key: ":key3", value: "value3"}, - %{group: ":pleroma", key: "Pleroma.Web.Endpoint.NotReal", value: "value4"}, - %{group: ":pleroma", key: "Pleroma.Captcha.NotReal", value: "value5"}, - %{group: ":not_real", key: ":anything", value: "value6"} - ] - }) - - assert Application.get_env(:pleroma, :key1) == "value1" - assert Application.get_env(:pleroma, :key2) == "value2" - assert Application.get_env(:pleroma, :key3) == nil - assert Application.get_env(:pleroma, Pleroma.Web.Endpoint.NotReal) == nil - assert Application.get_env(:pleroma, Pleroma.Captcha.NotReal) == "value5" - assert Application.get_env(:not_real, :anything) == "value6" - end - end - - describe "GET /api/pleroma/admin/restart" do - setup do: clear_config(:configurable_from_database, true) - - test "pleroma restarts", %{conn: conn} do - capture_log(fn -> - assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} - end) =~ "pleroma restarted" - - refute Restarter.Pleroma.need_reboot?() - end - end - - test "need_reboot flag", %{conn: conn} do - assert conn - |> get("/api/pleroma/admin/need_reboot") - |> json_response(200) == %{"need_reboot" => false} - - Restarter.Pleroma.need_reboot() - - assert conn - |> get("/api/pleroma/admin/need_reboot") - |> json_response(200) == %{"need_reboot" => true} - - on_exit(fn -> Restarter.Pleroma.refresh() end) - end - - describe "GET /api/pleroma/admin/statuses" do - test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do - blocked = insert(:user) - user = insert(:user) - User.block(admin, blocked) - - {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"}) - - {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"}) - {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"}) - {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"}) - {:ok, _} = CommonAPI.post(blocked, %{status: ".", visibility: "public"}) - - response = - conn - |> get("/api/pleroma/admin/statuses") - |> json_response(200) - - refute "private" in Enum.map(response, & &1["visibility"]) - assert length(response) == 3 - end - - test "returns only local statuses with local_only on", %{conn: conn} do - user = insert(:user) - remote_user = insert(:user, local: false, nickname: "archaeme@archae.me") - insert(:note_activity, user: user, local: true) - insert(:note_activity, user: remote_user, local: false) - - response = - conn - |> get("/api/pleroma/admin/statuses?local_only=true") - |> json_response(200) - - assert length(response) == 1 - end - - test "returns private and direct statuses with godmode on", %{conn: conn, admin: admin} do - user = insert(:user) - - {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"}) - - {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"}) - {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"}) - conn = get(conn, "/api/pleroma/admin/statuses?godmode=true") - assert json_response(conn, 200) |> length() == 3 - end - end - - describe "GET /api/pleroma/admin/users/:nickname/statuses" do - setup do - user = insert(:user) - - date1 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() - date2 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!() - date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!() - - insert(:note_activity, user: user, published: date1) - insert(:note_activity, user: user, published: date2) - insert(:note_activity, user: user, published: date3) - - %{user: user} - end - - test "renders user's statuses", %{conn: conn, user: user} do - conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") - - assert json_response(conn, 200) |> length() == 3 - end - - test "renders user's statuses with a limit", %{conn: conn, user: user} do - conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?page_size=2") - - assert json_response(conn, 200) |> length() == 2 - end - - test "doesn't return private statuses by default", %{conn: conn, user: user} do - {:ok, _private_status} = CommonAPI.post(user, %{status: "private", visibility: "private"}) - - {:ok, _public_status} = CommonAPI.post(user, %{status: "public", visibility: "public"}) - - conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") - - assert json_response(conn, 200) |> length() == 4 - end - - test "returns private statuses with godmode on", %{conn: conn, user: user} do - {:ok, _private_status} = CommonAPI.post(user, %{status: "private", visibility: "private"}) - - {:ok, _public_status} = CommonAPI.post(user, %{status: "public", visibility: "public"}) - - conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?godmode=true") - - assert json_response(conn, 200) |> length() == 5 - end - - test "excludes reblogs by default", %{conn: conn, user: user} do - other_user = insert(:user) - {:ok, activity} = CommonAPI.post(user, %{status: "."}) - {:ok, %Activity{}, _} = CommonAPI.repeat(activity.id, other_user) - - conn_res = get(conn, "/api/pleroma/admin/users/#{other_user.nickname}/statuses") - assert json_response(conn_res, 200) |> length() == 0 - - conn_res = - get(conn, "/api/pleroma/admin/users/#{other_user.nickname}/statuses?with_reblogs=true") - - assert json_response(conn_res, 200) |> length() == 1 - end - end - - describe "GET /api/pleroma/admin/moderation_log" do - setup do - moderator = insert(:user, is_moderator: true) - - %{moderator: moderator} - end - - test "returns the log", %{conn: conn, admin: admin} do - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => admin.id, - "nickname" => admin.nickname, - "type" => "user" - }, - action: "relay_follow", - target: "https://example.org/relay" - }, - inserted_at: NaiveDateTime.truncate(~N[2017-08-15 15:47:06.597036], :second) - }) - - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => admin.id, - "nickname" => admin.nickname, - "type" => "user" - }, - action: "relay_unfollow", - target: "https://example.org/relay" - }, - inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second) - }) - - conn = get(conn, "/api/pleroma/admin/moderation_log") - - response = json_response(conn, 200) - [first_entry, second_entry] = response["items"] - - assert response["total"] == 2 - assert first_entry["data"]["action"] == "relay_unfollow" - - assert first_entry["message"] == - "@#{admin.nickname} unfollowed relay: https://example.org/relay" - - assert second_entry["data"]["action"] == "relay_follow" - - assert second_entry["message"] == - "@#{admin.nickname} followed relay: https://example.org/relay" - end - - test "returns the log with pagination", %{conn: conn, admin: admin} do - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => admin.id, - "nickname" => admin.nickname, - "type" => "user" - }, - action: "relay_follow", - target: "https://example.org/relay" - }, - inserted_at: NaiveDateTime.truncate(~N[2017-08-15 15:47:06.597036], :second) - }) - - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => admin.id, - "nickname" => admin.nickname, - "type" => "user" - }, - action: "relay_unfollow", - target: "https://example.org/relay" - }, - inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second) - }) - - conn1 = get(conn, "/api/pleroma/admin/moderation_log?page_size=1&page=1") - - response1 = json_response(conn1, 200) - [first_entry] = response1["items"] - - assert response1["total"] == 2 - assert response1["items"] |> length() == 1 - assert first_entry["data"]["action"] == "relay_unfollow" - - assert first_entry["message"] == - "@#{admin.nickname} unfollowed relay: https://example.org/relay" - - conn2 = get(conn, "/api/pleroma/admin/moderation_log?page_size=1&page=2") - - response2 = json_response(conn2, 200) - [second_entry] = response2["items"] - - assert response2["total"] == 2 - assert response2["items"] |> length() == 1 - assert second_entry["data"]["action"] == "relay_follow" - - assert second_entry["message"] == - "@#{admin.nickname} followed relay: https://example.org/relay" - end - - test "filters log by date", %{conn: conn, admin: admin} do - first_date = "2017-08-15T15:47:06Z" - second_date = "2017-08-20T15:47:06Z" - - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => admin.id, - "nickname" => admin.nickname, - "type" => "user" - }, - action: "relay_follow", - target: "https://example.org/relay" - }, - inserted_at: NaiveDateTime.from_iso8601!(first_date) - }) - - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => admin.id, - "nickname" => admin.nickname, - "type" => "user" - }, - action: "relay_unfollow", - target: "https://example.org/relay" - }, - inserted_at: NaiveDateTime.from_iso8601!(second_date) - }) - - conn1 = - get( - conn, - "/api/pleroma/admin/moderation_log?start_date=#{second_date}" - ) - - response1 = json_response(conn1, 200) - [first_entry] = response1["items"] - - assert response1["total"] == 1 - assert first_entry["data"]["action"] == "relay_unfollow" - - assert first_entry["message"] == - "@#{admin.nickname} unfollowed relay: https://example.org/relay" - end - - test "returns log filtered by user", %{conn: conn, admin: admin, moderator: moderator} do - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => admin.id, - "nickname" => admin.nickname, - "type" => "user" - }, - action: "relay_follow", - target: "https://example.org/relay" - } - }) - - Repo.insert(%ModerationLog{ - data: %{ - actor: %{ - "id" => moderator.id, - "nickname" => moderator.nickname, - "type" => "user" - }, - action: "relay_unfollow", - target: "https://example.org/relay" - } - }) - - conn1 = get(conn, "/api/pleroma/admin/moderation_log?user_id=#{moderator.id}") - - response1 = json_response(conn1, 200) - [first_entry] = response1["items"] - - assert response1["total"] == 1 - assert get_in(first_entry, ["data", "actor", "id"]) == moderator.id - end - - test "returns log filtered by search", %{conn: conn, moderator: moderator} do - ModerationLog.insert_log(%{ - actor: moderator, - action: "relay_follow", - target: "https://example.org/relay" - }) - - ModerationLog.insert_log(%{ - actor: moderator, - action: "relay_unfollow", - target: "https://example.org/relay" - }) - - conn1 = get(conn, "/api/pleroma/admin/moderation_log?search=unfo") - - response1 = json_response(conn1, 200) - [first_entry] = response1["items"] - - assert response1["total"] == 1 - - assert get_in(first_entry, ["data", "message"]) == - "@#{moderator.nickname} unfollowed relay: https://example.org/relay" - end - end - - describe "GET /users/:nickname/credentials" do - test "gets the user credentials", %{conn: conn} do - user = insert(:user) - conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials") - - response = assert json_response(conn, 200) - assert response["email"] == user.email - end - - test "returns 403 if requested by a non-admin" do - user = insert(:user) - - conn = - build_conn() - |> assign(:user, user) - |> get("/api/pleroma/admin/users/#{user.nickname}/credentials") - - assert json_response(conn, :forbidden) - end - end - - describe "PATCH /users/:nickname/credentials" do - test "changes password and email", %{conn: conn, admin: admin} do - user = insert(:user) - assert user.password_reset_pending == false - - conn = - patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ - "password" => "new_password", - "email" => "new_email@example.com", - "name" => "new_name" - }) - - assert json_response(conn, 200) == %{"status" => "success"} - - ObanHelpers.perform_all() - - updated_user = User.get_by_id(user.id) - - assert updated_user.email == "new_email@example.com" - assert updated_user.name == "new_name" - assert updated_user.password_hash != user.password_hash - assert updated_user.password_reset_pending == true - - [log_entry2, log_entry1] = ModerationLog |> Repo.all() |> Enum.sort() - - assert ModerationLog.get_log_entry_message(log_entry1) == - "@#{admin.nickname} updated users: @#{user.nickname}" - - assert ModerationLog.get_log_entry_message(log_entry2) == - "@#{admin.nickname} forced password reset for users: @#{user.nickname}" - end - - test "returns 403 if requested by a non-admin" do - user = insert(:user) - - conn = - build_conn() - |> assign(:user, user) - |> patch("/api/pleroma/admin/users/#{user.nickname}/credentials", %{ - "password" => "new_password", - "email" => "new_email@example.com", - "name" => "new_name" - }) - - assert json_response(conn, :forbidden) - end - end - - describe "PATCH /users/:nickname/force_password_reset" do - test "sets password_reset_pending to true", %{conn: conn} do - user = insert(:user) - assert user.password_reset_pending == false - - conn = - patch(conn, "/api/pleroma/admin/users/force_password_reset", %{nicknames: [user.nickname]}) - - assert json_response(conn, 204) == "" - - ObanHelpers.perform_all() - - assert User.get_by_id(user.id).password_reset_pending == true - end - end - - describe "relays" do - test "POST /relay", %{conn: conn, admin: admin} do - conn = - post(conn, "/api/pleroma/admin/relay", %{ - relay_url: "http://mastodon.example.org/users/admin" - }) - - assert json_response(conn, 200) == "http://mastodon.example.org/users/admin" - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} followed relay: http://mastodon.example.org/users/admin" - end - - test "GET /relay", %{conn: conn} do - relay_user = Pleroma.Web.ActivityPub.Relay.get_actor() - - ["http://mastodon.example.org/users/admin", "https://mstdn.io/users/mayuutann"] - |> Enum.each(fn ap_id -> - {:ok, user} = User.get_or_fetch_by_ap_id(ap_id) - User.follow(relay_user, user) - end) - - conn = get(conn, "/api/pleroma/admin/relay") - - assert json_response(conn, 200)["relays"] -- ["mastodon.example.org", "mstdn.io"] == [] - end - - test "DELETE /relay", %{conn: conn, admin: admin} do - post(conn, "/api/pleroma/admin/relay", %{ - relay_url: "http://mastodon.example.org/users/admin" - }) - - conn = - delete(conn, "/api/pleroma/admin/relay", %{ - relay_url: "http://mastodon.example.org/users/admin" - }) - - assert json_response(conn, 200) == "http://mastodon.example.org/users/admin" - - [log_entry_one, log_entry_two] = Repo.all(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry_one) == - "@#{admin.nickname} followed relay: http://mastodon.example.org/users/admin" - - assert ModerationLog.get_log_entry_message(log_entry_two) == - "@#{admin.nickname} unfollowed relay: http://mastodon.example.org/users/admin" - end - end - - describe "instances" do - test "GET /instances/:instance/statuses", %{conn: conn} do - user = insert(:user, local: false, nickname: "archaeme@archae.me") - user2 = insert(:user, local: false, nickname: "test@test.com") - insert_pair(:note_activity, user: user) - activity = insert(:note_activity, user: user2) - - ret_conn = get(conn, "/api/pleroma/admin/instances/archae.me/statuses") - - response = json_response(ret_conn, 200) - - assert length(response) == 2 - - ret_conn = get(conn, "/api/pleroma/admin/instances/test.com/statuses") - - response = json_response(ret_conn, 200) - - assert length(response) == 1 - - ret_conn = get(conn, "/api/pleroma/admin/instances/nonexistent.com/statuses") - - response = json_response(ret_conn, 200) - - assert Enum.empty?(response) - - CommonAPI.repeat(activity.id, user) - - ret_conn = get(conn, "/api/pleroma/admin/instances/archae.me/statuses") - response = json_response(ret_conn, 200) - assert length(response) == 2 - - ret_conn = get(conn, "/api/pleroma/admin/instances/archae.me/statuses?with_reblogs=true") - response = json_response(ret_conn, 200) - assert length(response) == 3 - end - end - - describe "PATCH /confirm_email" do - test "it confirms emails of two users", %{conn: conn, admin: admin} do - [first_user, second_user] = insert_pair(:user, confirmation_pending: true) - - assert first_user.confirmation_pending == true - assert second_user.confirmation_pending == true - - ret_conn = - patch(conn, "/api/pleroma/admin/users/confirm_email", %{ - nicknames: [ - first_user.nickname, - second_user.nickname - ] - }) - - assert ret_conn.status == 200 - - assert first_user.confirmation_pending == true - assert second_user.confirmation_pending == true - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} confirmed email for users: @#{first_user.nickname}, @#{ - second_user.nickname - }" - end - end - - describe "PATCH /resend_confirmation_email" do - test "it resend emails for two users", %{conn: conn, admin: admin} do - [first_user, second_user] = insert_pair(:user, confirmation_pending: true) - - ret_conn = - patch(conn, "/api/pleroma/admin/users/resend_confirmation_email", %{ - nicknames: [ - first_user.nickname, - second_user.nickname - ] - }) - - assert ret_conn.status == 200 - - log_entry = Repo.one(ModerationLog) - - assert ModerationLog.get_log_entry_message(log_entry) == - "@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{ - second_user.nickname - }" - end - end - - describe "POST /reports/:id/notes" do - setup %{conn: conn, admin: admin} do - [reporter, target_user] = insert_pair(:user) - activity = insert(:note_activity, user: target_user) - - {:ok, %{id: report_id}} = - CommonAPI.report(reporter, %{ - account_id: target_user.id, - comment: "I feel offended", - status_ids: [activity.id] - }) - - post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ - content: "this is disgusting!" - }) - - post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ - content: "this is disgusting2!" - }) - - %{ - admin_id: admin.id, - report_id: report_id - } - end - - test "it creates report note", %{admin_id: admin_id, report_id: report_id} do - [note, _] = Repo.all(ReportNote) - - assert %{ - activity_id: ^report_id, - content: "this is disgusting!", - user_id: ^admin_id - } = note - end - - test "it returns reports with notes", %{conn: conn, admin: admin} do - conn = get(conn, "/api/pleroma/admin/reports") - - response = json_response(conn, 200) - notes = hd(response["reports"])["notes"] - [note, _] = notes - - assert note["user"]["nickname"] == admin.nickname - assert note["content"] == "this is disgusting!" - assert note["created_at"] - assert response["total"] == 1 - end - - test "it deletes the note", %{conn: conn, report_id: report_id} do - assert ReportNote |> Repo.all() |> length() == 2 - - [note, _] = Repo.all(ReportNote) - - delete(conn, "/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}") - - assert ReportNote |> Repo.all() |> length() == 1 - end - end - - describe "GET /api/pleroma/admin/config/descriptions" do - test "structure", %{conn: conn} do - admin = insert(:user, is_admin: true) - - conn = - assign(conn, :user, admin) - |> get("/api/pleroma/admin/config/descriptions") - - assert [child | _others] = json_response(conn, 200) - - assert child["children"] - assert child["key"] - assert String.starts_with?(child["group"], ":") - assert child["description"] - end - - test "filters by database configuration whitelist", %{conn: conn} do - clear_config(:database_config_whitelist, [ - {:pleroma, :instance}, - {:pleroma, :activitypub}, - {:pleroma, Pleroma.Upload}, - {:esshd} - ]) - - admin = insert(:user, is_admin: true) - - conn = - assign(conn, :user, admin) - |> get("/api/pleroma/admin/config/descriptions") - - children = json_response(conn, 200) - - assert length(children) == 4 - - assert Enum.count(children, fn c -> c["group"] == ":pleroma" end) == 3 - - instance = Enum.find(children, fn c -> c["key"] == ":instance" end) - assert instance["children"] - - activitypub = Enum.find(children, fn c -> c["key"] == ":activitypub" end) - assert activitypub["children"] - - web_endpoint = Enum.find(children, fn c -> c["key"] == "Pleroma.Upload" end) - assert web_endpoint["children"] - - esshd = Enum.find(children, fn c -> c["group"] == ":esshd" end) - assert esshd["children"] - end - end - - describe "/api/pleroma/admin/stats" do - test "status visibility count", %{conn: conn} do - admin = insert(:user, is_admin: true) - user = insert(:user) - CommonAPI.post(user, %{visibility: "public", status: "hey"}) - CommonAPI.post(user, %{visibility: "unlisted", status: "hey"}) - CommonAPI.post(user, %{visibility: "unlisted", status: "hey"}) - - response = - conn - |> assign(:user, admin) - |> get("/api/pleroma/admin/stats") - |> json_response(200) - - assert %{"direct" => 0, "private" => 0, "public" => 1, "unlisted" => 2} = - response["status_visibility"] - end - end - - describe "POST /api/pleroma/admin/oauth_app" do - test "errors", %{conn: conn} do - response = conn |> post("/api/pleroma/admin/oauth_app", %{}) |> json_response(200) - - assert response == %{"name" => "can't be blank", "redirect_uris" => "can't be blank"} - end - - test "success", %{conn: conn} do - base_url = Web.base_url() - app_name = "Trusted app" - - response = - conn - |> post("/api/pleroma/admin/oauth_app", %{ - name: app_name, - redirect_uris: base_url - }) - |> json_response(200) - - assert %{ - "client_id" => _, - "client_secret" => _, - "name" => ^app_name, - "redirect_uri" => ^base_url, - "trusted" => false - } = response - end - - test "with trusted", %{conn: conn} do - base_url = Web.base_url() - app_name = "Trusted app" - - response = - conn - |> post("/api/pleroma/admin/oauth_app", %{ - name: app_name, - redirect_uris: base_url, - trusted: true - }) - |> json_response(200) - - assert %{ - "client_id" => _, - "client_secret" => _, - "name" => ^app_name, - "redirect_uri" => ^base_url, - "trusted" => true - } = response - end - end - - describe "GET /api/pleroma/admin/oauth_app" do - setup do - app = insert(:oauth_app) - {:ok, app: app} - end - - test "list", %{conn: conn} do - response = - conn - |> get("/api/pleroma/admin/oauth_app") - |> json_response(200) - - assert %{"apps" => apps, "count" => count, "page_size" => _} = response - - assert length(apps) == count - end - - test "with page size", %{conn: conn} do - insert(:oauth_app) - page_size = 1 - - response = - conn - |> get("/api/pleroma/admin/oauth_app", %{page_size: to_string(page_size)}) - |> json_response(200) - - assert %{"apps" => apps, "count" => _, "page_size" => ^page_size} = response - - assert length(apps) == page_size - end - - test "search by client name", %{conn: conn, app: app} do - response = - conn - |> get("/api/pleroma/admin/oauth_app", %{name: app.client_name}) - |> json_response(200) - - assert %{"apps" => [returned], "count" => _, "page_size" => _} = response - - assert returned["client_id"] == app.client_id - assert returned["name"] == app.client_name - end - - test "search by client id", %{conn: conn, app: app} do - response = - conn - |> get("/api/pleroma/admin/oauth_app", %{client_id: app.client_id}) - |> json_response(200) - - assert %{"apps" => [returned], "count" => _, "page_size" => _} = response - - assert returned["client_id"] == app.client_id - assert returned["name"] == app.client_name - end - - test "only trusted", %{conn: conn} do - app = insert(:oauth_app, trusted: true) - - response = - conn - |> get("/api/pleroma/admin/oauth_app", %{trusted: true}) - |> json_response(200) - - assert %{"apps" => [returned], "count" => _, "page_size" => _} = response - - assert returned["client_id"] == app.client_id - assert returned["name"] == app.client_name - end - end - - describe "DELETE /api/pleroma/admin/oauth_app/:id" do - test "with id", %{conn: conn} do - app = insert(:oauth_app) - - response = - conn - |> delete("/api/pleroma/admin/oauth_app/" <> to_string(app.id)) - |> json_response(:no_content) - - assert response == "" - end - - test "with non existance id", %{conn: conn} do - response = - conn - |> delete("/api/pleroma/admin/oauth_app/0") - |> json_response(:bad_request) - - assert response == "" - end - end - - describe "PATCH /api/pleroma/admin/oauth_app/:id" do - test "with id", %{conn: conn} do - app = insert(:oauth_app) - - name = "another name" - url = "https://example.com" - scopes = ["admin"] - id = app.id - website = "http://website.com" - - response = - conn - |> patch("/api/pleroma/admin/oauth_app/" <> to_string(app.id), %{ - name: name, - trusted: true, - redirect_uris: url, - scopes: scopes, - website: website - }) - |> json_response(200) - - assert %{ - "client_id" => _, - "client_secret" => _, - "id" => ^id, - "name" => ^name, - "redirect_uri" => ^url, - "trusted" => true, - "website" => ^website - } = response - end - - test "without id", %{conn: conn} do - response = - conn - |> patch("/api/pleroma/admin/oauth_app/0") - |> json_response(:bad_request) - - assert response == "" - end - end -end - -# Needed for testing -defmodule Pleroma.Web.Endpoint.NotReal do -end - -defmodule Pleroma.Captcha.NotReal do -end diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs new file mode 100644 index 000000000..48fb108ec --- /dev/null +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -0,0 +1,1763 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do + use Pleroma.Web.ConnCase + use Oban.Testing, repo: Pleroma.Repo + + import ExUnit.CaptureLog + import Mock + import Pleroma.Factory + + alias Pleroma.Activity + alias Pleroma.Config + alias Pleroma.HTML + alias Pleroma.MFA + alias Pleroma.ModerationLog + alias Pleroma.Repo + alias Pleroma.Tests.ObanHelpers + alias Pleroma.User + alias Pleroma.Web + alias Pleroma.Web.ActivityPub.Relay + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.MediaProxy + + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + + :ok + end + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "with [:auth, :enforce_oauth_admin_scope_usage]," do + setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], true) + + test "GET /api/pleroma/admin/users/:nickname requires admin:read:accounts or broader scope", + %{admin: admin} do + user = insert(:user) + url = "/api/pleroma/admin/users/#{user.nickname}" + + good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) + good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) + good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"]) + + bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts"]) + bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"]) + bad_token3 = nil + + for good_token <- [good_token1, good_token2, good_token3] do + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, good_token) + |> get(url) + + assert json_response(conn, 200) + end + + for good_token <- [good_token1, good_token2, good_token3] do + conn = + build_conn() + |> assign(:user, nil) + |> assign(:token, good_token) + |> get(url) + + assert json_response(conn, :forbidden) + end + + for bad_token <- [bad_token1, bad_token2, bad_token3] do + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, bad_token) + |> get(url) + + assert json_response(conn, :forbidden) + end + end + end + + describe "unless [:auth, :enforce_oauth_admin_scope_usage]," do + setup do: clear_config([:auth, :enforce_oauth_admin_scope_usage], false) + + test "GET /api/pleroma/admin/users/:nickname requires " <> + "read:accounts or admin:read:accounts or broader scope", + %{admin: admin} do + user = insert(:user) + url = "/api/pleroma/admin/users/#{user.nickname}" + + good_token1 = insert(:oauth_token, user: admin, scopes: ["admin"]) + good_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read"]) + good_token3 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts"]) + good_token4 = insert(:oauth_token, user: admin, scopes: ["read:accounts"]) + good_token5 = insert(:oauth_token, user: admin, scopes: ["read"]) + + good_tokens = [good_token1, good_token2, good_token3, good_token4, good_token5] + + bad_token1 = insert(:oauth_token, user: admin, scopes: ["read:accounts:partial"]) + bad_token2 = insert(:oauth_token, user: admin, scopes: ["admin:read:accounts:partial"]) + bad_token3 = nil + + for good_token <- good_tokens do + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, good_token) + |> get(url) + + assert json_response(conn, 200) + end + + for good_token <- good_tokens do + conn = + build_conn() + |> assign(:user, nil) + |> assign(:token, good_token) + |> get(url) + + assert json_response(conn, :forbidden) + end + + for bad_token <- [bad_token1, bad_token2, bad_token3] do + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, bad_token) + |> get(url) + + assert json_response(conn, :forbidden) + end + end + end + + describe "DELETE /api/pleroma/admin/users" do + test "single user", %{admin: admin, conn: conn} do + user = insert(:user) + clear_config([:instance, :federating], true) + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + conn = + conn + |> put_req_header("accept", "application/json") + |> delete("/api/pleroma/admin/users?nickname=#{user.nickname}") + + ObanHelpers.perform_all() + + assert User.get_by_nickname(user.nickname).deactivated + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deleted users: @#{user.nickname}" + + assert json_response(conn, 200) == [user.nickname] + + assert called(Pleroma.Web.Federator.publish(:_)) + end + end + + test "multiple users", %{admin: admin, conn: conn} do + user_one = insert(:user) + user_two = insert(:user) + + conn = + conn + |> put_req_header("accept", "application/json") + |> delete("/api/pleroma/admin/users", %{ + nicknames: [user_one.nickname, user_two.nickname] + }) + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deleted users: @#{user_one.nickname}, @#{user_two.nickname}" + + response = json_response(conn, 200) + assert response -- [user_one.nickname, user_two.nickname] == [] + end + end + + describe "/api/pleroma/admin/users" do + test "Create", %{conn: conn} do + conn = + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users", %{ + "users" => [ + %{ + "nickname" => "lain", + "email" => "lain@example.org", + "password" => "test" + }, + %{ + "nickname" => "lain2", + "email" => "lain2@example.org", + "password" => "test" + } + ] + }) + + response = json_response(conn, 200) |> Enum.map(&Map.get(&1, "type")) + assert response == ["success", "success"] + + log_entry = Repo.one(ModerationLog) + + assert ["lain", "lain2"] -- Enum.map(log_entry.data["subjects"], & &1["nickname"]) == [] + end + + test "Cannot create user with existing email", %{conn: conn} do + user = insert(:user) + + conn = + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users", %{ + "users" => [ + %{ + "nickname" => "lain", + "email" => user.email, + "password" => "test" + } + ] + }) + + assert json_response(conn, 409) == [ + %{ + "code" => 409, + "data" => %{ + "email" => user.email, + "nickname" => "lain" + }, + "error" => "email has already been taken", + "type" => "error" + } + ] + end + + test "Cannot create user with existing nickname", %{conn: conn} do + user = insert(:user) + + conn = + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users", %{ + "users" => [ + %{ + "nickname" => user.nickname, + "email" => "someuser@plerama.social", + "password" => "test" + } + ] + }) + + assert json_response(conn, 409) == [ + %{ + "code" => 409, + "data" => %{ + "email" => "someuser@plerama.social", + "nickname" => user.nickname + }, + "error" => "nickname has already been taken", + "type" => "error" + } + ] + end + + test "Multiple user creation works in transaction", %{conn: conn} do + user = insert(:user) + + conn = + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users", %{ + "users" => [ + %{ + "nickname" => "newuser", + "email" => "newuser@pleroma.social", + "password" => "test" + }, + %{ + "nickname" => "lain", + "email" => user.email, + "password" => "test" + } + ] + }) + + assert json_response(conn, 409) == [ + %{ + "code" => 409, + "data" => %{ + "email" => user.email, + "nickname" => "lain" + }, + "error" => "email has already been taken", + "type" => "error" + }, + %{ + "code" => 409, + "data" => %{ + "email" => "newuser@pleroma.social", + "nickname" => "newuser" + }, + "error" => "", + "type" => "error" + } + ] + + assert User.get_by_nickname("newuser") === nil + end + end + + describe "/api/pleroma/admin/users/:nickname" do + test "Show", %{conn: conn} do + user = insert(:user) + + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") + + expected = %{ + "deactivated" => false, + "id" => to_string(user.id), + "local" => true, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + + assert expected == json_response(conn, 200) + end + + test "when the user doesn't exist", %{conn: conn} do + user = build(:user) + + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") + + assert %{"error" => "Not found"} == json_response(conn, 404) + end + end + + describe "/api/pleroma/admin/users/follow" do + test "allows to force-follow another user", %{admin: admin, conn: conn} do + user = insert(:user) + follower = insert(:user) + + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users/follow", %{ + "follower" => follower.nickname, + "followed" => user.nickname + }) + + user = User.get_cached_by_id(user.id) + follower = User.get_cached_by_id(follower.id) + + assert User.following?(follower, user) + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} made @#{follower.nickname} follow @#{user.nickname}" + end + end + + describe "/api/pleroma/admin/users/unfollow" do + test "allows to force-unfollow another user", %{admin: admin, conn: conn} do + user = insert(:user) + follower = insert(:user) + + User.follow(follower, user) + + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users/unfollow", %{ + "follower" => follower.nickname, + "followed" => user.nickname + }) + + user = User.get_cached_by_id(user.id) + follower = User.get_cached_by_id(follower.id) + + refute User.following?(follower, user) + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} made @#{follower.nickname} unfollow @#{user.nickname}" + end + end + + describe "PUT /api/pleroma/admin/users/tag" do + setup %{conn: conn} do + user1 = insert(:user, %{tags: ["x"]}) + user2 = insert(:user, %{tags: ["y"]}) + user3 = insert(:user, %{tags: ["unchanged"]}) + + conn = + conn + |> put_req_header("accept", "application/json") + |> put( + "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <> + "#{user2.nickname}&tags[]=foo&tags[]=bar" + ) + + %{conn: conn, user1: user1, user2: user2, user3: user3} + end + + test "it appends specified tags to users with specified nicknames", %{ + conn: conn, + admin: admin, + user1: user1, + user2: user2 + } do + assert json_response(conn, :no_content) + assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"] + assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"] + + log_entry = Repo.one(ModerationLog) + + users = + [user1.nickname, user2.nickname] + |> Enum.map(&"@#{&1}") + |> Enum.join(", ") + + tags = ["foo", "bar"] |> Enum.join(", ") + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} added tags: #{tags} to users: #{users}" + end + + test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do + assert json_response(conn, :no_content) + assert User.get_cached_by_id(user3.id).tags == ["unchanged"] + end + end + + describe "DELETE /api/pleroma/admin/users/tag" do + setup %{conn: conn} do + user1 = insert(:user, %{tags: ["x"]}) + user2 = insert(:user, %{tags: ["y", "z"]}) + user3 = insert(:user, %{tags: ["unchanged"]}) + + conn = + conn + |> put_req_header("accept", "application/json") + |> delete( + "/api/pleroma/admin/users/tag?nicknames[]=#{user1.nickname}&nicknames[]=" <> + "#{user2.nickname}&tags[]=x&tags[]=z" + ) + + %{conn: conn, user1: user1, user2: user2, user3: user3} + end + + test "it removes specified tags from users with specified nicknames", %{ + conn: conn, + admin: admin, + user1: user1, + user2: user2 + } do + assert json_response(conn, :no_content) + assert User.get_cached_by_id(user1.id).tags == [] + assert User.get_cached_by_id(user2.id).tags == ["y"] + + log_entry = Repo.one(ModerationLog) + + users = + [user1.nickname, user2.nickname] + |> Enum.map(&"@#{&1}") + |> Enum.join(", ") + + tags = ["x", "z"] |> Enum.join(", ") + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} removed tags: #{tags} from users: #{users}" + end + + test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do + assert json_response(conn, :no_content) + assert User.get_cached_by_id(user3.id).tags == ["unchanged"] + end + end + + describe "/api/pleroma/admin/users/:nickname/permission_group" do + test "GET is giving user_info", %{admin: admin, conn: conn} do + conn = + conn + |> put_req_header("accept", "application/json") + |> get("/api/pleroma/admin/users/#{admin.nickname}/permission_group/") + + assert json_response(conn, 200) == %{ + "is_admin" => true, + "is_moderator" => false + } + end + + test "/:right POST, can add to a permission group", %{admin: admin, conn: conn} do + user = insert(:user) + + conn = + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") + + assert json_response(conn, 200) == %{ + "is_admin" => true + } + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} made @#{user.nickname} admin" + end + + test "/:right POST, can add to a permission group (multiple)", %{admin: admin, conn: conn} do + user_one = insert(:user) + user_two = insert(:user) + + conn = + conn + |> put_req_header("accept", "application/json") + |> post("/api/pleroma/admin/users/permission_group/admin", %{ + nicknames: [user_one.nickname, user_two.nickname] + }) + + assert json_response(conn, 200) == %{"is_admin" => true} + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} made @#{user_one.nickname}, @#{user_two.nickname} admin" + end + + test "/:right DELETE, can remove from a permission group", %{admin: admin, conn: conn} do + user = insert(:user, is_admin: true) + + conn = + conn + |> put_req_header("accept", "application/json") + |> delete("/api/pleroma/admin/users/#{user.nickname}/permission_group/admin") + + assert json_response(conn, 200) == %{"is_admin" => false} + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} revoked admin role from @#{user.nickname}" + end + + test "/:right DELETE, can remove from a permission group (multiple)", %{ + admin: admin, + conn: conn + } do + user_one = insert(:user, is_admin: true) + user_two = insert(:user, is_admin: true) + + conn = + conn + |> put_req_header("accept", "application/json") + |> delete("/api/pleroma/admin/users/permission_group/admin", %{ + nicknames: [user_one.nickname, user_two.nickname] + }) + + assert json_response(conn, 200) == %{"is_admin" => false} + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} revoked admin role from @#{user_one.nickname}, @#{ + user_two.nickname + }" + end + end + + test "/api/pleroma/admin/users/:nickname/password_reset", %{conn: conn} do + user = insert(:user) + + conn = + conn + |> put_req_header("accept", "application/json") + |> get("/api/pleroma/admin/users/#{user.nickname}/password_reset") + + resp = json_response(conn, 200) + + assert Regex.match?(~r/(http:\/\/|https:\/\/)/, resp["link"]) + end + + describe "GET /api/pleroma/admin/users" do + test "renders users array for the first page", %{conn: conn, admin: admin} do + user = insert(:user, local: false, tags: ["foo", "bar"]) + conn = get(conn, "/api/pleroma/admin/users?page=1") + + users = + [ + %{ + "deactivated" => admin.deactivated, + "id" => admin.id, + "nickname" => admin.nickname, + "roles" => %{"admin" => true, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(admin) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(admin.name || admin.nickname), + "confirmation_pending" => false, + "url" => admin.ap_id + }, + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => false, + "tags" => ["foo", "bar"], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + |> Enum.sort_by(& &1["nickname"]) + + assert json_response(conn, 200) == %{ + "count" => 2, + "page_size" => 50, + "users" => users + } + end + + test "pagination works correctly with service users", %{conn: conn} do + service1 = User.get_or_create_service_actor_by_ap_id(Web.base_url() <> "/meido", "meido") + + insert_list(25, :user) + + assert %{"count" => 26, "page_size" => 10, "users" => users1} = + conn + |> get("/api/pleroma/admin/users?page=1&filters=", %{page_size: "10"}) + |> json_response(200) + + assert Enum.count(users1) == 10 + assert service1 not in users1 + + assert %{"count" => 26, "page_size" => 10, "users" => users2} = + conn + |> get("/api/pleroma/admin/users?page=2&filters=", %{page_size: "10"}) + |> json_response(200) + + assert Enum.count(users2) == 10 + assert service1 not in users2 + + assert %{"count" => 26, "page_size" => 10, "users" => users3} = + conn + |> get("/api/pleroma/admin/users?page=3&filters=", %{page_size: "10"}) + |> json_response(200) + + assert Enum.count(users3) == 6 + assert service1 not in users3 + end + + test "renders empty array for the second page", %{conn: conn} do + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?page=2") + + assert json_response(conn, 200) == %{ + "count" => 2, + "page_size" => 50, + "users" => [] + } + end + + test "regular search", %{conn: conn} do + user = insert(:user, nickname: "bob") + + conn = get(conn, "/api/pleroma/admin/users?query=bo") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + end + + test "search by domain", %{conn: conn} do + user = insert(:user, nickname: "nickname@domain.com") + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?query=domain.com") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + end + + test "search by full nickname", %{conn: conn} do + user = insert(:user, nickname: "nickname@domain.com") + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?query=nickname@domain.com") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + end + + test "search by display name", %{conn: conn} do + user = insert(:user, name: "Display name") + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?name=display") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + end + + test "search by email", %{conn: conn} do + user = insert(:user, email: "email@example.com") + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?email=email@example.com") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + end + + test "regular search with page size", %{conn: conn} do + user = insert(:user, nickname: "aalice") + user2 = insert(:user, nickname: "alice") + + conn1 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=1") + + assert json_response(conn1, 200) == %{ + "count" => 2, + "page_size" => 1, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + + conn2 = get(conn, "/api/pleroma/admin/users?query=a&page_size=1&page=2") + + assert json_response(conn2, 200) == %{ + "count" => 2, + "page_size" => 1, + "users" => [ + %{ + "deactivated" => user2.deactivated, + "id" => user2.id, + "nickname" => user2.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user2) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user2.name || user2.nickname), + "confirmation_pending" => false, + "url" => user2.ap_id + } + ] + } + end + + test "only local users" do + admin = insert(:user, is_admin: true, nickname: "john") + token = insert(:oauth_admin_token, user: admin) + user = insert(:user, nickname: "bob") + + insert(:user, nickname: "bobb", local: false) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + |> get("/api/pleroma/admin/users?query=bo&filters=local") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + end + + test "only local users with no query", %{conn: conn, admin: old_admin} do + admin = insert(:user, is_admin: true, nickname: "john") + user = insert(:user, nickname: "bob") + + insert(:user, nickname: "bobb", local: false) + + conn = get(conn, "/api/pleroma/admin/users?filters=local") + + users = + [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + }, + %{ + "deactivated" => admin.deactivated, + "id" => admin.id, + "nickname" => admin.nickname, + "roles" => %{"admin" => true, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(admin) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(admin.name || admin.nickname), + "confirmation_pending" => false, + "url" => admin.ap_id + }, + %{ + "deactivated" => false, + "id" => old_admin.id, + "local" => true, + "nickname" => old_admin.nickname, + "roles" => %{"admin" => true, "moderator" => false}, + "tags" => [], + "avatar" => User.avatar_url(old_admin) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(old_admin.name || old_admin.nickname), + "confirmation_pending" => false, + "url" => old_admin.ap_id + } + ] + |> Enum.sort_by(& &1["nickname"]) + + assert json_response(conn, 200) == %{ + "count" => 3, + "page_size" => 50, + "users" => users + } + end + + test "load only admins", %{conn: conn, admin: admin} do + second_admin = insert(:user, is_admin: true) + insert(:user) + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?filters=is_admin") + + users = + [ + %{ + "deactivated" => false, + "id" => admin.id, + "nickname" => admin.nickname, + "roles" => %{"admin" => true, "moderator" => false}, + "local" => admin.local, + "tags" => [], + "avatar" => User.avatar_url(admin) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(admin.name || admin.nickname), + "confirmation_pending" => false, + "url" => admin.ap_id + }, + %{ + "deactivated" => false, + "id" => second_admin.id, + "nickname" => second_admin.nickname, + "roles" => %{"admin" => true, "moderator" => false}, + "local" => second_admin.local, + "tags" => [], + "avatar" => User.avatar_url(second_admin) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(second_admin.name || second_admin.nickname), + "confirmation_pending" => false, + "url" => second_admin.ap_id + } + ] + |> Enum.sort_by(& &1["nickname"]) + + assert json_response(conn, 200) == %{ + "count" => 2, + "page_size" => 50, + "users" => users + } + end + + test "load only moderators", %{conn: conn} do + moderator = insert(:user, is_moderator: true) + insert(:user) + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?filters=is_moderator") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => false, + "id" => moderator.id, + "nickname" => moderator.nickname, + "roles" => %{"admin" => false, "moderator" => true}, + "local" => moderator.local, + "tags" => [], + "avatar" => User.avatar_url(moderator) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(moderator.name || moderator.nickname), + "confirmation_pending" => false, + "url" => moderator.ap_id + } + ] + } + end + + test "load users with tags list", %{conn: conn} do + user1 = insert(:user, tags: ["first"]) + user2 = insert(:user, tags: ["second"]) + insert(:user) + insert(:user) + + conn = get(conn, "/api/pleroma/admin/users?tags[]=first&tags[]=second") + + users = + [ + %{ + "deactivated" => false, + "id" => user1.id, + "nickname" => user1.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => user1.local, + "tags" => ["first"], + "avatar" => User.avatar_url(user1) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user1.name || user1.nickname), + "confirmation_pending" => false, + "url" => user1.ap_id + }, + %{ + "deactivated" => false, + "id" => user2.id, + "nickname" => user2.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => user2.local, + "tags" => ["second"], + "avatar" => User.avatar_url(user2) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user2.name || user2.nickname), + "confirmation_pending" => false, + "url" => user2.ap_id + } + ] + |> Enum.sort_by(& &1["nickname"]) + + assert json_response(conn, 200) == %{ + "count" => 2, + "page_size" => 50, + "users" => users + } + end + + test "it works with multiple filters" do + admin = insert(:user, nickname: "john", is_admin: true) + token = insert(:oauth_admin_token, user: admin) + user = insert(:user, nickname: "bob", local: false, deactivated: true) + + insert(:user, nickname: "ken", local: true, deactivated: true) + insert(:user, nickname: "bobb", local: false, deactivated: false) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + |> get("/api/pleroma/admin/users?filters=deactivated,external") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => user.local, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + ] + } + end + + test "it omits relay user", %{admin: admin, conn: conn} do + assert %User{} = Relay.get_actor() + + conn = get(conn, "/api/pleroma/admin/users") + + assert json_response(conn, 200) == %{ + "count" => 1, + "page_size" => 50, + "users" => [ + %{ + "deactivated" => admin.deactivated, + "id" => admin.id, + "nickname" => admin.nickname, + "roles" => %{"admin" => true, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(admin) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(admin.name || admin.nickname), + "confirmation_pending" => false, + "url" => admin.ap_id + } + ] + } + end + end + + test "PATCH /api/pleroma/admin/users/activate", %{admin: admin, conn: conn} do + user_one = insert(:user, deactivated: true) + user_two = insert(:user, deactivated: true) + + conn = + patch( + conn, + "/api/pleroma/admin/users/activate", + %{nicknames: [user_one.nickname, user_two.nickname]} + ) + + response = json_response(conn, 200) + assert Enum.map(response["users"], & &1["deactivated"]) == [false, false] + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} activated users: @#{user_one.nickname}, @#{user_two.nickname}" + end + + test "PATCH /api/pleroma/admin/users/deactivate", %{admin: admin, conn: conn} do + user_one = insert(:user, deactivated: false) + user_two = insert(:user, deactivated: false) + + conn = + patch( + conn, + "/api/pleroma/admin/users/deactivate", + %{nicknames: [user_one.nickname, user_two.nickname]} + ) + + response = json_response(conn, 200) + assert Enum.map(response["users"], & &1["deactivated"]) == [true, true] + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deactivated users: @#{user_one.nickname}, @#{user_two.nickname}" + end + + test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admin, conn: conn} do + user = insert(:user) + + conn = patch(conn, "/api/pleroma/admin/users/#{user.nickname}/toggle_activation") + + assert json_response(conn, 200) == + %{ + "deactivated" => !user.deactivated, + "id" => user.id, + "nickname" => user.nickname, + "roles" => %{"admin" => false, "moderator" => false}, + "local" => true, + "tags" => [], + "avatar" => User.avatar_url(user) |> MediaProxy.url(), + "display_name" => HTML.strip_tags(user.name || user.nickname), + "confirmation_pending" => false, + "url" => user.ap_id + } + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deactivated users: @#{user.nickname}" + end + + describe "PUT disable_mfa" do + test "returns 200 and disable 2fa", %{conn: conn} do + user = + insert(:user, + multi_factor_authentication_settings: %MFA.Settings{ + enabled: true, + totp: %MFA.Settings.TOTP{secret: "otp_secret", confirmed: true} + } + ) + + response = + conn + |> put("/api/pleroma/admin/users/disable_mfa", %{nickname: user.nickname}) + |> json_response(200) + + assert response == user.nickname + mfa_settings = refresh_record(user).multi_factor_authentication_settings + + refute mfa_settings.enabled + refute mfa_settings.totp.confirmed + end + + test "returns 404 if user not found", %{conn: conn} do + response = + conn + |> put("/api/pleroma/admin/users/disable_mfa", %{nickname: "nickname"}) + |> json_response(404) + + assert response == %{"error" => "Not found"} + end + end + + describe "GET /api/pleroma/admin/restart" do + setup do: clear_config(:configurable_from_database, true) + + test "pleroma restarts", %{conn: conn} do + capture_log(fn -> + assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} + end) =~ "pleroma restarted" + + refute Restarter.Pleroma.need_reboot?() + end + end + + test "need_reboot flag", %{conn: conn} do + assert conn + |> get("/api/pleroma/admin/need_reboot") + |> json_response(200) == %{"need_reboot" => false} + + Restarter.Pleroma.need_reboot() + + assert conn + |> get("/api/pleroma/admin/need_reboot") + |> json_response(200) == %{"need_reboot" => true} + + on_exit(fn -> Restarter.Pleroma.refresh() end) + end + + describe "GET /api/pleroma/admin/users/:nickname/statuses" do + setup do + user = insert(:user) + + date1 = (DateTime.to_unix(DateTime.utc_now()) + 2000) |> DateTime.from_unix!() + date2 = (DateTime.to_unix(DateTime.utc_now()) + 1000) |> DateTime.from_unix!() + date3 = (DateTime.to_unix(DateTime.utc_now()) + 3000) |> DateTime.from_unix!() + + insert(:note_activity, user: user, published: date1) + insert(:note_activity, user: user, published: date2) + insert(:note_activity, user: user, published: date3) + + %{user: user} + end + + test "renders user's statuses", %{conn: conn, user: user} do + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") + + assert json_response(conn, 200) |> length() == 3 + end + + test "renders user's statuses with a limit", %{conn: conn, user: user} do + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?page_size=2") + + assert json_response(conn, 200) |> length() == 2 + end + + test "doesn't return private statuses by default", %{conn: conn, user: user} do + {:ok, _private_status} = CommonAPI.post(user, %{status: "private", visibility: "private"}) + + {:ok, _public_status} = CommonAPI.post(user, %{status: "public", visibility: "public"}) + + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses") + + assert json_response(conn, 200) |> length() == 4 + end + + test "returns private statuses with godmode on", %{conn: conn, user: user} do + {:ok, _private_status} = CommonAPI.post(user, %{status: "private", visibility: "private"}) + + {:ok, _public_status} = CommonAPI.post(user, %{status: "public", visibility: "public"}) + + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/statuses?godmode=true") + + assert json_response(conn, 200) |> length() == 5 + end + + test "excludes reblogs by default", %{conn: conn, user: user} do + other_user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "."}) + {:ok, %Activity{}} = CommonAPI.repeat(activity.id, other_user) + + conn_res = get(conn, "/api/pleroma/admin/users/#{other_user.nickname}/statuses") + assert json_response(conn_res, 200) |> length() == 0 + + conn_res = + get(conn, "/api/pleroma/admin/users/#{other_user.nickname}/statuses?with_reblogs=true") + + assert json_response(conn_res, 200) |> length() == 1 + end + end + + describe "GET /api/pleroma/admin/moderation_log" do + setup do + moderator = insert(:user, is_moderator: true) + + %{moderator: moderator} + end + + test "returns the log", %{conn: conn, admin: admin} do + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => admin.id, + "nickname" => admin.nickname, + "type" => "user" + }, + action: "relay_follow", + target: "https://example.org/relay" + }, + inserted_at: NaiveDateTime.truncate(~N[2017-08-15 15:47:06.597036], :second) + }) + + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => admin.id, + "nickname" => admin.nickname, + "type" => "user" + }, + action: "relay_unfollow", + target: "https://example.org/relay" + }, + inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second) + }) + + conn = get(conn, "/api/pleroma/admin/moderation_log") + + response = json_response(conn, 200) + [first_entry, second_entry] = response["items"] + + assert response["total"] == 2 + assert first_entry["data"]["action"] == "relay_unfollow" + + assert first_entry["message"] == + "@#{admin.nickname} unfollowed relay: https://example.org/relay" + + assert second_entry["data"]["action"] == "relay_follow" + + assert second_entry["message"] == + "@#{admin.nickname} followed relay: https://example.org/relay" + end + + test "returns the log with pagination", %{conn: conn, admin: admin} do + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => admin.id, + "nickname" => admin.nickname, + "type" => "user" + }, + action: "relay_follow", + target: "https://example.org/relay" + }, + inserted_at: NaiveDateTime.truncate(~N[2017-08-15 15:47:06.597036], :second) + }) + + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => admin.id, + "nickname" => admin.nickname, + "type" => "user" + }, + action: "relay_unfollow", + target: "https://example.org/relay" + }, + inserted_at: NaiveDateTime.truncate(~N[2017-08-16 15:47:06.597036], :second) + }) + + conn1 = get(conn, "/api/pleroma/admin/moderation_log?page_size=1&page=1") + + response1 = json_response(conn1, 200) + [first_entry] = response1["items"] + + assert response1["total"] == 2 + assert response1["items"] |> length() == 1 + assert first_entry["data"]["action"] == "relay_unfollow" + + assert first_entry["message"] == + "@#{admin.nickname} unfollowed relay: https://example.org/relay" + + conn2 = get(conn, "/api/pleroma/admin/moderation_log?page_size=1&page=2") + + response2 = json_response(conn2, 200) + [second_entry] = response2["items"] + + assert response2["total"] == 2 + assert response2["items"] |> length() == 1 + assert second_entry["data"]["action"] == "relay_follow" + + assert second_entry["message"] == + "@#{admin.nickname} followed relay: https://example.org/relay" + end + + test "filters log by date", %{conn: conn, admin: admin} do + first_date = "2017-08-15T15:47:06Z" + second_date = "2017-08-20T15:47:06Z" + + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => admin.id, + "nickname" => admin.nickname, + "type" => "user" + }, + action: "relay_follow", + target: "https://example.org/relay" + }, + inserted_at: NaiveDateTime.from_iso8601!(first_date) + }) + + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => admin.id, + "nickname" => admin.nickname, + "type" => "user" + }, + action: "relay_unfollow", + target: "https://example.org/relay" + }, + inserted_at: NaiveDateTime.from_iso8601!(second_date) + }) + + conn1 = + get( + conn, + "/api/pleroma/admin/moderation_log?start_date=#{second_date}" + ) + + response1 = json_response(conn1, 200) + [first_entry] = response1["items"] + + assert response1["total"] == 1 + assert first_entry["data"]["action"] == "relay_unfollow" + + assert first_entry["message"] == + "@#{admin.nickname} unfollowed relay: https://example.org/relay" + end + + test "returns log filtered by user", %{conn: conn, admin: admin, moderator: moderator} do + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => admin.id, + "nickname" => admin.nickname, + "type" => "user" + }, + action: "relay_follow", + target: "https://example.org/relay" + } + }) + + Repo.insert(%ModerationLog{ + data: %{ + actor: %{ + "id" => moderator.id, + "nickname" => moderator.nickname, + "type" => "user" + }, + action: "relay_unfollow", + target: "https://example.org/relay" + } + }) + + conn1 = get(conn, "/api/pleroma/admin/moderation_log?user_id=#{moderator.id}") + + response1 = json_response(conn1, 200) + [first_entry] = response1["items"] + + assert response1["total"] == 1 + assert get_in(first_entry, ["data", "actor", "id"]) == moderator.id + end + + test "returns log filtered by search", %{conn: conn, moderator: moderator} do + ModerationLog.insert_log(%{ + actor: moderator, + action: "relay_follow", + target: "https://example.org/relay" + }) + + ModerationLog.insert_log(%{ + actor: moderator, + action: "relay_unfollow", + target: "https://example.org/relay" + }) + + conn1 = get(conn, "/api/pleroma/admin/moderation_log?search=unfo") + + response1 = json_response(conn1, 200) + [first_entry] = response1["items"] + + assert response1["total"] == 1 + + assert get_in(first_entry, ["data", "message"]) == + "@#{moderator.nickname} unfollowed relay: https://example.org/relay" + end + end + + describe "GET /users/:nickname/credentials" do + test "gets the user credentials", %{conn: conn} do + user = insert(:user) + conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials") + + response = assert json_response(conn, 200) + assert response["email"] == user.email + end + + test "returns 403 if requested by a non-admin" do + user = insert(:user) + + conn = + build_conn() + |> assign(:user, user) + |> get("/api/pleroma/admin/users/#{user.nickname}/credentials") + + assert json_response(conn, :forbidden) + end + end + + describe "PATCH /users/:nickname/credentials" do + setup do + user = insert(:user) + [user: user] + end + + test "changes password and email", %{conn: conn, admin: admin, user: user} do + assert user.password_reset_pending == false + + conn = + patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "password" => "new_password", + "email" => "new_email@example.com", + "name" => "new_name" + }) + + assert json_response(conn, 200) == %{"status" => "success"} + + ObanHelpers.perform_all() + + updated_user = User.get_by_id(user.id) + + assert updated_user.email == "new_email@example.com" + assert updated_user.name == "new_name" + assert updated_user.password_hash != user.password_hash + assert updated_user.password_reset_pending == true + + [log_entry2, log_entry1] = ModerationLog |> Repo.all() |> Enum.sort() + + assert ModerationLog.get_log_entry_message(log_entry1) == + "@#{admin.nickname} updated users: @#{user.nickname}" + + assert ModerationLog.get_log_entry_message(log_entry2) == + "@#{admin.nickname} forced password reset for users: @#{user.nickname}" + end + + test "returns 403 if requested by a non-admin", %{user: user} do + conn = + build_conn() + |> assign(:user, user) + |> patch("/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "password" => "new_password", + "email" => "new_email@example.com", + "name" => "new_name" + }) + + assert json_response(conn, :forbidden) + end + + test "changes actor type from permitted list", %{conn: conn, user: user} do + assert user.actor_type == "Person" + + assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "actor_type" => "Service" + }) + |> json_response(200) == %{"status" => "success"} + + updated_user = User.get_by_id(user.id) + + assert updated_user.actor_type == "Service" + + assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ + "actor_type" => "Application" + }) + |> json_response(400) == %{"errors" => %{"actor_type" => "is invalid"}} + end + + test "update non existing user", %{conn: conn} do + assert patch(conn, "/api/pleroma/admin/users/non-existing/credentials", %{ + "password" => "new_password" + }) + |> json_response(404) == %{"error" => "Not found"} + end + end + + describe "PATCH /users/:nickname/force_password_reset" do + test "sets password_reset_pending to true", %{conn: conn} do + user = insert(:user) + assert user.password_reset_pending == false + + conn = + patch(conn, "/api/pleroma/admin/users/force_password_reset", %{nicknames: [user.nickname]}) + + assert json_response(conn, 204) == "" + + ObanHelpers.perform_all() + + assert User.get_by_id(user.id).password_reset_pending == true + end + end + + describe "instances" do + test "GET /instances/:instance/statuses", %{conn: conn} do + user = insert(:user, local: false, nickname: "archaeme@archae.me") + user2 = insert(:user, local: false, nickname: "test@test.com") + insert_pair(:note_activity, user: user) + activity = insert(:note_activity, user: user2) + + ret_conn = get(conn, "/api/pleroma/admin/instances/archae.me/statuses") + + response = json_response(ret_conn, 200) + + assert length(response) == 2 + + ret_conn = get(conn, "/api/pleroma/admin/instances/test.com/statuses") + + response = json_response(ret_conn, 200) + + assert length(response) == 1 + + ret_conn = get(conn, "/api/pleroma/admin/instances/nonexistent.com/statuses") + + response = json_response(ret_conn, 200) + + assert Enum.empty?(response) + + CommonAPI.repeat(activity.id, user) + + ret_conn = get(conn, "/api/pleroma/admin/instances/archae.me/statuses") + response = json_response(ret_conn, 200) + assert length(response) == 2 + + ret_conn = get(conn, "/api/pleroma/admin/instances/archae.me/statuses?with_reblogs=true") + response = json_response(ret_conn, 200) + assert length(response) == 3 + end + end + + describe "PATCH /confirm_email" do + test "it confirms emails of two users", %{conn: conn, admin: admin} do + [first_user, second_user] = insert_pair(:user, confirmation_pending: true) + + assert first_user.confirmation_pending == true + assert second_user.confirmation_pending == true + + ret_conn = + patch(conn, "/api/pleroma/admin/users/confirm_email", %{ + nicknames: [ + first_user.nickname, + second_user.nickname + ] + }) + + assert ret_conn.status == 200 + + assert first_user.confirmation_pending == true + assert second_user.confirmation_pending == true + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} confirmed email for users: @#{first_user.nickname}, @#{ + second_user.nickname + }" + end + end + + describe "PATCH /resend_confirmation_email" do + test "it resend emails for two users", %{conn: conn, admin: admin} do + [first_user, second_user] = insert_pair(:user, confirmation_pending: true) + + ret_conn = + patch(conn, "/api/pleroma/admin/users/resend_confirmation_email", %{ + nicknames: [ + first_user.nickname, + second_user.nickname + ] + }) + + assert ret_conn.status == 200 + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} re-sent confirmation email for users: @#{first_user.nickname}, @#{ + second_user.nickname + }" + end + end + + describe "/api/pleroma/admin/stats" do + test "status visibility count", %{conn: conn} do + admin = insert(:user, is_admin: true) + user = insert(:user) + CommonAPI.post(user, %{visibility: "public", status: "hey"}) + CommonAPI.post(user, %{visibility: "unlisted", status: "hey"}) + CommonAPI.post(user, %{visibility: "unlisted", status: "hey"}) + + response = + conn + |> assign(:user, admin) + |> get("/api/pleroma/admin/stats") + |> json_response(200) + + assert %{"direct" => 0, "private" => 0, "public" => 1, "unlisted" => 2} = + response["status_visibility"] + end + + test "by instance", %{conn: conn} do + admin = insert(:user, is_admin: true) + user1 = insert(:user) + instance2 = "instance2.tld" + user2 = insert(:user, %{ap_id: "https://#{instance2}/@actor"}) + + CommonAPI.post(user1, %{visibility: "public", status: "hey"}) + CommonAPI.post(user2, %{visibility: "unlisted", status: "hey"}) + CommonAPI.post(user2, %{visibility: "private", status: "hey"}) + + response = + conn + |> assign(:user, admin) + |> get("/api/pleroma/admin/stats", instance: instance2) + |> json_response(200) + + assert %{"direct" => 0, "private" => 1, "public" => 0, "unlisted" => 1} = + response["status_visibility"] + end + end +end + +# Needed for testing +defmodule Pleroma.Web.Endpoint.NotReal do +end + +defmodule Pleroma.Captcha.NotReal do +end diff --git a/test/web/admin_api/controllers/config_controller_test.exs b/test/web/admin_api/controllers/config_controller_test.exs new file mode 100644 index 000000000..064ef9bc7 --- /dev/null +++ b/test/web/admin_api/controllers/config_controller_test.exs @@ -0,0 +1,1388 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ConfigControllerTest do + use Pleroma.Web.ConnCase, async: true + + import ExUnit.CaptureLog + import Pleroma.Factory + + alias Pleroma.Config + alias Pleroma.ConfigDB + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "GET /api/pleroma/admin/config" do + setup do: clear_config(:configurable_from_database, true) + + test "when configuration from database is off", %{conn: conn} do + Config.put(:configurable_from_database, false) + conn = get(conn, "/api/pleroma/admin/config") + + assert json_response_and_validate_schema(conn, 400) == + %{ + "error" => "To use this endpoint you need to enable configuration from database." + } + end + + test "with settings only in db", %{conn: conn} do + config1 = insert(:config) + config2 = insert(:config) + + conn = get(conn, "/api/pleroma/admin/config?only_db=true") + + %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => key1, + "value" => _ + }, + %{ + "group" => ":pleroma", + "key" => key2, + "value" => _ + } + ] + } = json_response_and_validate_schema(conn, 200) + + assert key1 == inspect(config1.key) + assert key2 == inspect(config2.key) + end + + test "db is added to settings that are in db", %{conn: conn} do + _config = insert(:config, key: ":instance", value: [name: "Some name"]) + + %{"configs" => configs} = + conn + |> get("/api/pleroma/admin/config") + |> json_response_and_validate_schema(200) + + [instance_config] = + Enum.filter(configs, fn %{"group" => group, "key" => key} -> + group == ":pleroma" and key == ":instance" + end) + + assert instance_config["db"] == [":name"] + end + + test "merged default setting with db settings", %{conn: conn} do + config1 = insert(:config) + config2 = insert(:config) + + config3 = + insert(:config, + value: [k1: :v1, k2: :v2] + ) + + %{"configs" => configs} = + conn + |> get("/api/pleroma/admin/config") + |> json_response_and_validate_schema(200) + + assert length(configs) > 3 + + saved_configs = [config1, config2, config3] + keys = Enum.map(saved_configs, &inspect(&1.key)) + + received_configs = + Enum.filter(configs, fn %{"group" => group, "key" => key} -> + group == ":pleroma" and key in keys + end) + + assert length(received_configs) == 3 + + db_keys = + config3.value + |> Keyword.keys() + |> ConfigDB.to_json_types() + + keys = Enum.map(saved_configs -- [config3], &inspect(&1.key)) + + values = Enum.map(saved_configs, &ConfigDB.to_json_types(&1.value)) + + mapset_keys = MapSet.new(keys ++ db_keys) + + Enum.each(received_configs, fn %{"value" => value, "db" => db} -> + db = MapSet.new(db) + assert MapSet.subset?(db, mapset_keys) + + assert value in values + end) + end + + test "subkeys with full update right merge", %{conn: conn} do + insert(:config, + key: ":emoji", + value: [groups: [a: 1, b: 2], key: [a: 1]] + ) + + insert(:config, + key: ":assets", + value: [mascots: [a: 1, b: 2], key: [a: 1]] + ) + + %{"configs" => configs} = + conn + |> get("/api/pleroma/admin/config") + |> json_response_and_validate_schema(200) + + vals = + Enum.filter(configs, fn %{"group" => group, "key" => key} -> + group == ":pleroma" and key in [":emoji", ":assets"] + end) + + emoji = Enum.find(vals, fn %{"key" => key} -> key == ":emoji" end) + assets = Enum.find(vals, fn %{"key" => key} -> key == ":assets" end) + + emoji_val = ConfigDB.to_elixir_types(emoji["value"]) + assets_val = ConfigDB.to_elixir_types(assets["value"]) + + assert emoji_val[:groups] == [a: 1, b: 2] + assert assets_val[:mascots] == [a: 1, b: 2] + end + end + + test "POST /api/pleroma/admin/config error", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{"configs" => []}) + + assert json_response_and_validate_schema(conn, 400) == + %{"error" => "To use this endpoint you need to enable configuration from database."} + end + + describe "POST /api/pleroma/admin/config" do + setup do + http = Application.get_env(:pleroma, :http) + + on_exit(fn -> + Application.delete_env(:pleroma, :key1) + Application.delete_env(:pleroma, :key2) + Application.delete_env(:pleroma, :key3) + Application.delete_env(:pleroma, :key4) + Application.delete_env(:pleroma, :keyaa1) + Application.delete_env(:pleroma, :keyaa2) + Application.delete_env(:pleroma, Pleroma.Web.Endpoint.NotReal) + Application.delete_env(:pleroma, Pleroma.Captcha.NotReal) + Application.put_env(:pleroma, :http, http) + Application.put_env(:tesla, :adapter, Tesla.Mock) + Restarter.Pleroma.refresh() + end) + end + + setup do: clear_config(:configurable_from_database, true) + + @tag capture_log: true + test "create new config setting in db", %{conn: conn} do + ueberauth = Application.get_env(:ueberauth, Ueberauth) + on_exit(fn -> Application.put_env(:ueberauth, Ueberauth, ueberauth) end) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{group: ":pleroma", key: ":key1", value: "value1"}, + %{ + group: ":ueberauth", + key: "Ueberauth", + value: [%{"tuple" => [":consumer_secret", "aaaa"]}] + }, + %{ + group: ":pleroma", + key: ":key2", + value: %{ + ":nested_1" => "nested_value1", + ":nested_2" => [ + %{":nested_22" => "nested_value222"}, + %{":nested_33" => %{":nested_44" => "nested_444"}} + ] + } + }, + %{ + group: ":pleroma", + key: ":key3", + value: [ + %{"nested_3" => ":nested_3", "nested_33" => "nested_33"}, + %{"nested_4" => true} + ] + }, + %{ + group: ":pleroma", + key: ":key4", + value: %{":nested_5" => ":upload", "endpoint" => "https://example.com"} + }, + %{ + group: ":idna", + key: ":key5", + value: %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]} + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => "value1", + "db" => [":key1"] + }, + %{ + "group" => ":ueberauth", + "key" => "Ueberauth", + "value" => [%{"tuple" => [":consumer_secret", "aaaa"]}], + "db" => [":consumer_secret"] + }, + %{ + "group" => ":pleroma", + "key" => ":key2", + "value" => %{ + ":nested_1" => "nested_value1", + ":nested_2" => [ + %{":nested_22" => "nested_value222"}, + %{":nested_33" => %{":nested_44" => "nested_444"}} + ] + }, + "db" => [":key2"] + }, + %{ + "group" => ":pleroma", + "key" => ":key3", + "value" => [ + %{"nested_3" => ":nested_3", "nested_33" => "nested_33"}, + %{"nested_4" => true} + ], + "db" => [":key3"] + }, + %{ + "group" => ":pleroma", + "key" => ":key4", + "value" => %{"endpoint" => "https://example.com", ":nested_5" => ":upload"}, + "db" => [":key4"] + }, + %{ + "group" => ":idna", + "key" => ":key5", + "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}, + "db" => [":key5"] + } + ], + "need_reboot" => false + } + + assert Application.get_env(:pleroma, :key1) == "value1" + + assert Application.get_env(:pleroma, :key2) == %{ + nested_1: "nested_value1", + nested_2: [ + %{nested_22: "nested_value222"}, + %{nested_33: %{nested_44: "nested_444"}} + ] + } + + assert Application.get_env(:pleroma, :key3) == [ + %{"nested_3" => :nested_3, "nested_33" => "nested_33"}, + %{"nested_4" => true} + ] + + assert Application.get_env(:pleroma, :key4) == %{ + "endpoint" => "https://example.com", + nested_5: :upload + } + + assert Application.get_env(:idna, :key5) == {"string", Pleroma.Captcha.NotReal, []} + end + + test "save configs setting without explicit key", %{conn: conn} do + level = Application.get_env(:quack, :level) + meta = Application.get_env(:quack, :meta) + webhook_url = Application.get_env(:quack, :webhook_url) + + on_exit(fn -> + Application.put_env(:quack, :level, level) + Application.put_env(:quack, :meta, meta) + Application.put_env(:quack, :webhook_url, webhook_url) + end) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":quack", + key: ":level", + value: ":info" + }, + %{ + group: ":quack", + key: ":meta", + value: [":none"] + }, + %{ + group: ":quack", + key: ":webhook_url", + value: "https://hooks.slack.com/services/KEY" + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":quack", + "key" => ":level", + "value" => ":info", + "db" => [":level"] + }, + %{ + "group" => ":quack", + "key" => ":meta", + "value" => [":none"], + "db" => [":meta"] + }, + %{ + "group" => ":quack", + "key" => ":webhook_url", + "value" => "https://hooks.slack.com/services/KEY", + "db" => [":webhook_url"] + } + ], + "need_reboot" => false + } + + assert Application.get_env(:quack, :level) == :info + assert Application.get_env(:quack, :meta) == [:none] + assert Application.get_env(:quack, :webhook_url) == "https://hooks.slack.com/services/KEY" + end + + test "saving config with partial update", %{conn: conn} do + insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: 2)) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]} + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => [ + %{"tuple" => [":key1", 1]}, + %{"tuple" => [":key2", 2]}, + %{"tuple" => [":key3", 3]} + ], + "db" => [":key1", ":key2", ":key3"] + } + ], + "need_reboot" => false + } + end + + test "saving config which need pleroma reboot", %{conn: conn} do + chat = Config.get(:chat) + on_exit(fn -> Config.put(:chat, chat) end) + + assert conn + |> put_req_header("content-type", "application/json") + |> post( + "/api/pleroma/admin/config", + %{ + configs: [ + %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} + ] + } + ) + |> json_response_and_validate_schema(200) == %{ + "configs" => [ + %{ + "db" => [":enabled"], + "group" => ":pleroma", + "key" => ":chat", + "value" => [%{"tuple" => [":enabled", true]}] + } + ], + "need_reboot" => true + } + + configs = + conn + |> get("/api/pleroma/admin/config") + |> json_response_and_validate_schema(200) + + assert configs["need_reboot"] + + capture_log(fn -> + assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == + %{} + end) =~ "pleroma restarted" + + configs = + conn + |> get("/api/pleroma/admin/config") + |> json_response_and_validate_schema(200) + + assert configs["need_reboot"] == false + end + + test "update setting which need reboot, don't change reboot flag until reboot", %{conn: conn} do + chat = Config.get(:chat) + on_exit(fn -> Config.put(:chat, chat) end) + + assert conn + |> put_req_header("content-type", "application/json") + |> post( + "/api/pleroma/admin/config", + %{ + configs: [ + %{group: ":pleroma", key: ":chat", value: [%{"tuple" => [":enabled", true]}]} + ] + } + ) + |> json_response_and_validate_schema(200) == %{ + "configs" => [ + %{ + "db" => [":enabled"], + "group" => ":pleroma", + "key" => ":chat", + "value" => [%{"tuple" => [":enabled", true]}] + } + ], + "need_reboot" => true + } + + assert conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]} + ] + }) + |> json_response_and_validate_schema(200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => [ + %{"tuple" => [":key3", 3]} + ], + "db" => [":key3"] + } + ], + "need_reboot" => true + } + + capture_log(fn -> + assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == + %{} + end) =~ "pleroma restarted" + + configs = + conn + |> get("/api/pleroma/admin/config") + |> json_response_and_validate_schema(200) + + assert configs["need_reboot"] == false + end + + test "saving config with nested merge", %{conn: conn} do + insert(:config, key: :key1, value: [key1: 1, key2: [k1: 1, k2: 2]]) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":pleroma", + key: ":key1", + value: [ + %{"tuple" => [":key3", 3]}, + %{ + "tuple" => [ + ":key2", + [ + %{"tuple" => [":k2", 1]}, + %{"tuple" => [":k3", 3]} + ] + ] + } + ] + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => [ + %{"tuple" => [":key1", 1]}, + %{"tuple" => [":key3", 3]}, + %{ + "tuple" => [ + ":key2", + [ + %{"tuple" => [":k1", 1]}, + %{"tuple" => [":k2", 1]}, + %{"tuple" => [":k3", 3]} + ] + ] + } + ], + "db" => [":key1", ":key3", ":key2"] + } + ], + "need_reboot" => false + } + end + + test "saving special atoms", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => [ + %{ + "tuple" => [ + ":ssl_options", + [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}] + ] + } + ] + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => [ + %{ + "tuple" => [ + ":ssl_options", + [%{"tuple" => [":versions", [":tlsv1", ":tlsv1.1", ":tlsv1.2"]]}] + ] + } + ], + "db" => [":ssl_options"] + } + ], + "need_reboot" => false + } + + assert Application.get_env(:pleroma, :key1) == [ + ssl_options: [versions: [:tlsv1, :"tlsv1.1", :"tlsv1.2"]] + ] + end + + test "saving full setting if value is in full_key_update list", %{conn: conn} do + backends = Application.get_env(:logger, :backends) + on_exit(fn -> Application.put_env(:logger, :backends, backends) end) + + insert(:config, + group: :logger, + key: :backends, + value: [] + ) + + Pleroma.Config.TransferTask.load_and_update_env([], false) + + assert Application.get_env(:logger, :backends) == [] + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":logger", + key: ":backends", + value: [":console"] + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":logger", + "key" => ":backends", + "value" => [ + ":console" + ], + "db" => [":backends"] + } + ], + "need_reboot" => false + } + + assert Application.get_env(:logger, :backends) == [ + :console + ] + end + + test "saving full setting if value is not keyword", %{conn: conn} do + insert(:config, + group: :tesla, + key: :adapter, + value: Tesla.Adapter.Hackey + ) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{group: ":tesla", key: ":adapter", value: "Tesla.Adapter.Httpc"} + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":tesla", + "key" => ":adapter", + "value" => "Tesla.Adapter.Httpc", + "db" => [":adapter"] + } + ], + "need_reboot" => false + } + end + + test "update config setting & delete with fallback to default value", %{ + conn: conn, + admin: admin, + token: token + } do + ueberauth = Application.get_env(:ueberauth, Ueberauth) + insert(:config, key: :keyaa1) + insert(:config, key: :keyaa2) + + config3 = + insert(:config, + group: :ueberauth, + key: Ueberauth + ) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{group: ":pleroma", key: ":keyaa1", value: "another_value"}, + %{group: ":pleroma", key: ":keyaa2", value: "another_value"} + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":keyaa1", + "value" => "another_value", + "db" => [":keyaa1"] + }, + %{ + "group" => ":pleroma", + "key" => ":keyaa2", + "value" => "another_value", + "db" => [":keyaa2"] + } + ], + "need_reboot" => false + } + + assert Application.get_env(:pleroma, :keyaa1) == "another_value" + assert Application.get_env(:pleroma, :keyaa2) == "another_value" + assert Application.get_env(:ueberauth, Ueberauth) == config3.value + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{group: ":pleroma", key: ":keyaa2", delete: true}, + %{ + group: ":ueberauth", + key: "Ueberauth", + delete: true + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [], + "need_reboot" => false + } + + assert Application.get_env(:ueberauth, Ueberauth) == ueberauth + refute Keyword.has_key?(Application.get_all_env(:pleroma), :keyaa2) + end + + test "common config example", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + "group" => ":pleroma", + "key" => "Pleroma.Captcha.NotReal", + "value" => [ + %{"tuple" => [":enabled", false]}, + %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]}, + %{"tuple" => [":seconds_valid", 60]}, + %{"tuple" => [":path", ""]}, + %{"tuple" => [":key1", nil]}, + %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}, + %{"tuple" => [":regex1", "~r/https:\/\/example.com/"]}, + %{"tuple" => [":regex2", "~r/https:\/\/example.com/u"]}, + %{"tuple" => [":regex3", "~r/https:\/\/example.com/i"]}, + %{"tuple" => [":regex4", "~r/https:\/\/example.com/s"]}, + %{"tuple" => [":name", "Pleroma"]} + ] + } + ] + }) + + assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma" + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => "Pleroma.Captcha.NotReal", + "value" => [ + %{"tuple" => [":enabled", false]}, + %{"tuple" => [":method", "Pleroma.Captcha.Kocaptcha"]}, + %{"tuple" => [":seconds_valid", 60]}, + %{"tuple" => [":path", ""]}, + %{"tuple" => [":key1", nil]}, + %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]}, + %{"tuple" => [":regex1", "~r/https:\\/\\/example.com/"]}, + %{"tuple" => [":regex2", "~r/https:\\/\\/example.com/u"]}, + %{"tuple" => [":regex3", "~r/https:\\/\\/example.com/i"]}, + %{"tuple" => [":regex4", "~r/https:\\/\\/example.com/s"]}, + %{"tuple" => [":name", "Pleroma"]} + ], + "db" => [ + ":enabled", + ":method", + ":seconds_valid", + ":path", + ":key1", + ":partial_chain", + ":regex1", + ":regex2", + ":regex3", + ":regex4", + ":name" + ] + } + ], + "need_reboot" => false + } + end + + test "tuples with more than two values", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + "group" => ":pleroma", + "key" => "Pleroma.Web.Endpoint.NotReal", + "value" => [ + %{ + "tuple" => [ + ":http", + [ + %{ + "tuple" => [ + ":key2", + [ + %{ + "tuple" => [ + ":_", + [ + %{ + "tuple" => [ + "/api/v1/streaming", + "Pleroma.Web.MastodonAPI.WebsocketHandler", + [] + ] + }, + %{ + "tuple" => [ + "/websocket", + "Phoenix.Endpoint.CowboyWebSocket", + %{ + "tuple" => [ + "Phoenix.Transports.WebSocket", + %{ + "tuple" => [ + "Pleroma.Web.Endpoint", + "Pleroma.Web.UserSocket", + [] + ] + } + ] + } + ] + }, + %{ + "tuple" => [ + ":_", + "Phoenix.Endpoint.Cowboy2Handler", + %{"tuple" => ["Pleroma.Web.Endpoint", []]} + ] + } + ] + ] + } + ] + ] + } + ] + ] + } + ] + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => "Pleroma.Web.Endpoint.NotReal", + "value" => [ + %{ + "tuple" => [ + ":http", + [ + %{ + "tuple" => [ + ":key2", + [ + %{ + "tuple" => [ + ":_", + [ + %{ + "tuple" => [ + "/api/v1/streaming", + "Pleroma.Web.MastodonAPI.WebsocketHandler", + [] + ] + }, + %{ + "tuple" => [ + "/websocket", + "Phoenix.Endpoint.CowboyWebSocket", + %{ + "tuple" => [ + "Phoenix.Transports.WebSocket", + %{ + "tuple" => [ + "Pleroma.Web.Endpoint", + "Pleroma.Web.UserSocket", + [] + ] + } + ] + } + ] + }, + %{ + "tuple" => [ + ":_", + "Phoenix.Endpoint.Cowboy2Handler", + %{"tuple" => ["Pleroma.Web.Endpoint", []]} + ] + } + ] + ] + } + ] + ] + } + ] + ] + } + ], + "db" => [":http"] + } + ], + "need_reboot" => false + } + end + + test "settings with nesting map", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => [ + %{"tuple" => [":key2", "some_val"]}, + %{ + "tuple" => [ + ":key3", + %{ + ":max_options" => 20, + ":max_option_chars" => 200, + ":min_expiration" => 0, + ":max_expiration" => 31_536_000, + "nested" => %{ + ":max_options" => 20, + ":max_option_chars" => 200, + ":min_expiration" => 0, + ":max_expiration" => 31_536_000 + } + } + ] + } + ] + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == + %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => [ + %{"tuple" => [":key2", "some_val"]}, + %{ + "tuple" => [ + ":key3", + %{ + ":max_expiration" => 31_536_000, + ":max_option_chars" => 200, + ":max_options" => 20, + ":min_expiration" => 0, + "nested" => %{ + ":max_expiration" => 31_536_000, + ":max_option_chars" => 200, + ":max_options" => 20, + ":min_expiration" => 0 + } + } + ] + } + ], + "db" => [":key2", ":key3"] + } + ], + "need_reboot" => false + } + end + + test "value as map", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => %{"key" => "some_val"} + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == + %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":key1", + "value" => %{"key" => "some_val"}, + "db" => [":key1"] + } + ], + "need_reboot" => false + } + end + + test "queues key as atom", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + "group" => ":oban", + "key" => ":queues", + "value" => [ + %{"tuple" => [":federator_incoming", 50]}, + %{"tuple" => [":federator_outgoing", 50]}, + %{"tuple" => [":web_push", 50]}, + %{"tuple" => [":mailer", 10]}, + %{"tuple" => [":transmogrifier", 20]}, + %{"tuple" => [":scheduled_activities", 10]}, + %{"tuple" => [":background", 5]} + ] + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":oban", + "key" => ":queues", + "value" => [ + %{"tuple" => [":federator_incoming", 50]}, + %{"tuple" => [":federator_outgoing", 50]}, + %{"tuple" => [":web_push", 50]}, + %{"tuple" => [":mailer", 10]}, + %{"tuple" => [":transmogrifier", 20]}, + %{"tuple" => [":scheduled_activities", 10]}, + %{"tuple" => [":background", 5]} + ], + "db" => [ + ":federator_incoming", + ":federator_outgoing", + ":web_push", + ":mailer", + ":transmogrifier", + ":scheduled_activities", + ":background" + ] + } + ], + "need_reboot" => false + } + end + + test "delete part of settings by atom subkeys", %{conn: conn} do + insert(:config, + key: :keyaa1, + value: [subkey1: "val1", subkey2: "val2", subkey3: "val3"] + ) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":pleroma", + key: ":keyaa1", + subkeys: [":subkey1", ":subkey3"], + delete: true + } + ] + }) + + assert json_response_and_validate_schema(conn, 200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":keyaa1", + "value" => [%{"tuple" => [":subkey2", "val2"]}], + "db" => [":subkey2"] + } + ], + "need_reboot" => false + } + end + + test "proxy tuple localhost", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":pleroma", + key: ":http", + value: [ + %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} + ] + } + ] + }) + + assert %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":http", + "value" => value, + "db" => db + } + ] + } = json_response_and_validate_schema(conn, 200) + + assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} in value + assert ":proxy_url" in db + end + + test "proxy tuple domain", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":pleroma", + key: ":http", + value: [ + %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} + ] + } + ] + }) + + assert %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":http", + "value" => value, + "db" => db + } + ] + } = json_response_and_validate_schema(conn, 200) + + assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} in value + assert ":proxy_url" in db + end + + test "proxy tuple ip", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":pleroma", + key: ":http", + value: [ + %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} + ] + } + ] + }) + + assert %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => ":http", + "value" => value, + "db" => db + } + ] + } = json_response_and_validate_schema(conn, 200) + + assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "127.0.0.1", 1234]}]} in value + assert ":proxy_url" in db + end + + @tag capture_log: true + test "doesn't set keys not in the whitelist", %{conn: conn} do + clear_config(:database_config_whitelist, [ + {:pleroma, :key1}, + {:pleroma, :key2}, + {:pleroma, Pleroma.Captcha.NotReal}, + {:not_real} + ]) + + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{group: ":pleroma", key: ":key1", value: "value1"}, + %{group: ":pleroma", key: ":key2", value: "value2"}, + %{group: ":pleroma", key: ":key3", value: "value3"}, + %{group: ":pleroma", key: "Pleroma.Web.Endpoint.NotReal", value: "value4"}, + %{group: ":pleroma", key: "Pleroma.Captcha.NotReal", value: "value5"}, + %{group: ":not_real", key: ":anything", value: "value6"} + ] + }) + + assert Application.get_env(:pleroma, :key1) == "value1" + assert Application.get_env(:pleroma, :key2) == "value2" + assert Application.get_env(:pleroma, :key3) == nil + assert Application.get_env(:pleroma, Pleroma.Web.Endpoint.NotReal) == nil + assert Application.get_env(:pleroma, Pleroma.Captcha.NotReal) == "value5" + assert Application.get_env(:not_real, :anything) == "value6" + end + + test "args for Pleroma.Upload.Filter.Mogrify with custom tuples", %{conn: conn} do + clear_config(Pleroma.Upload.Filter.Mogrify) + + assert conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":pleroma", + key: "Pleroma.Upload.Filter.Mogrify", + value: [ + %{"tuple" => [":args", ["auto-orient", "strip"]]} + ] + } + ] + }) + |> json_response_and_validate_schema(200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => "Pleroma.Upload.Filter.Mogrify", + "value" => [ + %{"tuple" => [":args", ["auto-orient", "strip"]]} + ], + "db" => [":args"] + } + ], + "need_reboot" => false + } + + assert Config.get(Pleroma.Upload.Filter.Mogrify) == [args: ["auto-orient", "strip"]] + + assert conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ + configs: [ + %{ + group: ":pleroma", + key: "Pleroma.Upload.Filter.Mogrify", + value: [ + %{ + "tuple" => [ + ":args", + [ + "auto-orient", + "strip", + "{\"implode\", \"1\"}", + "{\"resize\", \"3840x1080>\"}" + ] + ] + } + ] + } + ] + }) + |> json_response(200) == %{ + "configs" => [ + %{ + "group" => ":pleroma", + "key" => "Pleroma.Upload.Filter.Mogrify", + "value" => [ + %{ + "tuple" => [ + ":args", + [ + "auto-orient", + "strip", + "{\"implode\", \"1\"}", + "{\"resize\", \"3840x1080>\"}" + ] + ] + } + ], + "db" => [":args"] + } + ], + "need_reboot" => false + } + + assert Config.get(Pleroma.Upload.Filter.Mogrify) == [ + args: ["auto-orient", "strip", {"implode", "1"}, {"resize", "3840x1080>"}] + ] + end + end + + describe "GET /api/pleroma/admin/config/descriptions" do + test "structure", %{conn: conn} do + admin = insert(:user, is_admin: true) + + conn = + assign(conn, :user, admin) + |> get("/api/pleroma/admin/config/descriptions") + + assert [child | _others] = json_response_and_validate_schema(conn, 200) + + assert child["children"] + assert child["key"] + assert String.starts_with?(child["group"], ":") + assert child["description"] + end + + test "filters by database configuration whitelist", %{conn: conn} do + clear_config(:database_config_whitelist, [ + {:pleroma, :instance}, + {:pleroma, :activitypub}, + {:pleroma, Pleroma.Upload}, + {:esshd} + ]) + + admin = insert(:user, is_admin: true) + + conn = + assign(conn, :user, admin) + |> get("/api/pleroma/admin/config/descriptions") + + children = json_response_and_validate_schema(conn, 200) + + assert length(children) == 4 + + assert Enum.count(children, fn c -> c["group"] == ":pleroma" end) == 3 + + instance = Enum.find(children, fn c -> c["key"] == ":instance" end) + assert instance["children"] + + activitypub = Enum.find(children, fn c -> c["key"] == ":activitypub" end) + assert activitypub["children"] + + web_endpoint = Enum.find(children, fn c -> c["key"] == "Pleroma.Upload" end) + assert web_endpoint["children"] + + esshd = Enum.find(children, fn c -> c["group"] == ":esshd" end) + assert esshd["children"] + end + end +end diff --git a/test/web/admin_api/controllers/invite_controller_test.exs b/test/web/admin_api/controllers/invite_controller_test.exs new file mode 100644 index 000000000..ab186c5e7 --- /dev/null +++ b/test/web/admin_api/controllers/invite_controller_test.exs @@ -0,0 +1,281 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InviteControllerTest do + use Pleroma.Web.ConnCase, async: true + + import Pleroma.Factory + + alias Pleroma.Config + alias Pleroma.Repo + alias Pleroma.UserInviteToken + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "POST /api/pleroma/admin/users/email_invite, with valid config" do + setup do: clear_config([:instance, :registrations_open], false) + setup do: clear_config([:instance, :invites_enabled], true) + + test "sends invitation and returns 204", %{admin: admin, conn: conn} do + recipient_email = "foo@bar.com" + recipient_name = "J. D." + + conn = + conn + |> put_req_header("content-type", "application/json;charset=utf-8") + |> post("/api/pleroma/admin/users/email_invite", %{ + email: recipient_email, + name: recipient_name + }) + + assert json_response_and_validate_schema(conn, :no_content) + + token_record = List.last(Repo.all(Pleroma.UserInviteToken)) + assert token_record + refute token_record.used + + notify_email = Config.get([:instance, :notify_email]) + instance_name = Config.get([:instance, :name]) + + email = + Pleroma.Emails.UserEmail.user_invitation_email( + admin, + token_record, + recipient_email, + recipient_name + ) + + Swoosh.TestAssertions.assert_email_sent( + from: {instance_name, notify_email}, + to: {recipient_name, recipient_email}, + html_body: email.html_body + ) + end + + test "it returns 403 if requested by a non-admin" do + non_admin_user = insert(:user) + token = insert(:oauth_token, user: non_admin_user) + + conn = + build_conn() + |> assign(:user, non_admin_user) + |> assign(:token, token) + |> put_req_header("content-type", "application/json;charset=utf-8") + |> post("/api/pleroma/admin/users/email_invite", %{ + email: "foo@bar.com", + name: "JD" + }) + + assert json_response(conn, :forbidden) + end + + test "email with +", %{conn: conn, admin: admin} do + recipient_email = "foo+bar@baz.com" + + conn + |> put_req_header("content-type", "application/json;charset=utf-8") + |> post("/api/pleroma/admin/users/email_invite", %{email: recipient_email}) + |> json_response_and_validate_schema(:no_content) + + token_record = + Pleroma.UserInviteToken + |> Repo.all() + |> List.last() + + assert token_record + refute token_record.used + + notify_email = Config.get([:instance, :notify_email]) + instance_name = Config.get([:instance, :name]) + + email = + Pleroma.Emails.UserEmail.user_invitation_email( + admin, + token_record, + recipient_email + ) + + Swoosh.TestAssertions.assert_email_sent( + from: {instance_name, notify_email}, + to: recipient_email, + html_body: email.html_body + ) + end + end + + describe "POST /api/pleroma/admin/users/email_invite, with invalid config" do + setup do: clear_config([:instance, :registrations_open]) + setup do: clear_config([:instance, :invites_enabled]) + + test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do + Config.put([:instance, :registrations_open], false) + Config.put([:instance, :invites_enabled], false) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/email_invite", %{ + email: "foo@bar.com", + name: "JD" + }) + + assert json_response_and_validate_schema(conn, :bad_request) == + %{ + "error" => + "To send invites you need to set the `invites_enabled` option to true." + } + end + + test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do + Config.put([:instance, :registrations_open], true) + Config.put([:instance, :invites_enabled], true) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/email_invite", %{ + email: "foo@bar.com", + name: "JD" + }) + + assert json_response_and_validate_schema(conn, :bad_request) == + %{ + "error" => + "To send invites you need to set the `registrations_open` option to false." + } + end + end + + describe "POST /api/pleroma/admin/users/invite_token" do + test "without options", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/invite_token") + + invite_json = json_response_and_validate_schema(conn, 200) + invite = UserInviteToken.find_by_token!(invite_json["token"]) + refute invite.used + refute invite.expires_at + refute invite.max_use + assert invite.invite_type == "one_time" + end + + test "with expires_at", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/invite_token", %{ + "expires_at" => Date.to_string(Date.utc_today()) + }) + + invite_json = json_response_and_validate_schema(conn, 200) + invite = UserInviteToken.find_by_token!(invite_json["token"]) + + refute invite.used + assert invite.expires_at == Date.utc_today() + refute invite.max_use + assert invite.invite_type == "date_limited" + end + + test "with max_use", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/invite_token", %{"max_use" => 150}) + + invite_json = json_response_and_validate_schema(conn, 200) + invite = UserInviteToken.find_by_token!(invite_json["token"]) + refute invite.used + refute invite.expires_at + assert invite.max_use == 150 + assert invite.invite_type == "reusable" + end + + test "with max use and expires_at", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/invite_token", %{ + "max_use" => 150, + "expires_at" => Date.to_string(Date.utc_today()) + }) + + invite_json = json_response_and_validate_schema(conn, 200) + invite = UserInviteToken.find_by_token!(invite_json["token"]) + refute invite.used + assert invite.expires_at == Date.utc_today() + assert invite.max_use == 150 + assert invite.invite_type == "reusable_date_limited" + end + end + + describe "GET /api/pleroma/admin/users/invites" do + test "no invites", %{conn: conn} do + conn = get(conn, "/api/pleroma/admin/users/invites") + + assert json_response_and_validate_schema(conn, 200) == %{"invites" => []} + end + + test "with invite", %{conn: conn} do + {:ok, invite} = UserInviteToken.create_invite() + + conn = get(conn, "/api/pleroma/admin/users/invites") + + assert json_response_and_validate_schema(conn, 200) == %{ + "invites" => [ + %{ + "expires_at" => nil, + "id" => invite.id, + "invite_type" => "one_time", + "max_use" => nil, + "token" => invite.token, + "used" => false, + "uses" => 0 + } + ] + } + end + end + + describe "POST /api/pleroma/admin/users/revoke_invite" do + test "with token", %{conn: conn} do + {:ok, invite} = UserInviteToken.create_invite() + + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token}) + + assert json_response_and_validate_schema(conn, 200) == %{ + "expires_at" => nil, + "id" => invite.id, + "invite_type" => "one_time", + "max_use" => nil, + "token" => invite.token, + "used" => true, + "uses" => 0 + } + end + + test "with invalid token", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) + + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} + end + end +end diff --git a/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs new file mode 100644 index 000000000..5ab6cb78a --- /dev/null +++ b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -0,0 +1,145 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + import Mock + + alias Pleroma.Web.MediaProxy + + setup do: clear_config([:media_proxy]) + + setup do + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) + end + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + Config.put([:media_proxy, :enabled], true) + Config.put([:media_proxy, :invalidation, :enabled], true) + Config.put([:media_proxy, :invalidation, :provider], MediaProxy.Invalidation.Script) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "GET /api/pleroma/admin/media_proxy_caches" do + test "shows banned MediaProxy URLs", %{conn: conn} do + MediaProxy.put_in_banned_urls([ + "http://localhost:4001/media/a688346.jpg", + "http://localhost:4001/media/fb1f4d.jpg" + ]) + + MediaProxy.put_in_banned_urls("http://localhost:4001/media/gb1f44.jpg") + MediaProxy.put_in_banned_urls("http://localhost:4001/media/tb13f47.jpg") + MediaProxy.put_in_banned_urls("http://localhost:4001/media/wb1f46.jpg") + + response = + conn + |> get("/api/pleroma/admin/media_proxy_caches?page_size=2") + |> json_response_and_validate_schema(200) + + assert response["urls"] == [ + "http://localhost:4001/media/fb1f4d.jpg", + "http://localhost:4001/media/a688346.jpg" + ] + + response = + conn + |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=2") + |> json_response_and_validate_schema(200) + + assert response["urls"] == [ + "http://localhost:4001/media/gb1f44.jpg", + "http://localhost:4001/media/tb13f47.jpg" + ] + + response = + conn + |> get("/api/pleroma/admin/media_proxy_caches?page_size=2&page=3") + |> json_response_and_validate_schema(200) + + assert response["urls"] == ["http://localhost:4001/media/wb1f46.jpg"] + end + end + + describe "POST /api/pleroma/admin/media_proxy_caches/delete" do + test "deleted MediaProxy URLs from banned", %{conn: conn} do + MediaProxy.put_in_banned_urls([ + "http://localhost:4001/media/a688346.jpg", + "http://localhost:4001/media/fb1f4d.jpg" + ]) + + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/media_proxy_caches/delete", %{ + urls: ["http://localhost:4001/media/a688346.jpg"] + }) + |> json_response_and_validate_schema(200) + + assert response["urls"] == ["http://localhost:4001/media/a688346.jpg"] + refute MediaProxy.in_banned_urls("http://localhost:4001/media/a688346.jpg") + assert MediaProxy.in_banned_urls("http://localhost:4001/media/fb1f4d.jpg") + end + end + + describe "POST /api/pleroma/admin/media_proxy_caches/purge" do + test "perform invalidates cache of MediaProxy", %{conn: conn} do + urls = [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] + + with_mocks [ + {MediaProxy.Invalidation.Script, [], + [ + purge: fn _, _ -> {"ok", 0} end + ]} + ] do + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/media_proxy_caches/purge", %{urls: urls, ban: false}) + |> json_response_and_validate_schema(200) + + assert response["urls"] == urls + + refute MediaProxy.in_banned_urls("http://example.com/media/a688346.jpg") + refute MediaProxy.in_banned_urls("http://example.com/media/fb1f4d.jpg") + end + end + + test "perform invalidates cache of MediaProxy and adds url to banned", %{conn: conn} do + urls = [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] + + with_mocks [{MediaProxy.Invalidation.Script, [], [purge: fn _, _ -> {"ok", 0} end]}] do + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/media_proxy_caches/purge", %{ + urls: urls, + ban: true + }) + |> json_response_and_validate_schema(200) + + assert response["urls"] == urls + + assert MediaProxy.in_banned_urls("http://example.com/media/a688346.jpg") + assert MediaProxy.in_banned_urls("http://example.com/media/fb1f4d.jpg") + end + end + end +end diff --git a/test/web/admin_api/controllers/oauth_app_controller_test.exs b/test/web/admin_api/controllers/oauth_app_controller_test.exs new file mode 100644 index 000000000..ed7c4172c --- /dev/null +++ b/test/web/admin_api/controllers/oauth_app_controller_test.exs @@ -0,0 +1,220 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.OAuthAppControllerTest do + use Pleroma.Web.ConnCase, async: true + use Oban.Testing, repo: Pleroma.Repo + + import Pleroma.Factory + + alias Pleroma.Config + alias Pleroma.Web + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "POST /api/pleroma/admin/oauth_app" do + test "errors", %{conn: conn} do + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/oauth_app", %{}) + |> json_response_and_validate_schema(400) + + assert %{ + "error" => "Missing field: name. Missing field: redirect_uris." + } = response + end + + test "success", %{conn: conn} do + base_url = Web.base_url() + app_name = "Trusted app" + + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/oauth_app", %{ + name: app_name, + redirect_uris: base_url + }) + |> json_response_and_validate_schema(200) + + assert %{ + "client_id" => _, + "client_secret" => _, + "name" => ^app_name, + "redirect_uri" => ^base_url, + "trusted" => false + } = response + end + + test "with trusted", %{conn: conn} do + base_url = Web.base_url() + app_name = "Trusted app" + + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/oauth_app", %{ + name: app_name, + redirect_uris: base_url, + trusted: true + }) + |> json_response_and_validate_schema(200) + + assert %{ + "client_id" => _, + "client_secret" => _, + "name" => ^app_name, + "redirect_uri" => ^base_url, + "trusted" => true + } = response + end + end + + describe "GET /api/pleroma/admin/oauth_app" do + setup do + app = insert(:oauth_app) + {:ok, app: app} + end + + test "list", %{conn: conn} do + response = + conn + |> get("/api/pleroma/admin/oauth_app") + |> json_response_and_validate_schema(200) + + assert %{"apps" => apps, "count" => count, "page_size" => _} = response + + assert length(apps) == count + end + + test "with page size", %{conn: conn} do + insert(:oauth_app) + page_size = 1 + + response = + conn + |> get("/api/pleroma/admin/oauth_app?page_size=#{page_size}") + |> json_response_and_validate_schema(200) + + assert %{"apps" => apps, "count" => _, "page_size" => ^page_size} = response + + assert length(apps) == page_size + end + + test "search by client name", %{conn: conn, app: app} do + response = + conn + |> get("/api/pleroma/admin/oauth_app?name=#{app.client_name}") + |> json_response_and_validate_schema(200) + + assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + + assert returned["client_id"] == app.client_id + assert returned["name"] == app.client_name + end + + test "search by client id", %{conn: conn, app: app} do + response = + conn + |> get("/api/pleroma/admin/oauth_app?client_id=#{app.client_id}") + |> json_response_and_validate_schema(200) + + assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + + assert returned["client_id"] == app.client_id + assert returned["name"] == app.client_name + end + + test "only trusted", %{conn: conn} do + app = insert(:oauth_app, trusted: true) + + response = + conn + |> get("/api/pleroma/admin/oauth_app?trusted=true") + |> json_response_and_validate_schema(200) + + assert %{"apps" => [returned], "count" => _, "page_size" => _} = response + + assert returned["client_id"] == app.client_id + assert returned["name"] == app.client_name + end + end + + describe "DELETE /api/pleroma/admin/oauth_app/:id" do + test "with id", %{conn: conn} do + app = insert(:oauth_app) + + response = + conn + |> delete("/api/pleroma/admin/oauth_app/" <> to_string(app.id)) + |> json_response_and_validate_schema(:no_content) + + assert response == "" + end + + test "with non existance id", %{conn: conn} do + response = + conn + |> delete("/api/pleroma/admin/oauth_app/0") + |> json_response_and_validate_schema(:bad_request) + + assert response == "" + end + end + + describe "PATCH /api/pleroma/admin/oauth_app/:id" do + test "with id", %{conn: conn} do + app = insert(:oauth_app) + + name = "another name" + url = "https://example.com" + scopes = ["admin"] + id = app.id + website = "http://website.com" + + response = + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/oauth_app/#{id}", %{ + name: name, + trusted: true, + redirect_uris: url, + scopes: scopes, + website: website + }) + |> json_response_and_validate_schema(200) + + assert %{ + "client_id" => _, + "client_secret" => _, + "id" => ^id, + "name" => ^name, + "redirect_uri" => ^url, + "trusted" => true, + "website" => ^website + } = response + end + + test "without id", %{conn: conn} do + response = + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/oauth_app/0") + |> json_response_and_validate_schema(:bad_request) + + assert response == "" + end + end +end diff --git a/test/web/admin_api/controllers/relay_controller_test.exs b/test/web/admin_api/controllers/relay_controller_test.exs new file mode 100644 index 000000000..64086adc5 --- /dev/null +++ b/test/web/admin_api/controllers/relay_controller_test.exs @@ -0,0 +1,92 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.RelayControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + alias Pleroma.Config + alias Pleroma.ModerationLog + alias Pleroma.Repo + alias Pleroma.User + + setup_all do + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + + :ok + end + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "relays" do + test "POST /relay", %{conn: conn, admin: admin} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/relay", %{ + relay_url: "http://mastodon.example.org/users/admin" + }) + + assert json_response_and_validate_schema(conn, 200) == + "http://mastodon.example.org/users/admin" + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} followed relay: http://mastodon.example.org/users/admin" + end + + test "GET /relay", %{conn: conn} do + relay_user = Pleroma.Web.ActivityPub.Relay.get_actor() + + ["http://mastodon.example.org/users/admin", "https://mstdn.io/users/mayuutann"] + |> Enum.each(fn ap_id -> + {:ok, user} = User.get_or_fetch_by_ap_id(ap_id) + User.follow(relay_user, user) + end) + + conn = get(conn, "/api/pleroma/admin/relay") + + assert json_response_and_validate_schema(conn, 200)["relays"] -- + ["mastodon.example.org", "mstdn.io"] == [] + end + + test "DELETE /relay", %{conn: conn, admin: admin} do + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/relay", %{ + relay_url: "http://mastodon.example.org/users/admin" + }) + + conn = + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/pleroma/admin/relay", %{ + relay_url: "http://mastodon.example.org/users/admin" + }) + + assert json_response_and_validate_schema(conn, 200) == + "http://mastodon.example.org/users/admin" + + [log_entry_one, log_entry_two] = Repo.all(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry_one) == + "@#{admin.nickname} followed relay: http://mastodon.example.org/users/admin" + + assert ModerationLog.get_log_entry_message(log_entry_two) == + "@#{admin.nickname} unfollowed relay: http://mastodon.example.org/users/admin" + end + end +end diff --git a/test/web/admin_api/controllers/report_controller_test.exs b/test/web/admin_api/controllers/report_controller_test.exs new file mode 100644 index 000000000..940bce340 --- /dev/null +++ b/test/web/admin_api/controllers/report_controller_test.exs @@ -0,0 +1,374 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.ReportControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + alias Pleroma.Activity + alias Pleroma.Config + alias Pleroma.ModerationLog + alias Pleroma.Repo + alias Pleroma.ReportNote + alias Pleroma.Web.CommonAPI + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "GET /api/pleroma/admin/reports/:id" do + test "returns report by its id", %{conn: conn} do + [reporter, target_user] = insert_pair(:user) + activity = insert(:note_activity, user: target_user) + + {:ok, %{id: report_id}} = + CommonAPI.report(reporter, %{ + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] + }) + + response = + conn + |> get("/api/pleroma/admin/reports/#{report_id}") + |> json_response_and_validate_schema(:ok) + + assert response["id"] == report_id + end + + test "returns 404 when report id is invalid", %{conn: conn} do + conn = get(conn, "/api/pleroma/admin/reports/test") + + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} + end + end + + describe "PATCH /api/pleroma/admin/reports" do + setup do + [reporter, target_user] = insert_pair(:user) + activity = insert(:note_activity, user: target_user) + + {:ok, %{id: report_id}} = + CommonAPI.report(reporter, %{ + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] + }) + + {:ok, %{id: second_report_id}} = + CommonAPI.report(reporter, %{ + account_id: target_user.id, + comment: "I feel very offended", + status_ids: [activity.id] + }) + + %{ + id: report_id, + second_report_id: second_report_id + } + end + + test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} do + read_token = insert(:oauth_token, user: admin, scopes: ["admin:read"]) + write_token = insert(:oauth_token, user: admin, scopes: ["admin:write:reports"]) + + response = + conn + |> assign(:token, read_token) + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [%{"state" => "resolved", "id" => id}] + }) + |> json_response_and_validate_schema(403) + + assert response == %{ + "error" => "Insufficient permissions: admin:write:reports." + } + + conn + |> assign(:token, write_token) + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [%{"state" => "resolved", "id" => id}] + }) + |> json_response_and_validate_schema(:no_content) + end + + test "mark report as resolved", %{conn: conn, id: id, admin: admin} do + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [ + %{"state" => "resolved", "id" => id} + ] + }) + |> json_response_and_validate_schema(:no_content) + + activity = Activity.get_by_id(id) + assert activity.data["state"] == "resolved" + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} updated report ##{id} with 'resolved' state" + end + + test "closes report", %{conn: conn, id: id, admin: admin} do + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [ + %{"state" => "closed", "id" => id} + ] + }) + |> json_response_and_validate_schema(:no_content) + + activity = Activity.get_by_id(id) + assert activity.data["state"] == "closed" + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} updated report ##{id} with 'closed' state" + end + + test "returns 400 when state is unknown", %{conn: conn, id: id} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [ + %{"state" => "test", "id" => id} + ] + }) + + assert "Unsupported state" = + hd(json_response_and_validate_schema(conn, :bad_request))["error"] + end + + test "returns 404 when report is not exist", %{conn: conn} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [ + %{"state" => "closed", "id" => "test"} + ] + }) + + assert hd(json_response_and_validate_schema(conn, :bad_request))["error"] == "not_found" + end + + test "updates state of multiple reports", %{ + conn: conn, + id: id, + admin: admin, + second_report_id: second_report_id + } do + conn + |> put_req_header("content-type", "application/json") + |> patch("/api/pleroma/admin/reports", %{ + "reports" => [ + %{"state" => "resolved", "id" => id}, + %{"state" => "closed", "id" => second_report_id} + ] + }) + |> json_response_and_validate_schema(:no_content) + + activity = Activity.get_by_id(id) + second_activity = Activity.get_by_id(second_report_id) + assert activity.data["state"] == "resolved" + assert second_activity.data["state"] == "closed" + + [first_log_entry, second_log_entry] = Repo.all(ModerationLog) + + assert ModerationLog.get_log_entry_message(first_log_entry) == + "@#{admin.nickname} updated report ##{id} with 'resolved' state" + + assert ModerationLog.get_log_entry_message(second_log_entry) == + "@#{admin.nickname} updated report ##{second_report_id} with 'closed' state" + end + end + + describe "GET /api/pleroma/admin/reports" do + test "returns empty response when no reports created", %{conn: conn} do + response = + conn + |> get("/api/pleroma/admin/reports") + |> json_response_and_validate_schema(:ok) + + assert Enum.empty?(response["reports"]) + assert response["total"] == 0 + end + + test "returns reports", %{conn: conn} do + [reporter, target_user] = insert_pair(:user) + activity = insert(:note_activity, user: target_user) + + {:ok, %{id: report_id}} = + CommonAPI.report(reporter, %{ + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] + }) + + response = + conn + |> get("/api/pleroma/admin/reports") + |> json_response_and_validate_schema(:ok) + + [report] = response["reports"] + + assert length(response["reports"]) == 1 + assert report["id"] == report_id + + assert response["total"] == 1 + end + + test "returns reports with specified state", %{conn: conn} do + [reporter, target_user] = insert_pair(:user) + activity = insert(:note_activity, user: target_user) + + {:ok, %{id: first_report_id}} = + CommonAPI.report(reporter, %{ + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] + }) + + {:ok, %{id: second_report_id}} = + CommonAPI.report(reporter, %{ + account_id: target_user.id, + comment: "I don't like this user" + }) + + CommonAPI.update_report_state(second_report_id, "closed") + + response = + conn + |> get("/api/pleroma/admin/reports?state=open") + |> json_response_and_validate_schema(:ok) + + assert [open_report] = response["reports"] + + assert length(response["reports"]) == 1 + assert open_report["id"] == first_report_id + + assert response["total"] == 1 + + response = + conn + |> get("/api/pleroma/admin/reports?state=closed") + |> json_response_and_validate_schema(:ok) + + assert [closed_report] = response["reports"] + + assert length(response["reports"]) == 1 + assert closed_report["id"] == second_report_id + + assert response["total"] == 1 + + assert %{"total" => 0, "reports" => []} == + conn + |> get("/api/pleroma/admin/reports?state=resolved", %{ + "" => "" + }) + |> json_response_and_validate_schema(:ok) + end + + test "returns 403 when requested by a non-admin" do + user = insert(:user) + token = insert(:oauth_token, user: user) + + conn = + build_conn() + |> assign(:user, user) + |> assign(:token, token) + |> get("/api/pleroma/admin/reports") + + assert json_response(conn, :forbidden) == + %{"error" => "User is not an admin or OAuth admin scope is not granted."} + end + + test "returns 403 when requested by anonymous" do + conn = get(build_conn(), "/api/pleroma/admin/reports") + + assert json_response(conn, :forbidden) == %{ + "error" => "Invalid credentials." + } + end + end + + describe "POST /api/pleroma/admin/reports/:id/notes" do + setup %{conn: conn, admin: admin} do + [reporter, target_user] = insert_pair(:user) + activity = insert(:note_activity, user: target_user) + + {:ok, %{id: report_id}} = + CommonAPI.report(reporter, %{ + account_id: target_user.id, + comment: "I feel offended", + status_ids: [activity.id] + }) + + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ + content: "this is disgusting!" + }) + + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ + content: "this is disgusting2!" + }) + + %{ + admin_id: admin.id, + report_id: report_id + } + end + + test "it creates report note", %{admin_id: admin_id, report_id: report_id} do + assert [note, _] = Repo.all(ReportNote) + + assert %{ + activity_id: ^report_id, + content: "this is disgusting!", + user_id: ^admin_id + } = note + end + + test "it returns reports with notes", %{conn: conn, admin: admin} do + conn = get(conn, "/api/pleroma/admin/reports") + + response = json_response_and_validate_schema(conn, 200) + notes = hd(response["reports"])["notes"] + [note, _] = notes + + assert note["user"]["nickname"] == admin.nickname + assert note["content"] == "this is disgusting!" + assert note["created_at"] + assert response["total"] == 1 + end + + test "it deletes the note", %{conn: conn, report_id: report_id} do + assert ReportNote |> Repo.all() |> length() == 2 + assert [note, _] = Repo.all(ReportNote) + + delete(conn, "/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}") + + assert ReportNote |> Repo.all() |> length() == 1 + end + end +end diff --git a/test/web/admin_api/controllers/status_controller_test.exs b/test/web/admin_api/controllers/status_controller_test.exs new file mode 100644 index 000000000..eff78fb0a --- /dev/null +++ b/test/web/admin_api/controllers/status_controller_test.exs @@ -0,0 +1,202 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.StatusControllerTest do + use Pleroma.Web.ConnCase + + import Pleroma.Factory + + alias Pleroma.Activity + alias Pleroma.Config + alias Pleroma.ModerationLog + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.CommonAPI + + setup do + admin = insert(:user, is_admin: true) + token = insert(:oauth_admin_token, user: admin) + + conn = + build_conn() + |> assign(:user, admin) + |> assign(:token, token) + + {:ok, %{admin: admin, token: token, conn: conn}} + end + + describe "GET /api/pleroma/admin/statuses/:id" do + test "not found", %{conn: conn} do + assert conn + |> get("/api/pleroma/admin/statuses/not_found") + |> json_response_and_validate_schema(:not_found) + end + + test "shows activity", %{conn: conn} do + activity = insert(:note_activity) + + response = + conn + |> get("/api/pleroma/admin/statuses/#{activity.id}") + |> json_response_and_validate_schema(200) + + assert response["id"] == activity.id + + account = response["account"] + actor = User.get_by_ap_id(activity.actor) + + assert account["id"] == actor.id + assert account["nickname"] == actor.nickname + assert account["deactivated"] == actor.deactivated + assert account["confirmation_pending"] == actor.confirmation_pending + end + end + + describe "PUT /api/pleroma/admin/statuses/:id" do + setup do + activity = insert(:note_activity) + + %{id: activity.id} + end + + test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "true"}) + |> json_response_and_validate_schema(:ok) + + assert response["sensitive"] + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} updated status ##{id}, set sensitive: 'true'" + + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{"sensitive" => "false"}) + |> json_response_and_validate_schema(:ok) + + refute response["sensitive"] + end + + test "change visibility flag", %{conn: conn, id: id, admin: admin} do + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "public"}) + |> json_response_and_validate_schema(:ok) + + assert response["visibility"] == "public" + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} updated status ##{id}, set visibility: 'public'" + + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "private"}) + |> json_response_and_validate_schema(:ok) + + assert response["visibility"] == "private" + + response = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "unlisted"}) + |> json_response_and_validate_schema(:ok) + + assert response["visibility"] == "unlisted" + end + + test "returns 400 when visibility is unknown", %{conn: conn, id: id} do + conn = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "test"}) + + assert %{"error" => "test - Invalid value for enum."} = + json_response_and_validate_schema(conn, :bad_request) + end + end + + describe "DELETE /api/pleroma/admin/statuses/:id" do + setup do + activity = insert(:note_activity) + + %{id: activity.id} + end + + test "deletes status", %{conn: conn, id: id, admin: admin} do + conn + |> delete("/api/pleroma/admin/statuses/#{id}") + |> json_response_and_validate_schema(:ok) + + refute Activity.get_by_id(id) + + log_entry = Repo.one(ModerationLog) + + assert ModerationLog.get_log_entry_message(log_entry) == + "@#{admin.nickname} deleted status ##{id}" + end + + test "returns 404 when the status does not exist", %{conn: conn} do + conn = delete(conn, "/api/pleroma/admin/statuses/test") + + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} + end + end + + describe "GET /api/pleroma/admin/statuses" do + test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do + blocked = insert(:user) + user = insert(:user) + User.block(admin, blocked) + + {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"}) + + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "unlisted"}) + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"}) + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"}) + {:ok, _} = CommonAPI.post(blocked, %{status: ".", visibility: "public"}) + + response = + conn + |> get("/api/pleroma/admin/statuses") + |> json_response_and_validate_schema(200) + + refute "private" in Enum.map(response, & &1["visibility"]) + assert length(response) == 3 + end + + test "returns only local statuses with local_only on", %{conn: conn} do + user = insert(:user) + remote_user = insert(:user, local: false, nickname: "archaeme@archae.me") + insert(:note_activity, user: user, local: true) + insert(:note_activity, user: remote_user, local: false) + + response = + conn + |> get("/api/pleroma/admin/statuses?local_only=true") + |> json_response_and_validate_schema(200) + + assert length(response) == 1 + end + + test "returns private and direct statuses with godmode on", %{conn: conn, admin: admin} do + user = insert(:user) + + {:ok, _} = CommonAPI.post(user, %{status: "@#{admin.nickname}", visibility: "direct"}) + + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "private"}) + {:ok, _} = CommonAPI.post(user, %{status: ".", visibility: "public"}) + conn = get(conn, "/api/pleroma/admin/statuses?godmode=true") + assert json_response_and_validate_schema(conn, 200) |> length() == 3 + end + end +end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 52e95397c..fc3bb845d 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -5,7 +5,9 @@ defmodule Pleroma.Web.CommonAPITest do use Pleroma.DataCase alias Pleroma.Activity + alias Pleroma.Chat alias Pleroma.Conversation.Participation + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub @@ -23,6 +25,196 @@ defmodule Pleroma.Web.CommonAPITest do setup do: clear_config([:instance, :limit]) setup do: clear_config([:instance, :max_pinned_statuses]) + describe "blocking" do + setup do + blocker = insert(:user) + blocked = insert(:user) + User.follow(blocker, blocked) + User.follow(blocked, blocker) + %{blocker: blocker, blocked: blocked} + end + + test "it blocks and federates", %{blocker: blocker, blocked: blocked} do + clear_config([:instance, :federating], true) + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + assert {:ok, block} = CommonAPI.block(blocker, blocked) + + assert block.local + assert User.blocks?(blocker, blocked) + refute User.following?(blocker, blocked) + refute User.following?(blocked, blocker) + + assert called(Pleroma.Web.Federator.publish(block)) + end + end + + test "it blocks and does not federate if outgoing blocks are disabled", %{ + blocker: blocker, + blocked: blocked + } do + clear_config([:instance, :federating], true) + clear_config([:activitypub, :outgoing_blocks], false) + + with_mock Pleroma.Web.Federator, + publish: fn _ -> nil end do + assert {:ok, block} = CommonAPI.block(blocker, blocked) + + assert block.local + assert User.blocks?(blocker, blocked) + refute User.following?(blocker, blocked) + refute User.following?(blocked, blocker) + + refute called(Pleroma.Web.Federator.publish(block)) + end + end + end + + describe "posting chat messages" do + setup do: clear_config([:instance, :chat_limit]) + + test "it posts a chat message without content but with an attachment" do + author = insert(:user) + recipient = insert(:user) + + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, upload} = ActivityPub.upload(file, actor: author.ap_id) + + with_mocks([ + { + Pleroma.Web.Streamer, + [], + [ + stream: fn _, _ -> + nil + end + ] + }, + { + Pleroma.Web.Push, + [], + [ + send: fn _ -> nil end + ] + } + ]) do + {:ok, activity} = + CommonAPI.post_chat_message( + author, + recipient, + nil, + media_id: upload.id + ) + + notification = + Notification.for_user_and_activity(recipient, activity) + |> Repo.preload(:activity) + + assert called(Pleroma.Web.Push.send(notification)) + assert called(Pleroma.Web.Streamer.stream(["user", "user:notification"], notification)) + assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], :_)) + + assert activity + end + end + + test "it adds html newlines" do + author = insert(:user) + recipient = insert(:user) + + other_user = insert(:user) + + {:ok, activity} = + CommonAPI.post_chat_message( + author, + recipient, + "uguu\nuguuu" + ) + + assert other_user.ap_id not in activity.recipients + + object = Object.normalize(activity, false) + + assert object.data["content"] == "uguu
    uguuu" + end + + test "it linkifies" do + author = insert(:user) + recipient = insert(:user) + + other_user = insert(:user) + + {:ok, activity} = + CommonAPI.post_chat_message( + author, + recipient, + "https://example.org is the site of @#{other_user.nickname} #2hu" + ) + + assert other_user.ap_id not in activity.recipients + + object = Object.normalize(activity, false) + + assert object.data["content"] == + "https://example.org is the site of @#{other_user.nickname} #2hu" + end + + test "it posts a chat message" do + author = insert(:user) + recipient = insert(:user) + + {:ok, activity} = + CommonAPI.post_chat_message( + author, + recipient, + "a test message :firefox:" + ) + + assert activity.data["type"] == "Create" + assert activity.local + object = Object.normalize(activity) + + assert object.data["type"] == "ChatMessage" + assert object.data["to"] == [recipient.ap_id] + + assert object.data["content"] == + "a test message <script>alert('uuu')</script> :firefox:" + + assert object.data["emoji"] == %{ + "firefox" => "http://localhost:4001/emoji/Firefox.gif" + } + + assert Chat.get(author.id, recipient.ap_id) + assert Chat.get(recipient.id, author.ap_id) + + assert :ok == Pleroma.Web.Federator.perform(:publish, activity) + end + + test "it reject messages over the local limit" do + Pleroma.Config.put([:instance, :chat_limit], 2) + + author = insert(:user) + recipient = insert(:user) + + {:error, message} = + CommonAPI.post_chat_message( + author, + recipient, + "123" + ) + + assert message == :content_too_long + end + end + describe "unblocking" do test "it works even without an existing block activity" do blocked = insert(:user) @@ -41,6 +233,8 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + clear_config([:instance, :federating], true) + Object.normalize(post, false) |> Object.prune() @@ -59,6 +253,8 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + clear_config([:instance, :federating], true) + with_mock Pleroma.Web.Federator, publish: fn _ -> nil end do assert {:ok, delete} = CommonAPI.delete(post.id, user) @@ -335,6 +531,32 @@ defmodule Pleroma.Web.CommonAPITest do end) end + test "replying with a direct message will NOT auto-add the author of the reply to the recipient list" do + user = insert(:user) + other_user = insert(:user) + third_user = insert(:user) + + {:ok, post} = CommonAPI.post(user, %{status: "I'm stupid"}) + + {:ok, open_answer} = + CommonAPI.post(other_user, %{status: "No ur smart", in_reply_to_status_id: post.id}) + + # The OP is implicitly added + assert user.ap_id in open_answer.recipients + + {:ok, secret_answer} = + CommonAPI.post(other_user, %{ + status: "lol, that guy really is stupid, right, @#{third_user.nickname}?", + in_reply_to_status_id: post.id, + visibility: "direct" + }) + + assert third_user.ap_id in secret_answer.recipients + + # The OP is not added + refute user.ap_id in secret_answer.recipients + end + test "it allows to address a list" do user = insert(:user) {:ok, list} = Pleroma.List.create("foo", user) @@ -416,7 +638,8 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, %Activity{}, _} = CommonAPI.repeat(activity.id, user) + {:ok, %Activity{} = announce_activity} = CommonAPI.repeat(activity.id, user) + assert Visibility.is_public?(announce_activity) end test "can't repeat a repeat" do @@ -424,9 +647,9 @@ defmodule Pleroma.Web.CommonAPITest do other_user = insert(:user) {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, %Activity{} = announce, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, %Activity{} = announce} = CommonAPI.repeat(activity.id, other_user) - refute match?({:ok, %Activity{}, _}, CommonAPI.repeat(announce.id, user)) + refute match?({:ok, %Activity{}}, CommonAPI.repeat(announce.id, user)) end test "repeating a status privately" do @@ -435,10 +658,11 @@ defmodule Pleroma.Web.CommonAPITest do {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, %Activity{} = announce_activity, _} = + {:ok, %Activity{} = announce_activity} = CommonAPI.repeat(activity.id, user, %{visibility: "private"}) assert Visibility.is_private?(announce_activity) + refute Visibility.visible_for_user?(announce_activity, nil) end test "favoriting a status" do @@ -458,8 +682,8 @@ defmodule Pleroma.Web.CommonAPITest do other_user = insert(:user) {:ok, activity} = CommonAPI.post(other_user, %{status: "cofe"}) - {:ok, %Activity{} = announce, object} = CommonAPI.repeat(activity.id, user) - {:ok, ^announce, ^object} = CommonAPI.repeat(activity.id, user) + {:ok, %Activity{} = announce} = CommonAPI.repeat(activity.id, user) + {:ok, ^announce} = CommonAPI.repeat(activity.id, user) end test "favoriting a status twice returns ok, but without the like activity" do diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index 5708db6a4..e67c10b93 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -14,18 +14,41 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do @public_address "https://www.w3.org/ns/activitystreams#Public" - test "it adds attachment links to a given text and attachment set" do - name = - "Sakura%20Mana%20%E2%80%93%20Turned%20on%20by%20a%20Senior%20OL%20with%20a%20Temptating%20Tight%20Skirt-s%20Full%20Hipline%20and%20Panty%20Shot-%20Beautiful%20Thick%20Thighs-%20and%20Erotic%20Ass-%20-2015-%20--%20Oppaitime%208-28-2017%206-50-33%20PM.png" + describe "add_attachments/2" do + setup do + name = + "Sakura Mana – Turned on by a Senior OL with a Temptating Tight Skirt-s Full Hipline and Panty Shot- Beautiful Thick Thighs- and Erotic Ass- -2015- -- Oppaitime 8-28-2017 6-50-33 PM.png" - attachment = %{ - "url" => [%{"href" => name}] - } + attachment = %{ + "url" => [%{"href" => URI.encode(name)}] + } - res = Utils.add_attachments("", [attachment]) + %{name: name, attachment: attachment} + end + + test "it adds attachment links to a given text and attachment set", %{ + name: name, + attachment: attachment + } do + len = 10 + clear_config([Pleroma.Upload, :filename_display_max_length], len) + + expected = + "
    #{String.slice(name, 0..len)}…" + + assert Utils.add_attachments("", [attachment]) == expected + end + + test "doesn't truncate file name if config for truncate is set to 0", %{ + name: name, + attachment: attachment + } do + clear_config([Pleroma.Upload, :filename_display_max_length], 0) + + expected = "
    #{name}" - assert res == - "
    Sakura Mana – Turned on by a Se…" + assert Utils.add_attachments("", [attachment]) == expected + end end describe "it confirms the password given is the current users password" do @@ -297,11 +320,10 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "private", nil) - assert length(to) == 3 + assert length(to) == 2 assert Enum.empty?(cc) assert mentioned_user.ap_id in to - assert third_user.ap_id in to assert user.follower_address in to end @@ -327,6 +349,15 @@ defmodule Pleroma.Web.CommonAPI.UtilsTest do {to, cc} = Utils.get_to_and_cc(user, mentions, activity, "direct", nil) + assert length(to) == 1 + assert Enum.empty?(cc) + + assert mentioned_user.ap_id in to + + {:ok, direct_activity} = CommonAPI.post(third_user, %{status: "uguu", visibility: "direct"}) + + {to, cc} = Utils.get_to_and_cc(user, mentions, direct_activity, "direct", nil) + assert length(to) == 2 assert Enum.empty?(cc) diff --git a/test/web/fallback_test.exs b/test/web/fallback_test.exs index 3919ef93a..a65865860 100644 --- a/test/web/fallback_test.exs +++ b/test/web/fallback_test.exs @@ -6,22 +6,56 @@ defmodule Pleroma.Web.FallbackTest do use Pleroma.Web.ConnCase import Pleroma.Factory - test "GET /registration/:token", %{conn: conn} do - assert conn - |> get("/registration/foo") - |> html_response(200) =~ "" + describe "neither preloaded data nor metadata attached to" do + test "GET /registration/:token", %{conn: conn} do + response = get(conn, "/registration/foo") + + assert html_response(response, 200) =~ "" + end + + test "GET /*path", %{conn: conn} do + assert conn + |> get("/foo") + |> html_response(200) =~ "" + end end - test "GET /:maybe_nickname_or_id", %{conn: conn} do - user = insert(:user) + describe "preloaded data and metadata attached to" do + test "GET /:maybe_nickname_or_id", %{conn: conn} do + user = insert(:user) + user_missing = get(conn, "/foo") + user_present = get(conn, "/#{user.nickname}") - assert conn - |> get("/foo") - |> html_response(200) =~ "" + assert(html_response(user_missing, 200) =~ "") + refute html_response(user_present, 200) =~ "" + assert html_response(user_present, 200) =~ "initial-results" + end - refute conn - |> get("/" <> user.nickname) - |> html_response(200) =~ "" + test "GET /*path", %{conn: conn} do + assert conn + |> get("/foo") + |> html_response(200) =~ "" + + refute conn + |> get("/foo/bar") + |> html_response(200) =~ "" + end + end + + describe "preloaded data is attached to" do + test "GET /main/public", %{conn: conn} do + public_page = get(conn, "/main/public") + + refute html_response(public_page, 200) =~ "" + assert html_response(public_page, 200) =~ "initial-results" + end + + test "GET /main/all", %{conn: conn} do + public_page = get(conn, "/main/all") + + refute html_response(public_page, 200) =~ "" + assert html_response(public_page, 200) =~ "initial-results" + end end test "GET /api*path", %{conn: conn} do @@ -34,16 +68,6 @@ defmodule Pleroma.Web.FallbackTest do assert redirected_to(get(conn, "/pleroma/admin")) =~ "/pleroma/admin/" end - test "GET /*path", %{conn: conn} do - assert conn - |> get("/foo") - |> html_response(200) =~ "" - - assert conn - |> get("/foo/bar") - |> html_response(200) =~ "" - end - test "OPTIONS /*path", %{conn: conn} do assert conn |> options("/foo") diff --git a/test/web/federator_test.exs b/test/web/federator_test.exs index de90aa6e0..592fdccd1 100644 --- a/test/web/federator_test.exs +++ b/test/web/federator_test.exs @@ -23,7 +23,7 @@ defmodule Pleroma.Web.FederatorTest do setup_all do: clear_config([:instance, :federating], true) setup do: clear_config([:instance, :allow_relay]) - setup do: clear_config([:instance, :rewrite_policy]) + setup do: clear_config([:mrf, :policies]) setup do: clear_config([:mrf_keyword]) describe "Publish an activity" do @@ -158,7 +158,7 @@ defmodule Pleroma.Web.FederatorTest do Pleroma.Config.put([:mrf_keyword, :reject], ["lain"]) Pleroma.Config.put( - [:instance, :rewrite_policy], + [:mrf, :policies], Pleroma.Web.ActivityPub.MRF.KeywordPolicy ) diff --git a/test/web/feed/user_controller_test.exs b/test/web/feed/user_controller_test.exs index 05ad427c2..fa2ed1ea5 100644 --- a/test/web/feed/user_controller_test.exs +++ b/test/web/feed/user_controller_test.exs @@ -11,13 +11,14 @@ defmodule Pleroma.Web.Feed.UserControllerTest do alias Pleroma.Config alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.CommonAPI setup do: clear_config([:instance, :federating], true) describe "feed" do setup do: clear_config([:feed]) - test "gets a feed", %{conn: conn} do + test "gets an atom feed", %{conn: conn} do Config.put( [:feed, :post_title], %{max_length: 10, omission: "..."} @@ -157,6 +158,29 @@ defmodule Pleroma.Web.Feed.UserControllerTest do assert response(conn, 404) end + + test "returns feed with public and unlisted activities", %{conn: conn} do + user = insert(:user) + + {:ok, _} = CommonAPI.post(user, %{status: "public", visibility: "public"}) + {:ok, _} = CommonAPI.post(user, %{status: "direct", visibility: "direct"}) + {:ok, _} = CommonAPI.post(user, %{status: "unlisted", visibility: "unlisted"}) + {:ok, _} = CommonAPI.post(user, %{status: "private", visibility: "private"}) + + resp = + conn + |> put_req_header("accept", "application/atom+xml") + |> get(user_feed_path(conn, :feed, user.nickname)) + |> response(200) + + activity_titles = + resp + |> SweetXml.parse() + |> SweetXml.xpath(~x"//entry/title/text()"l) + |> Enum.sort() + + assert activity_titles == ['public', 'unlisted'] + end end # Note: see ActivityPubControllerTest for JSON format tests diff --git a/test/web/masto_fe_controller_test.exs b/test/web/masto_fe_controller_test.exs index 1d107d56c..f3b54b5f2 100644 --- a/test/web/masto_fe_controller_test.exs +++ b/test/web/masto_fe_controller_test.exs @@ -24,7 +24,7 @@ defmodule Pleroma.Web.MastodonAPI.MastoFEController do assert _result = json_response(conn, 200) user = User.get_cached_by_ap_id(user.ap_id) - assert user.settings == %{"programming" => "socks"} + assert user.mastofe_settings == %{"programming" => "socks"} end describe "index/2 redirections" do diff --git a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs index 696228203..f67d294ba 100644 --- a/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs +++ b/test/web/mastodon_api/controllers/account_controller/update_credentials_test.exs @@ -8,6 +8,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do use Pleroma.Web.ConnCase + import Mock import Pleroma.Factory setup do: clear_config([:instance, :max_account_fields]) @@ -52,33 +53,39 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do user = Repo.get(User, user_data["id"]) - res_conn = - conn - |> assign(:user, user) - |> patch("/api/v1/accounts/update_credentials", %{ - "pleroma_settings_store" => %{ - masto_fe: %{ - theme: "blub" + clear_config([:instance, :federating], true) + + with_mock Pleroma.Web.Federator, + publish: fn _activity -> :ok end do + res_conn = + conn + |> assign(:user, user) + |> patch("/api/v1/accounts/update_credentials", %{ + "pleroma_settings_store" => %{ + masto_fe: %{ + theme: "blub" + } } - } - }) + }) - assert user_data = json_response_and_validate_schema(res_conn, 200) + assert user_data = json_response_and_validate_schema(res_conn, 200) - assert user_data["pleroma"]["settings_store"] == - %{ - "pleroma_fe" => %{"theme" => "bla"}, - "masto_fe" => %{"theme" => "blub"} - } + assert user_data["pleroma"]["settings_store"] == + %{ + "pleroma_fe" => %{"theme" => "bla"}, + "masto_fe" => %{"theme" => "blub"} + } + + assert_called(Pleroma.Web.Federator.publish(:_)) + end end test "updates the user's bio", %{conn: conn} do user2 = insert(:user) - conn = - patch(conn, "/api/v1/accounts/update_credentials", %{ - "note" => "I drink #cofe with @#{user2.nickname}\n\nsuya.." - }) + raw_bio = "I drink #cofe with @#{user2.nickname}\n\nsuya.." + + conn = patch(conn, "/api/v1/accounts/update_credentials", %{"note" => raw_bio}) assert user_data = json_response_and_validate_schema(conn, 200) @@ -86,6 +93,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do ~s(I drink #cofe with @#{user2.nickname}

    suya..) + + assert user_data["source"]["note"] == raw_bio + + user = Repo.get(User, user_data["id"]) + + assert user.raw_bio == raw_bio end test "updates the user's locking status", %{conn: conn} do @@ -387,4 +400,71 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController.UpdateCredentialsTest do |> json_response_and_validate_schema(403) end end + + describe "Mark account as bot" do + setup do: oauth_access(["write:accounts"]) + setup :request_content_type + + test "changing actor_type to Service makes account a bot", %{conn: conn} do + account = + conn + |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Service"}) + |> json_response_and_validate_schema(200) + + assert account["bot"] + assert account["source"]["pleroma"]["actor_type"] == "Service" + end + + test "changing actor_type to Person makes account a human", %{conn: conn} do + account = + conn + |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Person"}) + |> json_response_and_validate_schema(200) + + refute account["bot"] + assert account["source"]["pleroma"]["actor_type"] == "Person" + end + + test "changing actor_type to Application causes error", %{conn: conn} do + response = + conn + |> patch("/api/v1/accounts/update_credentials", %{actor_type: "Application"}) + |> json_response_and_validate_schema(403) + + assert %{"error" => "Invalid request"} == response + end + + test "changing bot field to true changes actor_type to Service", %{conn: conn} do + account = + conn + |> patch("/api/v1/accounts/update_credentials", %{bot: "true"}) + |> json_response_and_validate_schema(200) + + assert account["bot"] + assert account["source"]["pleroma"]["actor_type"] == "Service" + end + + test "changing bot field to false changes actor_type to Person", %{conn: conn} do + account = + conn + |> patch("/api/v1/accounts/update_credentials", %{bot: "false"}) + |> json_response_and_validate_schema(200) + + refute account["bot"] + assert account["source"]["pleroma"]["actor_type"] == "Person" + end + + test "actor_type field has a higher priority than bot", %{conn: conn} do + account = + conn + |> patch("/api/v1/accounts/update_credentials", %{ + actor_type: "Person", + bot: "true" + }) + |> json_response_and_validate_schema(200) + + refute account["bot"] + assert account["source"]["pleroma"]["actor_type"] == "Person" + end + end end diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 280bd6aca..260ad2306 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -127,6 +127,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do |> get("/api/v1/accounts/internal.fetch") |> json_response_and_validate_schema(404) end + + test "returns 404 for deactivated user", %{conn: conn} do + user = insert(:user, deactivated: true) + + assert %{"error" => "Can't find user"} = + conn + |> get("/api/v1/accounts/#{user.id}") + |> json_response_and_validate_schema(:not_found) + end end defp local_and_remote_users do @@ -143,15 +152,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - assert %{"error" => "Can't find user"} == + assert %{"error" => "This API requires an authenticated user"} == conn |> get("/api/v1/accounts/#{local.id}") - |> json_response_and_validate_schema(:not_found) + |> json_response_and_validate_schema(:unauthorized) - assert %{"error" => "Can't find user"} == + assert %{"error" => "This API requires an authenticated user"} == conn |> get("/api/v1/accounts/#{remote.id}") - |> json_response_and_validate_schema(:not_found) + |> json_response_and_validate_schema(:unauthorized) end test "if user is authenticated", %{local: local, remote: remote} do @@ -173,8 +182,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do res_conn = get(conn, "/api/v1/accounts/#{local.id}") - assert json_response_and_validate_schema(res_conn, :not_found) == %{ - "error" => "Can't find user" + assert json_response_and_validate_schema(res_conn, :unauthorized) == %{ + "error" => "This API requires an authenticated user" } res_conn = get(conn, "/api/v1/accounts/#{remote.id}") @@ -203,8 +212,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do res_conn = get(conn, "/api/v1/accounts/#{remote.id}") - assert json_response_and_validate_schema(res_conn, :not_found) == %{ - "error" => "Can't find user" + assert json_response_and_validate_schema(res_conn, :unauthorized) == %{ + "error" => "This API requires an authenticated user" } end @@ -249,6 +258,24 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do assert id == announce.id end + test "deactivated user", %{conn: conn} do + user = insert(:user, deactivated: true) + + assert %{"error" => "Can't find user"} == + conn + |> get("/api/v1/accounts/#{user.id}/statuses") + |> json_response_and_validate_schema(:not_found) + end + + test "returns 404 when user is invisible", %{conn: conn} do + user = insert(:user, %{invisible: true}) + + assert %{"error" => "Can't find user"} = + conn + |> get("/api/v1/accounts/#{user.id}") + |> json_response_and_validate_schema(404) + end + test "respects blocks", %{user: user_one, conn: conn} do user_two = insert(:user) user_three = insert(:user) @@ -256,7 +283,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do User.block(user_one, user_two) {:ok, activity} = CommonAPI.post(user_two, %{status: "User one sux0rz"}) - {:ok, repeat, _} = CommonAPI.repeat(activity.id, user_three) + {:ok, repeat} = CommonAPI.repeat(activity.id, user_three) assert resp = conn @@ -350,9 +377,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do assert json_response_and_validate_schema(conn, 200) == [] end - test "gets an users media", %{conn: conn} do + test "gets an users media, excludes reblogs", %{conn: conn} do note = insert(:note_activity) user = User.get_cached_by_ap_id(note.data["actor"]) + other_user = insert(:user) file = %Plug.Upload{ content_type: "image/jpg", @@ -364,6 +392,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do {:ok, %{id: image_post_id}} = CommonAPI.post(user, %{status: "cofe", media_ids: [media_id]}) + {:ok, %{id: media_id}} = ActivityPub.upload(file, actor: other_user.ap_id) + + {:ok, %{id: other_image_post_id}} = + CommonAPI.post(other_user, %{status: "cofe2", media_ids: [media_id]}) + + {:ok, _announce} = CommonAPI.repeat(other_image_post_id, user) + conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?only_media=true") assert [%{"id" => ^image_post_id}] = json_response_and_validate_schema(conn, 200) @@ -375,7 +410,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do test "gets a user's statuses without reblogs", %{user: user, conn: conn} do {:ok, %{id: post_id}} = CommonAPI.post(user, %{status: "HI!!!"}) - {:ok, _, _} = CommonAPI.repeat(post_id, user) + {:ok, _} = CommonAPI.repeat(post_id, user) conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?exclude_reblogs=true") assert [%{"id" => ^post_id}] = json_response_and_validate_schema(conn, 200) @@ -422,15 +457,15 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do setup do: clear_config([:restrict_unauthenticated, :profiles, :remote], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - assert %{"error" => "Can't find user"} == + assert %{"error" => "This API requires an authenticated user"} == conn |> get("/api/v1/accounts/#{local.id}/statuses") - |> json_response_and_validate_schema(:not_found) + |> json_response_and_validate_schema(:unauthorized) - assert %{"error" => "Can't find user"} == + assert %{"error" => "This API requires an authenticated user"} == conn |> get("/api/v1/accounts/#{remote.id}/statuses") - |> json_response_and_validate_schema(:not_found) + |> json_response_and_validate_schema(:unauthorized) end test "if user is authenticated", %{local: local, remote: remote} do @@ -451,10 +486,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do setup do: clear_config([:restrict_unauthenticated, :profiles, :local], true) test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} do - assert %{"error" => "Can't find user"} == + assert %{"error" => "This API requires an authenticated user"} == conn |> get("/api/v1/accounts/#{local.id}/statuses") - |> json_response_and_validate_schema(:not_found) + |> json_response_and_validate_schema(:unauthorized) res_conn = get(conn, "/api/v1/accounts/#{remote.id}/statuses") assert length(json_response_and_validate_schema(res_conn, 200)) == 1 @@ -481,10 +516,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do res_conn = get(conn, "/api/v1/accounts/#{local.id}/statuses") assert length(json_response_and_validate_schema(res_conn, 200)) == 1 - assert %{"error" => "Can't find user"} == + assert %{"error" => "This API requires an authenticated user"} == conn |> get("/api/v1/accounts/#{remote.id}/statuses") - |> json_response_and_validate_schema(:not_found) + |> json_response_and_validate_schema(:unauthorized) end test "if user is authenticated", %{local: local, remote: remote} do @@ -678,7 +713,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do assert %{"showing_reblogs" => false} = json_response_and_validate_schema(ret_conn, 200) {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"}) - {:ok, %{id: reblog_id}, _} = CommonAPI.repeat(activity.id, followed) + {:ok, %{id: reblog_id}} = CommonAPI.repeat(activity.id, followed) assert [] == conn @@ -745,7 +780,6 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do assert %{"id" => _id, "muting" => true, "muting_notifications" => true} = conn - |> put_req_header("content-type", "application/json") |> post("/api/v1/accounts/#{other_user.id}/mute") |> json_response_and_validate_schema(200) diff --git a/test/web/mastodon_api/controllers/conversation_controller_test.exs b/test/web/mastodon_api/controllers/conversation_controller_test.exs index 693ba51e5..3e21e6bf1 100644 --- a/test/web/mastodon_api/controllers/conversation_controller_test.exs +++ b/test/web/mastodon_api/controllers/conversation_controller_test.exs @@ -12,84 +12,88 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do setup do: oauth_access(["read:statuses"]) - test "returns a list of conversations", %{user: user_one, conn: conn} do - user_two = insert(:user) - user_three = insert(:user) - - {:ok, user_two} = User.follow(user_two, user_one) - - assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 - - {:ok, direct} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}, @#{user_three.nickname}!", - visibility: "direct" - }) - - assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 - - {:ok, _follower_only} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}!", - visibility: "private" - }) - - res_conn = get(conn, "/api/v1/conversations") - - assert response = json_response_and_validate_schema(res_conn, 200) - - assert [ - %{ - "id" => res_id, - "accounts" => res_accounts, - "last_status" => res_last_status, - "unread" => unread - } - ] = response - - account_ids = Enum.map(res_accounts, & &1["id"]) - assert length(res_accounts) == 2 - assert user_two.id in account_ids - assert user_three.id in account_ids - assert is_binary(res_id) - assert unread == false - assert res_last_status["id"] == direct.id - assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 + describe "returns a list of conversations" do + setup(%{user: user_one, conn: conn}) do + user_two = insert(:user) + user_three = insert(:user) + + {:ok, user_two} = User.follow(user_two, user_one) + + {:ok, %{user: user_one, user_two: user_two, user_three: user_three, conn: conn}} + end + + test "returns correct conversations", %{ + user: user_one, + user_two: user_two, + user_three: user_three, + conn: conn + } do + assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 + {:ok, direct} = create_direct_message(user_one, [user_two, user_three]) + + assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 + + {:ok, _follower_only} = + CommonAPI.post(user_one, %{ + status: "Hi @#{user_two.nickname}!", + visibility: "private" + }) + + res_conn = get(conn, "/api/v1/conversations") + + assert response = json_response_and_validate_schema(res_conn, 200) + + assert [ + %{ + "id" => res_id, + "accounts" => res_accounts, + "last_status" => res_last_status, + "unread" => unread + } + ] = response + + account_ids = Enum.map(res_accounts, & &1["id"]) + assert length(res_accounts) == 2 + assert user_two.id in account_ids + assert user_three.id in account_ids + assert is_binary(res_id) + assert unread == false + assert res_last_status["id"] == direct.id + assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 + end + + test "observes limit params", %{ + user: user_one, + user_two: user_two, + user_three: user_three, + conn: conn + } do + {:ok, _} = create_direct_message(user_one, [user_two, user_three]) + {:ok, _} = create_direct_message(user_two, [user_one, user_three]) + {:ok, _} = create_direct_message(user_three, [user_two, user_one]) + + res_conn = get(conn, "/api/v1/conversations?limit=1") + + assert response = json_response_and_validate_schema(res_conn, 200) + + assert Enum.count(response) == 1 + + res_conn = get(conn, "/api/v1/conversations?limit=2") + + assert response = json_response_and_validate_schema(res_conn, 200) + + assert Enum.count(response) == 2 + end end test "filters conversations by recipients", %{user: user_one, conn: conn} do user_two = insert(:user) user_three = insert(:user) - - {:ok, direct1} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}!", - visibility: "direct" - }) - - {:ok, _direct2} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_three.nickname}!", - visibility: "direct" - }) - - {:ok, direct3} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}, @#{user_three.nickname}!", - visibility: "direct" - }) - - {:ok, _direct4} = - CommonAPI.post(user_two, %{ - status: "Hi @#{user_three.nickname}!", - visibility: "direct" - }) - - {:ok, direct5} = - CommonAPI.post(user_two, %{ - status: "Hi @#{user_one.nickname}!", - visibility: "direct" - }) + {:ok, direct1} = create_direct_message(user_one, [user_two]) + {:ok, _direct2} = create_direct_message(user_one, [user_three]) + {:ok, direct3} = create_direct_message(user_one, [user_two, user_three]) + {:ok, _direct4} = create_direct_message(user_two, [user_three]) + {:ok, direct5} = create_direct_message(user_two, [user_one]) assert [conversation1, conversation2] = conn @@ -109,12 +113,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do test "updates the last_status on reply", %{user: user_one, conn: conn} do user_two = insert(:user) - - {:ok, direct} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}", - visibility: "direct" - }) + {:ok, direct} = create_direct_message(user_one, [user_two]) {:ok, direct_reply} = CommonAPI.post(user_two, %{ @@ -133,12 +132,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do test "the user marks a conversation as read", %{user: user_one, conn: conn} do user_two = insert(:user) - - {:ok, direct} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}", - visibility: "direct" - }) + {:ok, direct} = create_direct_message(user_one, [user_two]) assert User.get_cached_by_id(user_one.id).unread_conversation_count == 0 assert User.get_cached_by_id(user_two.id).unread_conversation_count == 1 @@ -194,15 +188,22 @@ defmodule Pleroma.Web.MastodonAPI.ConversationControllerTest do test "(vanilla) Mastodon frontend behaviour", %{user: user_one, conn: conn} do user_two = insert(:user) - - {:ok, direct} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}!", - visibility: "direct" - }) + {:ok, direct} = create_direct_message(user_one, [user_two]) res_conn = get(conn, "/api/v1/statuses/#{direct.id}/context") assert %{"ancestors" => [], "descendants" => []} == json_response(res_conn, 200) end + + defp create_direct_message(sender, recips) do + hellos = + recips + |> Enum.map(fn s -> "@#{s.nickname}" end) + |> Enum.join(", ") + + CommonAPI.post(sender, %{ + status: "Hi #{hellos}!", + visibility: "direct" + }) + end end diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index 562fc4d8e..70ef0e8b5 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -54,6 +54,27 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do assert response == expected_response end + test "by default, does not contain pleroma:chat_mention" do + %{user: user, conn: conn} = oauth_access(["read:notifications"]) + other_user = insert(:user) + + {:ok, _activity} = CommonAPI.post_chat_message(other_user, user, "hey") + + result = + conn + |> get("/api/v1/notifications") + |> json_response_and_validate_schema(200) + + assert [] == result + + result = + conn + |> get("/api/v1/notifications?include_types[]=pleroma:chat_mention") + |> json_response_and_validate_schema(200) + + assert [_] = result + end + test "getting a single notification" do %{user: user, conn: conn} = oauth_access(["read:notifications"]) other_user = insert(:user) @@ -280,8 +301,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do {:ok, unlisted_activity} = CommonAPI.post(other_user, %{status: ".", visibility: "unlisted"}) - {:ok, _, _} = CommonAPI.repeat(public_activity.id, user) - {:ok, _, _} = CommonAPI.repeat(unlisted_activity.id, user) + {:ok, _} = CommonAPI.repeat(public_activity.id, user) + {:ok, _} = CommonAPI.repeat(unlisted_activity.id, user) activity_ids = conn @@ -292,6 +313,33 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do assert public_activity.id in activity_ids refute unlisted_activity.id in activity_ids end + + test "doesn't return less than the requested amount of records when the user's reply is liked" do + user = insert(:user) + %{user: other_user, conn: conn} = oauth_access(["read:notifications"]) + + {:ok, mention} = + CommonAPI.post(user, %{status: "@#{other_user.nickname}", visibility: "public"}) + + {:ok, activity} = CommonAPI.post(user, %{status: ".", visibility: "public"}) + + {:ok, reply} = + CommonAPI.post(other_user, %{ + status: ".", + visibility: "public", + in_reply_to_status_id: activity.id + }) + + {:ok, _favorite} = CommonAPI.favorite(user, reply.id) + + activity_ids = + conn + |> get("/api/v1/notifications?exclude_visibilities[]=direct&limit=2") + |> json_response_and_validate_schema(200) + |> Enum.map(& &1["status"]["id"]) + + assert [reply.id, mention.id] == activity_ids + end end test "filters notifications using exclude_types" do @@ -301,7 +349,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do {:ok, mention_activity} = CommonAPI.post(other_user, %{status: "hey @#{user.nickname}"}) {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id) - {:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user) + {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, other_user) {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user) mention_notification_id = get_notification_id_by_activity(mention_activity) @@ -339,7 +387,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationControllerTest do {:ok, mention_activity} = CommonAPI.post(other_user, %{status: "hey @#{user.nickname}"}) {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) {:ok, favorite_activity} = CommonAPI.favorite(other_user, create_activity.id) - {:ok, reblog_activity, _} = CommonAPI.repeat(create_activity.id, other_user) + {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, other_user) {:ok, _, _, follow_activity} = CommonAPI.follow(other_user, user) mention_notification_id = get_notification_id_by_activity(mention_activity) diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 7d0cafccc..826f37fbc 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -71,10 +71,102 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do get(conn, "/api/v2/search?q=天子") |> json_response_and_validate_schema(200) + assert results["hashtags"] == [ + %{"name" => "天子", "url" => "#{Web.base_url()}/tag/天子"} + ] + [status] = results["statuses"] assert status["id"] == to_string(activity.id) end + test "constructs hashtags from search query", %{conn: conn} do + results = + conn + |> get("/api/v2/search?#{URI.encode_query(%{q: "some text with #explicit #hashtags"})}") + |> json_response_and_validate_schema(200) + + assert results["hashtags"] == [ + %{"name" => "explicit", "url" => "#{Web.base_url()}/tag/explicit"}, + %{"name" => "hashtags", "url" => "#{Web.base_url()}/tag/hashtags"} + ] + + results = + conn + |> get("/api/v2/search?#{URI.encode_query(%{q: "john doe JOHN DOE"})}") + |> json_response_and_validate_schema(200) + + assert results["hashtags"] == [ + %{"name" => "john", "url" => "#{Web.base_url()}/tag/john"}, + %{"name" => "doe", "url" => "#{Web.base_url()}/tag/doe"}, + %{"name" => "JohnDoe", "url" => "#{Web.base_url()}/tag/JohnDoe"} + ] + + results = + conn + |> get("/api/v2/search?#{URI.encode_query(%{q: "accident-prone"})}") + |> json_response_and_validate_schema(200) + + assert results["hashtags"] == [ + %{"name" => "accident", "url" => "#{Web.base_url()}/tag/accident"}, + %{"name" => "prone", "url" => "#{Web.base_url()}/tag/prone"}, + %{"name" => "AccidentProne", "url" => "#{Web.base_url()}/tag/AccidentProne"} + ] + + results = + conn + |> get("/api/v2/search?#{URI.encode_query(%{q: "https://shpposter.club/users/shpuld"})}") + |> json_response_and_validate_schema(200) + + assert results["hashtags"] == [ + %{"name" => "shpuld", "url" => "#{Web.base_url()}/tag/shpuld"} + ] + + results = + conn + |> get( + "/api/v2/search?#{ + URI.encode_query(%{ + q: + "https://www.washingtonpost.com/sports/2020/06/10/" <> + "nascar-ban-display-confederate-flag-all-events-properties/" + }) + }" + ) + |> json_response_and_validate_schema(200) + + assert results["hashtags"] == [ + %{"name" => "nascar", "url" => "#{Web.base_url()}/tag/nascar"}, + %{"name" => "ban", "url" => "#{Web.base_url()}/tag/ban"}, + %{"name" => "display", "url" => "#{Web.base_url()}/tag/display"}, + %{"name" => "confederate", "url" => "#{Web.base_url()}/tag/confederate"}, + %{"name" => "flag", "url" => "#{Web.base_url()}/tag/flag"}, + %{"name" => "all", "url" => "#{Web.base_url()}/tag/all"}, + %{"name" => "events", "url" => "#{Web.base_url()}/tag/events"}, + %{"name" => "properties", "url" => "#{Web.base_url()}/tag/properties"}, + %{ + "name" => "NascarBanDisplayConfederateFlagAllEventsProperties", + "url" => + "#{Web.base_url()}/tag/NascarBanDisplayConfederateFlagAllEventsProperties" + } + ] + end + + test "supports pagination of hashtags search results", %{conn: conn} do + results = + conn + |> get( + "/api/v2/search?#{ + URI.encode_query(%{q: "#some #text #with #hashtags", limit: 2, offset: 1}) + }" + ) + |> json_response_and_validate_schema(200) + + assert results["hashtags"] == [ + %{"name" => "text", "url" => "#{Web.base_url()}/tag/text"}, + %{"name" => "with", "url" => "#{Web.base_url()}/tag/with"} + ] + end + test "excludes a blocked users from search results", %{conn: conn} do user = insert(:user) user_smith = insert(:user, %{nickname: "Agent", name: "I love 2hu"}) @@ -179,7 +271,7 @@ defmodule Pleroma.Web.MastodonAPI.SearchControllerTest do [account | _] = results["accounts"] assert account["id"] == to_string(user_three.id) - assert results["hashtags"] == [] + assert results["hashtags"] == ["2hu"] [status] = results["statuses"] assert status["id"] == to_string(activity.id) diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index 962e64b03..a98e939e8 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -878,8 +878,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do user3 = insert(:user) {:ok, _} = CommonAPI.favorite(user2, activity.id) {:ok, _bookmark} = Pleroma.Bookmark.create(user2.id, activity.id) - {:ok, reblog_activity1, _object} = CommonAPI.repeat(activity.id, user1) - {:ok, _, _object} = CommonAPI.repeat(activity.id, user2) + {:ok, reblog_activity1} = CommonAPI.repeat(activity.id, user1) + {:ok, _} = CommonAPI.repeat(activity.id, user2) conn_res = build_conn() @@ -917,7 +917,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do test "unreblogs and returns the unreblogged status", %{user: user, conn: conn} do activity = insert(:note_activity) - {:ok, _, _} = CommonAPI.repeat(activity.id, user) + {:ok, _} = CommonAPI.repeat(activity.id, user) conn = conn @@ -1427,7 +1427,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do test "returns users who have reblogged the status", %{conn: conn, activity: activity} do other_user = insert(:user) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) response = conn @@ -1458,7 +1458,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do other_user = insert(:user) {:ok, _user_relationship} = User.block(user, other_user) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) response = conn @@ -1469,12 +1469,12 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do end test "does not return users who have reblogged the status privately", %{ - conn: conn, - activity: activity + conn: conn } do other_user = insert(:user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "my secret post"}) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user, %{visibility: "private"}) + {:ok, _} = CommonAPI.repeat(activity.id, other_user, %{visibility: "private"}) response = conn @@ -1486,7 +1486,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do test "does not fail on an unauthenticated request", %{activity: activity} do other_user = insert(:user) - {:ok, _, _} = CommonAPI.repeat(activity.id, other_user) + {:ok, _} = CommonAPI.repeat(activity.id, other_user) response = build_conn() @@ -1541,14 +1541,49 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do } = response end + test "favorites paginate correctly" do + %{user: user, conn: conn} = oauth_access(["read:favourites"]) + other_user = insert(:user) + {:ok, first_post} = CommonAPI.post(other_user, %{status: "bla"}) + {:ok, second_post} = CommonAPI.post(other_user, %{status: "bla"}) + {:ok, third_post} = CommonAPI.post(other_user, %{status: "bla"}) + + {:ok, _first_favorite} = CommonAPI.favorite(user, third_post.id) + {:ok, _second_favorite} = CommonAPI.favorite(user, first_post.id) + {:ok, third_favorite} = CommonAPI.favorite(user, second_post.id) + + result = + conn + |> get("/api/v1/favourites?limit=1") + + assert [%{"id" => post_id}] = json_response_and_validate_schema(result, 200) + assert post_id == second_post.id + + # Using the header for pagination works correctly + [next, _] = get_resp_header(result, "link") |> hd() |> String.split(", ") + [_, max_id] = Regex.run(~r/max_id=([^&]+)/, next) + + assert max_id == third_favorite.id + + result = + conn + |> get("/api/v1/favourites?max_id=#{max_id}") + + assert [%{"id" => first_post_id}, %{"id" => third_post_id}] = + json_response_and_validate_schema(result, 200) + + assert first_post_id == first_post.id + assert third_post_id == third_post.id + end + test "returns the favorites of a user" do %{user: user, conn: conn} = oauth_access(["read:favourites"]) other_user = insert(:user) {:ok, _} = CommonAPI.post(other_user, %{status: "bla"}) - {:ok, activity} = CommonAPI.post(other_user, %{status: "traps are happy"}) + {:ok, activity} = CommonAPI.post(other_user, %{status: "trees are happy"}) - {:ok, _} = CommonAPI.favorite(user, activity.id) + {:ok, last_like} = CommonAPI.favorite(user, activity.id) first_conn = get(conn, "/api/v1/favourites") @@ -1566,9 +1601,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusControllerTest do {:ok, _} = CommonAPI.favorite(user, second_activity.id) - last_like = status["id"] - - second_conn = get(conn, "/api/v1/favourites?since_id=#{last_like}") + second_conn = get(conn, "/api/v1/favourites?since_id=#{last_like.id}") assert [second_status] = json_response_and_validate_schema(second_conn, 200) assert second_status["id"] == to_string(second_activity.id) diff --git a/test/web/mastodon_api/controllers/subscription_controller_test.exs b/test/web/mastodon_api/controllers/subscription_controller_test.exs index 4aa260663..d36bb1ae8 100644 --- a/test/web/mastodon_api/controllers/subscription_controller_test.exs +++ b/test/web/mastodon_api/controllers/subscription_controller_test.exs @@ -58,7 +58,9 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do result = conn |> post("/api/v1/push/subscription", %{ - "data" => %{"alerts" => %{"mention" => true, "test" => true}}, + "data" => %{ + "alerts" => %{"mention" => true, "test" => true, "pleroma:chat_mention" => true} + }, "subscription" => @sub }) |> json_response_and_validate_schema(200) @@ -66,7 +68,7 @@ defmodule Pleroma.Web.MastodonAPI.SubscriptionControllerTest do [subscription] = Pleroma.Repo.all(Subscription) assert %{ - "alerts" => %{"mention" => true}, + "alerts" => %{"mention" => true, "pleroma:chat_mention" => true}, "endpoint" => subscription.endpoint, "id" => to_string(subscription.id), "server_key" => @server_key diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 2375ac8e8..f069390c1 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -60,9 +60,9 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do describe "public" do @tag capture_log: true test "the public timeline", %{conn: conn} do - following = insert(:user) + user = insert(:user) - {:ok, _activity} = CommonAPI.post(following, %{status: "test"}) + {:ok, activity} = CommonAPI.post(user, %{status: "test"}) _activity = insert(:note_activity, local: false) @@ -77,6 +77,13 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do conn = get(build_conn(), "/api/v1/timelines/public?local=1") assert [%{"content" => "test"}] = json_response_and_validate_schema(conn, :ok) + + # does not contain repeats + {:ok, _} = CommonAPI.repeat(activity.id, user) + + conn = get(build_conn(), "/api/v1/timelines/public?local=true") + + assert [_] = json_response_and_validate_schema(conn, :ok) end test "the public timeline includes only public statuses for an authenticated user" do @@ -90,6 +97,49 @@ defmodule Pleroma.Web.MastodonAPI.TimelineControllerTest do res_conn = get(conn, "/api/v1/timelines/public") assert length(json_response_and_validate_schema(res_conn, 200)) == 1 end + + test "doesn't return replies if follower is posting with blocked user" do + %{conn: conn, user: blocker} = oauth_access(["read:statuses"]) + [blockee, friend] = insert_list(2, :user) + {:ok, blocker} = User.follow(blocker, friend) + {:ok, _} = User.block(blocker, blockee) + + conn = assign(conn, :user, blocker) + + {:ok, %{id: activity_id} = activity} = CommonAPI.post(friend, %{status: "hey!"}) + + {:ok, reply_from_blockee} = + CommonAPI.post(blockee, %{status: "heya", in_reply_to_status_id: activity}) + + {:ok, _reply_from_friend} = + CommonAPI.post(friend, %{status: "status", in_reply_to_status_id: reply_from_blockee}) + + res_conn = get(conn, "/api/v1/timelines/public") + [%{"id" => ^activity_id}] = json_response_and_validate_schema(res_conn, 200) + end + + test "doesn't return replies if follow is posting with users from blocked domain" do + %{conn: conn, user: blocker} = oauth_access(["read:statuses"]) + friend = insert(:user) + blockee = insert(:user, ap_id: "https://example.com/users/blocked") + {:ok, blocker} = User.follow(blocker, friend) + {:ok, blocker} = User.block_domain(blocker, "example.com") + + conn = assign(conn, :user, blocker) + + {:ok, %{id: activity_id} = activity} = CommonAPI.post(friend, %{status: "hey!"}) + + {:ok, reply_from_blockee} = + CommonAPI.post(blockee, %{status: "heya", in_reply_to_status_id: activity}) + + {:ok, _reply_from_friend} = + CommonAPI.post(friend, %{status: "status", in_reply_to_status_id: reply_from_blockee}) + + res_conn = get(conn, "/api/v1/timelines/public") + + activities = json_response_and_validate_schema(res_conn, 200) + [%{"id" => ^activity_id}] = activities + end end defp local_and_remote_activities do diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 487ec26c2..80b1f734c 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -33,7 +33,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do bio: "valid html. a
    b
    c
    d
    f '&<>\"", inserted_at: ~N[2017-08-15 15:47:06.597036], - emoji: %{"karjalanpiirakka" => "/file.png"} + emoji: %{"karjalanpiirakka" => "/file.png"}, + raw_bio: "valid html. a\nb\nc\nd\nf '&<>\"" }) expected = %{ @@ -54,10 +55,10 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do header_static: "http://localhost:4001/images/banner.png", emojis: [ %{ - "static_url" => "/file.png", - "url" => "/file.png", - "shortcode" => "karjalanpiirakka", - "visible_in_picker" => false + static_url: "/file.png", + url: "/file.png", + shortcode: "karjalanpiirakka", + visible_in_picker: false } ], fields: [], @@ -72,6 +73,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do fields: [] }, pleroma: %{ + ap_id: user.ap_id, background_image: "https://example.com/images/asuka_hospital.png", confirmation_pending: false, tags: [], @@ -148,6 +150,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do fields: [] }, pleroma: %{ + ap_id: user.ap_id, background_image: nil, confirmation_pending: false, tags: [], @@ -491,4 +494,31 @@ defmodule Pleroma.Web.MastodonAPI.AccountViewTest do AccountView.render("show.json", %{user: user, for: user}) end end + + test "uses mediaproxy urls when it's enabled" do + clear_config([:media_proxy, :enabled], true) + + user = + insert(:user, + avatar: %{"url" => [%{"href" => "https://evil.website/avatar.png"}]}, + banner: %{"url" => [%{"href" => "https://evil.website/banner.png"}]}, + emoji: %{"joker_smile" => "https://evil.website/society.png"} + ) + + AccountView.render("show.json", %{user: user}) + |> Enum.all?(fn + {key, url} when key in [:avatar, :avatar_static, :header, :header_static] -> + String.starts_with?(url, Pleroma.Web.base_url()) + + {:emojis, emojis} -> + Enum.all?(emojis, fn %{url: url, static_url: static_url} -> + String.starts_with?(url, Pleroma.Web.base_url()) && + String.starts_with?(static_url, Pleroma.Web.base_url()) + end) + + _ -> + true + end) + |> assert() + end end diff --git a/test/web/mastodon_api/views/conversation_view_test.exs b/test/web/mastodon_api/views/conversation_view_test.exs index 6f84366f8..2e8203c9b 100644 --- a/test/web/mastodon_api/views/conversation_view_test.exs +++ b/test/web/mastodon_api/views/conversation_view_test.exs @@ -15,8 +15,17 @@ defmodule Pleroma.Web.MastodonAPI.ConversationViewTest do user = insert(:user) other_user = insert(:user) + {:ok, parent} = CommonAPI.post(user, %{status: "parent"}) + {:ok, activity} = - CommonAPI.post(user, %{status: "hey @#{other_user.nickname}", visibility: "direct"}) + CommonAPI.post(user, %{ + status: "hey @#{other_user.nickname}", + visibility: "direct", + in_reply_to_id: parent.id + }) + + {:ok, _reply_activity} = + CommonAPI.post(user, %{status: "hu", visibility: "public", in_reply_to_id: parent.id}) [participation] = Participation.for_user_with_last_activity_id(user) diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 9839e48fc..8e0e58538 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -6,7 +6,10 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do use Pleroma.DataCase alias Pleroma.Activity + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference alias Pleroma.Notification + alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.CommonAPI @@ -14,6 +17,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MastodonAPI.NotificationView alias Pleroma.Web.MastodonAPI.StatusView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView import Pleroma.Factory defp test_notifications_rendering(notifications, user, expected_result) do @@ -31,6 +35,30 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do assert expected_result == result end + test "ChatMessage notification" do + user = insert(:user) + recipient = insert(:user) + {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "what's up my dude") + + {:ok, [notification]} = Notification.create_notifications(activity) + + object = Object.normalize(activity) + chat = Chat.get(recipient.id, user.ap_id) + + cm_ref = MessageReference.for_chat_and_object(chat, object) + + expected = %{ + id: to_string(notification.id), + pleroma: %{is_seen: false, is_muted: false}, + type: "pleroma:chat_mention", + account: AccountView.render("show.json", %{user: user, for: recipient}), + chat_message: MessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}), + created_at: Utils.to_masto_date(notification.inserted_at) + } + + test_notifications_rendering([notification], recipient, [expected]) + end + test "Mention notification" do user = insert(:user) mentioned_user = insert(:user) @@ -40,7 +68,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do expected = %{ id: to_string(notification.id), - pleroma: %{is_seen: false}, + pleroma: %{is_seen: false, is_muted: false}, type: "mention", account: AccountView.render("show.json", %{ @@ -64,7 +92,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do expected = %{ id: to_string(notification.id), - pleroma: %{is_seen: false}, + pleroma: %{is_seen: false, is_muted: false}, type: "favourite", account: AccountView.render("show.json", %{user: another_user, for: user}), status: StatusView.render("show.json", %{activity: create_activity, for: user}), @@ -78,13 +106,13 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do user = insert(:user) another_user = insert(:user) {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) - {:ok, reblog_activity, _object} = CommonAPI.repeat(create_activity.id, another_user) + {:ok, reblog_activity} = CommonAPI.repeat(create_activity.id, another_user) {:ok, [notification]} = Notification.create_notifications(reblog_activity) reblog_activity = Activity.get_by_id(create_activity.id) expected = %{ id: to_string(notification.id), - pleroma: %{is_seen: false}, + pleroma: %{is_seen: false, is_muted: false}, type: "reblog", account: AccountView.render("show.json", %{user: another_user, for: user}), status: StatusView.render("show.json", %{activity: reblog_activity, for: user}), @@ -102,7 +130,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do expected = %{ id: to_string(notification.id), - pleroma: %{is_seen: false}, + pleroma: %{is_seen: false, is_muted: false}, type: "follow", account: AccountView.render("show.json", %{user: follower, for: followed}), created_at: Utils.to_masto_date(notification.inserted_at) @@ -111,9 +139,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do test_notifications_rendering([notification], followed, [expected]) User.perform(:delete, follower) - notification = Notification |> Repo.one() |> Repo.preload(:activity) - - test_notifications_rendering([notification], followed, []) + refute Repo.one(Notification) end @tag capture_log: true @@ -145,7 +171,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do expected = %{ id: to_string(notification.id), - pleroma: %{is_seen: false}, + pleroma: %{is_seen: false, is_muted: false}, type: "move", account: AccountView.render("show.json", %{user: old_user, for: follower}), target: AccountView.render("show.json", %{user: new_user, for: follower}), @@ -170,7 +196,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do expected = %{ id: to_string(notification.id), - pleroma: %{is_seen: false}, + pleroma: %{is_seen: false, is_muted: false}, type: "pleroma:emoji_reaction", emoji: "☕", account: AccountView.render("show.json", %{user: other_user, for: user}), @@ -180,4 +206,26 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do test_notifications_rendering([notification], user, [expected]) end + + test "muted notification" do + user = insert(:user) + another_user = insert(:user) + + {:ok, _} = Pleroma.UserRelationship.create_mute(user, another_user) + {:ok, create_activity} = CommonAPI.post(user, %{status: "hey"}) + {:ok, favorite_activity} = CommonAPI.favorite(another_user, create_activity.id) + {:ok, [notification]} = Notification.create_notifications(favorite_activity) + create_activity = Activity.get_by_id(create_activity.id) + + expected = %{ + id: to_string(notification.id), + pleroma: %{is_seen: false, is_muted: true}, + type: "favourite", + account: AccountView.render("show.json", %{user: another_user, for: user}), + status: StatusView.render("show.json", %{activity: create_activity, for: user}), + created_at: Utils.to_masto_date(notification.inserted_at) + } + + test_notifications_rendering([notification], user, [expected]) + end end diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 43e3bdca1..f90a0c273 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -226,7 +226,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do expires_at: nil, direct_conversation_id: nil, thread_muted: false, - emoji_reactions: [] + emoji_reactions: [], + parent_visible: false } } @@ -442,7 +443,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do user = insert(:user) activity = insert(:note_activity) - {:ok, reblog, _} = CommonAPI.repeat(activity.id, user) + {:ok, reblog} = CommonAPI.repeat(activity.id, user) represented = StatusView.render("show.json", %{for: user, activity: reblog}) @@ -600,7 +601,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do status: "˙˙ɐʎns" }) - {:ok, activity, _object} = CommonAPI.repeat(activity.id, other_user) + {:ok, activity} = CommonAPI.repeat(activity.id, other_user) result = StatusView.render("show.json", %{activity: activity, for: user}) @@ -620,4 +621,20 @@ defmodule Pleroma.Web.MastodonAPI.StatusViewTest do assert status.visibility == "list" end + + test "has a field for parent visibility" do + user = insert(:user) + poster = insert(:user) + + {:ok, invisible} = CommonAPI.post(poster, %{status: "hey", visibility: "private"}) + + {:ok, visible} = + CommonAPI.post(poster, %{status: "hey", visibility: "private", in_reply_to_id: invisible.id}) + + status = StatusView.render("show.json", activity: visible, for: user) + refute status.pleroma.parent_visible + + status = StatusView.render("show.json", activity: visible, for: poster) + assert status.pleroma.parent_visible + end end diff --git a/test/web/media_proxy/invalidation_test.exs b/test/web/media_proxy/invalidation_test.exs new file mode 100644 index 000000000..926ae74ca --- /dev/null +++ b/test/web/media_proxy/invalidation_test.exs @@ -0,0 +1,64 @@ +defmodule Pleroma.Web.MediaProxy.InvalidationTest do + use ExUnit.Case + use Pleroma.Tests.Helpers + + alias Pleroma.Config + alias Pleroma.Web.MediaProxy.Invalidation + + import ExUnit.CaptureLog + import Mock + import Tesla.Mock + + setup do: clear_config([:media_proxy]) + + setup do + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) + end + + describe "Invalidation.Http" do + test "perform request to clear cache" do + Config.put([:media_proxy, :enabled], false) + Config.put([:media_proxy, :invalidation, :enabled], true) + Config.put([:media_proxy, :invalidation, :provider], Invalidation.Http) + + Config.put([Invalidation.Http], method: :purge, headers: [{"x-refresh", 1}]) + image_url = "http://example.com/media/example.jpg" + Pleroma.Web.MediaProxy.put_in_banned_urls(image_url) + + mock(fn + %{ + method: :purge, + url: "http://example.com/media/example.jpg", + headers: [{"x-refresh", 1}] + } -> + %Tesla.Env{status: 200} + end) + + assert capture_log(fn -> + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) + assert Invalidation.purge([image_url]) == {:ok, [image_url]} + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) + end) =~ "Running cache purge: [\"#{image_url}\"]" + end + end + + describe "Invalidation.Script" do + test "run script to clear cache" do + Config.put([:media_proxy, :enabled], false) + Config.put([:media_proxy, :invalidation, :enabled], true) + Config.put([:media_proxy, :invalidation, :provider], Invalidation.Script) + Config.put([Invalidation.Script], script_path: "purge-nginx") + + image_url = "http://example.com/media/example.jpg" + Pleroma.Web.MediaProxy.put_in_banned_urls(image_url) + + with_mocks [{System, [], [cmd: fn _, _ -> {"ok", 0} end]}] do + assert capture_log(fn -> + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) + assert Invalidation.purge([image_url]) == {:ok, [image_url]} + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) + end) =~ "Running cache purge: [\"#{image_url}\"]" + end + end + end +end diff --git a/test/web/media_proxy/invalidations/http_test.exs b/test/web/media_proxy/invalidations/http_test.exs index 8a3b4141c..a1bef5237 100644 --- a/test/web/media_proxy/invalidations/http_test.exs +++ b/test/web/media_proxy/invalidations/http_test.exs @@ -5,6 +5,10 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do import ExUnit.CaptureLog import Tesla.Mock + setup do + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) + end + test "logs hasn't error message when request is valid" do mock(fn %{method: :purge, url: "http://example.com/media/example.jpg"} -> @@ -14,8 +18,8 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do refute capture_log(fn -> assert Invalidation.Http.purge( ["http://example.com/media/example.jpg"], - %{} - ) == {:ok, "success"} + [] + ) == {:ok, ["http://example.com/media/example.jpg"]} end) =~ "Error while cache purge" end @@ -28,8 +32,8 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do assert capture_log(fn -> assert Invalidation.Http.purge( ["http://example.com/media/example1.jpg"], - %{} - ) == {:ok, "success"} + [] + ) == {:ok, ["http://example.com/media/example1.jpg"]} end) =~ "Error while cache purge: url - http://example.com/media/example1.jpg" end end diff --git a/test/web/media_proxy/invalidations/script_test.exs b/test/web/media_proxy/invalidations/script_test.exs index 1358963ab..51833ab18 100644 --- a/test/web/media_proxy/invalidations/script_test.exs +++ b/test/web/media_proxy/invalidations/script_test.exs @@ -4,17 +4,23 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.ScriptTest do import ExUnit.CaptureLog + setup do + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) + end + test "it logger error when script not found" do assert capture_log(fn -> assert Invalidation.Script.purge( ["http://example.com/media/example.jpg"], - %{script_path: "./example"} - ) == {:error, "\"%ErlangError{original: :enoent}\""} - end) =~ "Error while cache purge: \"%ErlangError{original: :enoent}\"" + script_path: "./example" + ) == {:error, "%ErlangError{original: :enoent}"} + end) =~ "Error while cache purge: %ErlangError{original: :enoent}" - assert Invalidation.Script.purge( - ["http://example.com/media/example.jpg"], - %{} - ) == {:error, "not found script path"} + capture_log(fn -> + assert Invalidation.Script.purge( + ["http://example.com/media/example.jpg"], + [] + ) == {:error, "\"not found script path\""} + end) end end diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs index da79d38a5..d61cef83b 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -10,6 +10,10 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do setup do: clear_config(:media_proxy) setup do: clear_config([Pleroma.Web.Endpoint, :secret_key_base]) + setup do + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) + end + test "it returns 404 when MediaProxy disabled", %{conn: conn} do Config.put([:media_proxy, :enabled], false) @@ -66,4 +70,16 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do assert %Plug.Conn{status: :success} = get(conn, url) end end + + test "it returns 404 when url contains in banned_urls cache", %{conn: conn} do + Config.put([:media_proxy, :enabled], true) + Config.put([Pleroma.Web.Endpoint, :secret_key_base], "00000000000") + url = Pleroma.Web.MediaProxy.encode_url("https://google.fn/test.png") + Pleroma.Web.MediaProxy.put_in_banned_urls("https://google.fn/test.png") + + with_mock Pleroma.ReverseProxy, + call: fn _conn, _url, _opts -> %Plug.Conn{status: :success} end do + assert %Plug.Conn{status: 404, resp_body: "Not Found"} = get(conn, url) + end + end end diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 9bcc07b37..06b33607f 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -67,10 +67,10 @@ defmodule Pleroma.Web.NodeInfoTest do end test "returns fieldsLimits field", %{conn: conn} do - Config.put([:instance, :max_account_fields], 10) - Config.put([:instance, :max_remote_account_fields], 15) - Config.put([:instance, :account_field_name_length], 255) - Config.put([:instance, :account_field_value_length], 2048) + clear_config([:instance, :max_account_fields], 10) + clear_config([:instance, :max_remote_account_fields], 15) + clear_config([:instance, :account_field_name_length], 255) + clear_config([:instance, :account_field_value_length], 2048) response = conn @@ -84,8 +84,7 @@ defmodule Pleroma.Web.NodeInfoTest do end test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} do - option = Config.get([:instance, :safe_dm_mentions]) - Config.put([:instance, :safe_dm_mentions], true) + clear_config([:instance, :safe_dm_mentions], true) response = conn @@ -102,8 +101,6 @@ defmodule Pleroma.Web.NodeInfoTest do |> json_response(:ok) refute "safe_dm_mentions" in response["metadata"]["features"] - - Config.put([:instance, :safe_dm_mentions], option) end describe "`metadata/federation/enabled`" do @@ -145,7 +142,8 @@ defmodule Pleroma.Web.NodeInfoTest do "shareable_emoji_packs", "multifetch", "pleroma_emoji_reactions", - "pleroma:api/v1/notifications:include_types_filter" + "pleroma:api/v1/notifications:include_types_filter", + "pleroma_chat_messages" ] assert MapSet.subset?( @@ -155,14 +153,11 @@ defmodule Pleroma.Web.NodeInfoTest do end test "it shows MRF transparency data if enabled", %{conn: conn} do - config = Config.get([:instance, :rewrite_policy]) - Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) - - option = Config.get([:instance, :mrf_transparency]) - Config.put([:instance, :mrf_transparency], true) + clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) + clear_config([:mrf, :transparency], true) simple_config = %{"reject" => ["example.com"]} - Config.put(:mrf_simple, simple_config) + clear_config(:mrf_simple, simple_config) response = conn @@ -170,26 +165,17 @@ defmodule Pleroma.Web.NodeInfoTest do |> json_response(:ok) assert response["metadata"]["federation"]["mrf_simple"] == simple_config - - Config.put([:instance, :rewrite_policy], config) - Config.put([:instance, :mrf_transparency], option) - Config.put(:mrf_simple, %{}) end test "it performs exclusions from MRF transparency data if configured", %{conn: conn} do - config = Config.get([:instance, :rewrite_policy]) - Config.put([:instance, :rewrite_policy], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) - - option = Config.get([:instance, :mrf_transparency]) - Config.put([:instance, :mrf_transparency], true) - - exclusions = Config.get([:instance, :mrf_transparency_exclusions]) - Config.put([:instance, :mrf_transparency_exclusions], ["other.site"]) + clear_config([:mrf, :policies], [Pleroma.Web.ActivityPub.MRF.SimplePolicy]) + clear_config([:mrf, :transparency], true) + clear_config([:mrf, :transparency_exclusions], ["other.site"]) simple_config = %{"reject" => ["example.com", "other.site"]} - expected_config = %{"reject" => ["example.com"]} + clear_config(:mrf_simple, simple_config) - Config.put(:mrf_simple, simple_config) + expected_config = %{"reject" => ["example.com"]} response = conn @@ -198,10 +184,5 @@ defmodule Pleroma.Web.NodeInfoTest do assert response["metadata"]["federation"]["mrf_simple"] == expected_config assert response["metadata"]["federation"]["exclusions"] == true - - Config.put([:instance, :rewrite_policy], config) - Config.put([:instance, :mrf_transparency], option) - Config.put([:instance, :mrf_transparency_exclusions], exclusions) - Config.put(:mrf_simple, %{}) end end diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index bb349cb19..ee498f4b5 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -10,7 +10,11 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do alias Pleroma.Config alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI + alias Pleroma.Web.Endpoint + + require Pleroma.Constants setup_all do Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) @@ -19,6 +23,47 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do setup do: clear_config([:instance, :federating], true) + describe "Mastodon compatibility routes" do + setup %{conn: conn} do + conn = put_req_header(conn, "accept", "text/html") + + {:ok, object} = + %{ + "type" => "Note", + "content" => "hey", + "id" => Endpoint.url() <> "/users/raymoo/statuses/999999999", + "actor" => Endpoint.url() <> "/users/raymoo", + "to" => [Pleroma.Constants.as_public()] + } + |> Object.create() + + {:ok, activity, _} = + %{ + "id" => object.data["id"] <> "/activity", + "type" => "Create", + "object" => object.data["id"], + "actor" => object.data["actor"], + "to" => object.data["to"] + } + |> ActivityPub.persist(local: true) + + %{conn: conn, activity: activity} + end + + test "redirects to /notice/:id for html format", %{conn: conn, activity: activity} do + conn = get(conn, "/users/raymoo/statuses/999999999") + assert redirected_to(conn) == "/notice/#{activity.id}" + end + + test "redirects to /notice/:id for html format for activity", %{ + conn: conn, + activity: activity + } do + conn = get(conn, "/users/raymoo/statuses/999999999/activity") + assert redirected_to(conn) == "/notice/#{activity.id}" + end + end + # Note: see ActivityPubControllerTest for JSON format tests describe "GET /objects/:uuid (text/html)" do setup %{conn: conn} do diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs new file mode 100644 index 000000000..82e16741d --- /dev/null +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -0,0 +1,336 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only +defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do + use Pleroma.Web.ConnCase, async: true + + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + describe "POST /api/v1/pleroma/chats/:id/messages/:message_id/read" do + setup do: oauth_access(["write:chats"]) + + test "it marks one message as read", %{conn: conn, user: user} do + other_user = insert(:user) + + {:ok, create} = CommonAPI.post_chat_message(other_user, user, "sup") + {:ok, _create} = CommonAPI.post_chat_message(other_user, user, "sup part 2") + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + object = Object.normalize(create, false) + cm_ref = MessageReference.for_chat_and_object(chat, object) + + assert cm_ref.unread == true + + result = + conn + |> post("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}/read") + |> json_response_and_validate_schema(200) + + assert result["unread"] == false + + cm_ref = MessageReference.for_chat_and_object(chat, object) + + assert cm_ref.unread == false + end + end + + describe "POST /api/v1/pleroma/chats/:id/read" do + setup do: oauth_access(["write:chats"]) + + test "given a `last_read_id`, it marks everything until then as read", %{ + conn: conn, + user: user + } do + other_user = insert(:user) + + {:ok, create} = CommonAPI.post_chat_message(other_user, user, "sup") + {:ok, _create} = CommonAPI.post_chat_message(other_user, user, "sup part 2") + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + object = Object.normalize(create, false) + cm_ref = MessageReference.for_chat_and_object(chat, object) + + assert cm_ref.unread == true + + result = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/chats/#{chat.id}/read", %{"last_read_id" => cm_ref.id}) + |> json_response_and_validate_schema(200) + + assert result["unread"] == 1 + + cm_ref = MessageReference.for_chat_and_object(chat, object) + + assert cm_ref.unread == false + end + end + + describe "POST /api/v1/pleroma/chats/:id/messages" do + setup do: oauth_access(["write:chats"]) + + test "it posts a message to the chat", %{conn: conn, user: user} do + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + result = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"}) + |> json_response_and_validate_schema(200) + + assert result["content"] == "Hallo!!" + assert result["chat_id"] == chat.id |> to_string() + end + + test "it fails if there is no content", %{conn: conn, user: user} do + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + result = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/chats/#{chat.id}/messages") + |> json_response_and_validate_schema(400) + + assert result + end + + test "it works with an attachment", %{conn: conn, user: user} do + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id) + + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + result = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{ + "media_id" => to_string(upload.id) + }) + |> json_response_and_validate_schema(200) + + assert result["attachment"] + end + end + + describe "DELETE /api/v1/pleroma/chats/:id/messages/:message_id" do + setup do: oauth_access(["write:chats"]) + + test "it deletes a message from the chat", %{conn: conn, user: user} do + recipient = insert(:user) + + {:ok, message} = + CommonAPI.post_chat_message(user, recipient, "Hello darkness my old friend") + + {:ok, other_message} = CommonAPI.post_chat_message(recipient, user, "nico nico ni") + + object = Object.normalize(message, false) + + chat = Chat.get(user.id, recipient.ap_id) + + cm_ref = MessageReference.for_chat_and_object(chat, object) + + # Deleting your own message removes the message and the reference + result = + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] == cm_ref.id + refute MessageReference.get_by_id(cm_ref.id) + assert %{data: %{"type" => "Tombstone"}} = Object.get_by_id(object.id) + + # Deleting other people's messages just removes the reference + object = Object.normalize(other_message, false) + cm_ref = MessageReference.for_chat_and_object(chat, object) + + result = + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] == cm_ref.id + refute MessageReference.get_by_id(cm_ref.id) + assert Object.get_by_id(object.id) + end + end + + describe "GET /api/v1/pleroma/chats/:id/messages" do + setup do: oauth_access(["read:chats"]) + + test "it paginates", %{conn: conn, user: user} do + recipient = insert(:user) + + Enum.each(1..30, fn _ -> + {:ok, _} = CommonAPI.post_chat_message(user, recipient, "hey") + end) + + chat = Chat.get(user.id, recipient.ap_id) + + result = + conn + |> get("/api/v1/pleroma/chats/#{chat.id}/messages") + |> json_response_and_validate_schema(200) + + assert length(result) == 20 + + result = + conn + |> get("/api/v1/pleroma/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}") + |> json_response_and_validate_schema(200) + + assert length(result) == 10 + end + + test "it returns the messages for a given chat", %{conn: conn, user: user} do + other_user = insert(:user) + third_user = insert(:user) + + {:ok, _} = CommonAPI.post_chat_message(user, other_user, "hey") + {:ok, _} = CommonAPI.post_chat_message(user, third_user, "hey") + {:ok, _} = CommonAPI.post_chat_message(user, other_user, "how are you?") + {:ok, _} = CommonAPI.post_chat_message(other_user, user, "fine, how about you?") + + chat = Chat.get(user.id, other_user.ap_id) + + result = + conn + |> get("/api/v1/pleroma/chats/#{chat.id}/messages") + |> json_response_and_validate_schema(200) + + result + |> Enum.each(fn message -> + assert message["chat_id"] == chat.id |> to_string() + end) + + assert length(result) == 3 + + # Trying to get the chat of a different user + result = + conn + |> assign(:user, other_user) + |> get("/api/v1/pleroma/chats/#{chat.id}/messages") + + assert result |> json_response(404) + end + end + + describe "POST /api/v1/pleroma/chats/by-account-id/:id" do + setup do: oauth_access(["write:chats"]) + + test "it creates or returns a chat", %{conn: conn} do + other_user = insert(:user) + + result = + conn + |> post("/api/v1/pleroma/chats/by-account-id/#{other_user.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] + end + end + + describe "GET /api/v1/pleroma/chats/:id" do + setup do: oauth_access(["read:chats"]) + + test "it returns a chat", %{conn: conn, user: user} do + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + result = + conn + |> get("/api/v1/pleroma/chats/#{chat.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] == to_string(chat.id) + end + end + + describe "GET /api/v1/pleroma/chats" do + setup do: oauth_access(["read:chats"]) + + test "it does not return chats with users you blocked", %{conn: conn, user: user} do + recipient = insert(:user) + + {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id) + + result = + conn + |> get("/api/v1/pleroma/chats") + |> json_response_and_validate_schema(200) + + assert length(result) == 1 + + User.block(user, recipient) + + result = + conn + |> get("/api/v1/pleroma/chats") + |> json_response_and_validate_schema(200) + + assert length(result) == 0 + end + + test "it returns all chats", %{conn: conn, user: user} do + Enum.each(1..30, fn _ -> + recipient = insert(:user) + {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id) + end) + + result = + conn + |> get("/api/v1/pleroma/chats") + |> json_response_and_validate_schema(200) + + assert length(result) == 30 + end + + test "it return a list of chats the current user is participating in, in descending order of updates", + %{conn: conn, user: user} do + har = insert(:user) + jafnhar = insert(:user) + tridi = insert(:user) + + {:ok, chat_1} = Chat.get_or_create(user.id, har.ap_id) + :timer.sleep(1000) + {:ok, _chat_2} = Chat.get_or_create(user.id, jafnhar.ap_id) + :timer.sleep(1000) + {:ok, chat_3} = Chat.get_or_create(user.id, tridi.ap_id) + :timer.sleep(1000) + + # bump the second one + {:ok, chat_2} = Chat.bump_or_create(user.id, jafnhar.ap_id) + + result = + conn + |> get("/api/v1/pleroma/chats") + |> json_response_and_validate_schema(200) + + ids = Enum.map(result, & &1["id"]) + + assert ids == [ + chat_2.id |> to_string(), + chat_3.id |> to_string(), + chat_1.id |> to_string() + ] + end + end +end diff --git a/test/web/pleroma_api/controllers/conversation_controller_test.exs b/test/web/pleroma_api/controllers/conversation_controller_test.exs new file mode 100644 index 000000000..e6d0b3e37 --- /dev/null +++ b/test/web/pleroma_api/controllers/conversation_controller_test.exs @@ -0,0 +1,136 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ConversationControllerTest do + use Pleroma.Web.ConnCase + + alias Pleroma.Conversation.Participation + alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "/api/v1/pleroma/conversations/:id" do + user = insert(:user) + %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) + + [participation] = Participation.for_user(other_user) + + result = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] == participation.id |> to_string() + end + + test "/api/v1/pleroma/conversations/:id/statuses" do + user = insert(:user) + %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) + third_user = insert(:user) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{third_user.nickname}!", visibility: "direct"}) + + {:ok, activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) + + [participation] = Participation.for_user(other_user) + + {:ok, activity_two} = + CommonAPI.post(other_user, %{ + status: "Hi!", + in_reply_to_status_id: activity.id, + in_reply_to_conversation_id: participation.id + }) + + result = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses") + |> json_response_and_validate_schema(200) + + assert length(result) == 2 + + id_one = activity.id + id_two = activity_two.id + assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result + + {:ok, %{id: id_three}} = + CommonAPI.post(other_user, %{ + status: "Bye!", + in_reply_to_status_id: activity.id, + in_reply_to_conversation_id: participation.id + }) + + assert [%{"id" => ^id_two}, %{"id" => ^id_three}] = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?limit=2") + |> json_response_and_validate_schema(:ok) + + assert [%{"id" => ^id_three}] = + conn + |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?min_id=#{id_two}") + |> json_response_and_validate_schema(:ok) + end + + test "PATCH /api/v1/pleroma/conversations/:id" do + %{user: user, conn: conn} = oauth_access(["write:conversations"]) + other_user = insert(:user) + + {:ok, _activity} = CommonAPI.post(user, %{status: "Hi", visibility: "direct"}) + + [participation] = Participation.for_user(user) + + participation = Repo.preload(participation, :recipients) + + user = User.get_cached_by_id(user.id) + assert [user] == participation.recipients + assert other_user not in participation.recipients + + query = "recipients[]=#{user.id}&recipients[]=#{other_user.id}" + + result = + conn + |> patch("/api/v1/pleroma/conversations/#{participation.id}?#{query}") + |> json_response_and_validate_schema(200) + + assert result["id"] == participation.id |> to_string + + [participation] = Participation.for_user(user) + participation = Repo.preload(participation, :recipients) + + assert user in participation.recipients + assert other_user in participation.recipients + end + + test "POST /api/v1/pleroma/conversations/read" do + user = insert(:user) + %{user: other_user, conn: conn} = oauth_access(["write:conversations"]) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) + + {:ok, _activity} = + CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) + + [participation2, participation1] = Participation.for_user(other_user) + assert Participation.get(participation2.id).read == false + assert Participation.get(participation1.id).read == false + assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2 + + [%{"unread" => false}, %{"unread" => false}] = + conn + |> post("/api/v1/pleroma/conversations/read", %{}) + |> json_response_and_validate_schema(200) + + [participation2, participation1] = Participation.for_user(other_user) + assert Participation.get(participation2.id).read == true + assert Participation.get(participation1.id).read == true + assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 + end +end diff --git a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs index ee3d281a0..df58a5eb6 100644 --- a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -30,15 +30,55 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do test "GET /api/pleroma/emoji/packs", %{conn: conn} do resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) - shared = resp["test_pack"] - assert shared["files"] == %{"blank" => "blank.png"} + assert resp["count"] == 3 + + assert resp["packs"] + |> Map.keys() + |> length() == 3 + + shared = resp["packs"]["test_pack"] + assert shared["files"] == %{"blank" => "blank.png", "blank2" => "blank2.png"} assert Map.has_key?(shared["pack"], "download-sha256") assert shared["pack"]["can-download"] assert shared["pack"]["share-files"] - non_shared = resp["test_pack_nonshared"] + non_shared = resp["packs"]["test_pack_nonshared"] assert non_shared["pack"]["share-files"] == false assert non_shared["pack"]["can-download"] == false + + resp = + conn + |> get("/api/pleroma/emoji/packs?page_size=1") + |> json_response_and_validate_schema(200) + + assert resp["count"] == 3 + + packs = Map.keys(resp["packs"]) + + assert length(packs) == 1 + + [pack1] = packs + + resp = + conn + |> get("/api/pleroma/emoji/packs?page_size=1&page=2") + |> json_response_and_validate_schema(200) + + assert resp["count"] == 3 + packs = Map.keys(resp["packs"]) + assert length(packs) == 1 + [pack2] = packs + + resp = + conn + |> get("/api/pleroma/emoji/packs?page_size=1&page=3") + |> json_response_and_validate_schema(200) + + assert resp["count"] == 3 + packs = Map.keys(resp["packs"]) + assert length(packs) == 1 + [pack3] = packs + assert [pack1, pack2, pack3] |> Enum.uniq() |> length() == 3 end describe "GET /api/pleroma/emoji/packs/remote" do @@ -332,7 +372,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do Map.put( new_data, "fallback-src-sha256", - "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF" + "1967BB4E42BCC34BCC12D57BE7811D3B7BE52F965BCE45C87BD377B9499CE11D" ) assert ctx[:admin_conn] @@ -398,7 +438,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do assert admin_conn |> put_req_header("content-type", "multipart/form-data") |> post("/api/pleroma/emoji/packs/test_pack/files", %{ - shortcode: "blank2", + shortcode: "blank3", filename: "dir/blank.png", file: %Plug.Upload{ filename: "blank.png", @@ -407,7 +447,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do }) |> json_response_and_validate_schema(200) == %{ "blank" => "blank.png", - "blank2" => "dir/blank.png" + "blank2" => "blank2.png", + "blank3" => "dir/blank.png" } assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") @@ -431,7 +472,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do assert admin_conn |> put_req_header("content-type", "multipart/form-data") |> post("/api/pleroma/emoji/packs/test_pack/files", %{ - shortcode: "blank2", + shortcode: "blank3", filename: "dir/blank.png", file: %Plug.Upload{ filename: "blank.png", @@ -440,7 +481,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do }) |> json_response_and_validate_schema(200) == %{ "blank" => "blank.png", - "blank2" => "dir/blank.png" + "blank2" => "blank2.png", + "blank3" => "dir/blank.png" } assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") @@ -448,14 +490,15 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do assert admin_conn |> put_req_header("content-type", "multipart/form-data") |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ - shortcode: "blank2", - new_shortcode: "blank3", + shortcode: "blank3", + new_shortcode: "blank4", new_filename: "dir_2/blank_3.png", force: true }) |> json_response_and_validate_schema(200) == %{ "blank" => "blank.png", - "blank3" => "dir_2/blank_3.png" + "blank2" => "blank2.png", + "blank4" => "dir_2/blank_3.png" } assert File.exists?("#{@emoji_path}/test_pack/dir_2/blank_3.png") @@ -481,7 +524,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do assert admin_conn |> put_req_header("content-type", "multipart/form-data") |> post("/api/pleroma/emoji/packs/not_loaded/files", %{ - shortcode: "blank2", + shortcode: "blank3", filename: "dir/blank.png", file: %Plug.Upload{ filename: "blank.png", @@ -535,7 +578,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do }) |> json_response_and_validate_schema(200) == %{ "blank" => "blank.png", - "blank4" => "dir/blank.png" + "blank4" => "dir/blank.png", + "blank2" => "blank2.png" } assert File.exists?("#{@emoji_path}/test_pack/dir/blank.png") @@ -549,7 +593,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do }) |> json_response_and_validate_schema(200) == %{ "blank3" => "dir_2/blank_3.png", - "blank" => "blank.png" + "blank" => "blank.png", + "blank2" => "blank2.png" } refute File.exists?("#{@emoji_path}/test_pack/dir/") @@ -557,7 +602,10 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do assert admin_conn |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank3") - |> json_response_and_validate_schema(200) == %{"blank" => "blank.png"} + |> json_response_and_validate_schema(200) == %{ + "blank" => "blank.png", + "blank2" => "blank2.png" + } refute File.exists?("#{@emoji_path}/test_pack/dir_2/") @@ -581,7 +629,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do }) |> json_response_and_validate_schema(200) == %{ "blank_url" => "blank_url.png", - "blank" => "blank.png" + "blank" => "blank.png", + "blank2" => "blank2.png" } assert File.exists?("#{@emoji_path}/test_pack/blank_url.png") @@ -602,15 +651,16 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do }) |> json_response_and_validate_schema(200) == %{ "shortcode" => "shortcode.png", - "blank" => "blank.png" + "blank" => "blank.png", + "blank2" => "blank2.png" } end test "remove non existing shortcode in pack.json", %{admin_conn: admin_conn} do assert admin_conn - |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank2") + |> delete("/api/pleroma/emoji/packs/test_pack/files?shortcode=blank3") |> json_response_and_validate_schema(:bad_request) == %{ - "error" => "Emoji \"blank2\" does not exist" + "error" => "Emoji \"blank3\" does not exist" } end @@ -618,12 +668,12 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do assert admin_conn |> put_req_header("content-type", "multipart/form-data") |> patch("/api/pleroma/emoji/packs/test_pack/files", %{ - shortcode: "blank2", - new_shortcode: "blank3", + shortcode: "blank3", + new_shortcode: "blank4", new_filename: "dir_2/blank_3.png" }) |> json_response_and_validate_schema(:bad_request) == %{ - "error" => "Emoji \"blank2\" does not exist" + "error" => "Emoji \"blank3\" does not exist" } end @@ -651,7 +701,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do assert Jason.decode!(File.read!("#{@emoji_path}/test_created/pack.json")) == %{ "pack" => %{}, - "files" => %{} + "files" => %{}, + "files_count" => 0 } assert admin_conn @@ -709,14 +760,14 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) - refute Map.has_key?(resp, "test_pack_for_import") + refute Map.has_key?(resp["packs"], "test_pack_for_import") assert admin_conn |> get("/api/pleroma/emoji/packs/import") |> json_response_and_validate_schema(200) == ["test_pack_for_import"] resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) - assert resp["test_pack_for_import"]["files"] == %{"blank" => "blank.png"} + assert resp["packs"]["test_pack_for_import"]["files"] == %{"blank" => "blank.png"} File.rm!("#{@emoji_path}/test_pack_for_import/pack.json") refute File.exists?("#{@emoji_path}/test_pack_for_import/pack.json") @@ -736,7 +787,7 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) - assert resp["test_pack_for_import"]["files"] == %{ + assert resp["packs"]["test_pack_for_import"]["files"] == %{ "blank" => "blank.png", "blank2" => "blank.png", "foo" => "blank.png" @@ -746,7 +797,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do describe "GET /api/pleroma/emoji/packs/:name" do test "shows pack.json", %{conn: conn} do assert %{ - "files" => %{"blank" => "blank.png"}, + "files" => files, + "files_count" => 2, "pack" => %{ "can-download" => true, "description" => "Test description", @@ -759,6 +811,28 @@ defmodule Pleroma.Web.PleromaAPI.EmojiPackControllerTest do conn |> get("/api/pleroma/emoji/packs/test_pack") |> json_response_and_validate_schema(200) + + assert files == %{"blank" => "blank.png", "blank2" => "blank2.png"} + + assert %{ + "files" => files, + "files_count" => 2 + } = + conn + |> get("/api/pleroma/emoji/packs/test_pack?page_size=1") + |> json_response_and_validate_schema(200) + + assert files |> Map.keys() |> length() == 1 + + assert %{ + "files" => files, + "files_count" => 2 + } = + conn + |> get("/api/pleroma/emoji/packs/test_pack?page_size=1&page=2") + |> json_response_and_validate_schema(200) + + assert files |> Map.keys() |> length() == 1 end test "non existing pack", %{conn: conn} do diff --git a/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs new file mode 100644 index 000000000..e1bb5ebfe --- /dev/null +++ b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs @@ -0,0 +1,132 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.EmojiReactionControllerTest do + use Oban.Testing, repo: Pleroma.Repo + use Pleroma.Web.ConnCase + + alias Pleroma.Object + alias Pleroma.Tests.ObanHelpers + alias Pleroma.User + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") + |> json_response_and_validate_schema(200) + + # We return the status, but this our implementation detail. + assert %{"id" => id} = result + assert to_string(activity.id) == id + + assert result["pleroma"]["emoji_reactions"] == [ + %{"name" => "☕", "count" => 1, "me" => true} + ] + + # Reacting with a non-emoji + assert conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/x") + |> json_response_and_validate_schema(400) + end + + test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + + ObanHelpers.perform_all() + + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) + |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") + + assert %{"id" => id} = json_response_and_validate_schema(result, 200) + assert to_string(activity.id) == id + + ObanHelpers.perform_all() + + object = Object.get_by_ap_id(activity.data["object"]) + + assert object.data["reaction_count"] == 0 + end + + test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + doomed_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + + result = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") + |> json_response_and_validate_schema(200) + + assert result == [] + + {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") + {:ok, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") + + User.perform(:delete, doomed_user) + + result = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") + |> json_response_and_validate_schema(200) + + [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result + + assert represented_user["id"] == other_user.id + + result = + conn + |> assign(:user, other_user) + |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") + |> json_response_and_validate_schema(200) + + assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = + result + end + + test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) + + result = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") + |> json_response_and_validate_schema(200) + + assert result == [] + + {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") + {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") + + assert [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = + conn + |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") + |> json_response_and_validate_schema(200) + + assert represented_user["id"] == other_user.id + end +end diff --git a/test/web/pleroma_api/controllers/notification_controller_test.exs b/test/web/pleroma_api/controllers/notification_controller_test.exs new file mode 100644 index 000000000..bb4fe6c49 --- /dev/null +++ b/test/web/pleroma_api/controllers/notification_controller_test.exs @@ -0,0 +1,68 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.NotificationControllerTest do + use Pleroma.Web.ConnCase + + alias Pleroma.Notification + alias Pleroma.Repo + alias Pleroma.Web.CommonAPI + + import Pleroma.Factory + + describe "POST /api/v1/pleroma/notifications/read" do + setup do: oauth_access(["write:notifications"]) + + test "it marks a single notification as read", %{user: user1, conn: conn} do + user2 = insert(:user) + {:ok, activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, [notification1]} = Notification.create_notifications(activity1) + {:ok, [notification2]} = Notification.create_notifications(activity2) + + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/notifications/read", %{id: notification1.id}) + |> json_response_and_validate_schema(:ok) + + assert %{"pleroma" => %{"is_seen" => true}} = response + assert Repo.get(Notification, notification1.id).seen + refute Repo.get(Notification, notification2.id).seen + end + + test "it marks multiple notifications as read", %{user: user1, conn: conn} do + user2 = insert(:user) + {:ok, _activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, _activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) + {:ok, _activity3} = CommonAPI.post(user2, %{status: "HIE @#{user1.nickname}"}) + + [notification3, notification2, notification1] = Notification.for_user(user1, %{limit: 3}) + + [response1, response2] = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/notifications/read", %{max_id: notification2.id}) + |> json_response_and_validate_schema(:ok) + + assert %{"pleroma" => %{"is_seen" => true}} = response1 + assert %{"pleroma" => %{"is_seen" => true}} = response2 + assert Repo.get(Notification, notification1.id).seen + assert Repo.get(Notification, notification2.id).seen + refute Repo.get(Notification, notification3.id).seen + end + + test "it returns error when notification not found", %{conn: conn} do + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/v1/pleroma/notifications/read", %{ + id: 22_222_222_222_222 + }) + |> json_response_and_validate_schema(:bad_request) + + assert response == %{"error" => "Cannot get notification"} + end + end +end diff --git a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs deleted file mode 100644 index cfd1dbd24..000000000 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ /dev/null @@ -1,302 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do - use Oban.Testing, repo: Pleroma.Repo - use Pleroma.Web.ConnCase - - alias Pleroma.Conversation.Participation - alias Pleroma.Notification - alias Pleroma.Object - alias Pleroma.Repo - alias Pleroma.Tests.ObanHelpers - alias Pleroma.User - alias Pleroma.Web.CommonAPI - - import Pleroma.Factory - - test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) - - result = - conn - |> assign(:user, other_user) - |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) - |> put("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") - |> json_response(200) - - # We return the status, but this our implementation detail. - assert %{"id" => id} = result - assert to_string(activity.id) == id - - assert result["pleroma"]["emoji_reactions"] == [ - %{"name" => "☕", "count" => 1, "me" => true} - ] - end - - test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) - {:ok, _reaction_activity} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") - - ObanHelpers.perform_all() - - result = - conn - |> assign(:user, other_user) - |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["write:statuses"])) - |> delete("/api/v1/pleroma/statuses/#{activity.id}/reactions/☕") - - assert %{"id" => id} = json_response(result, 200) - assert to_string(activity.id) == id - - ObanHelpers.perform_all() - - object = Object.get_by_ap_id(activity.data["object"]) - - assert object.data["reaction_count"] == 0 - end - - test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - doomed_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) - - assert result == [] - - {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") - {:ok, _} = CommonAPI.react_with_emoji(activity.id, doomed_user, "🎅") - - User.perform(:delete, doomed_user) - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) - - [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result - - assert represented_user["id"] == other_user.id - - result = - conn - |> assign(:user, other_user) - |> assign(:token, insert(:oauth_token, user: other_user, scopes: ["read:statuses"])) - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) - - assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = - result - end - - test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do - user = insert(:user) - other_user = insert(:user) - - {:ok, activity} = CommonAPI.post(user, %{status: "#cofe"}) - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") - |> json_response(200) - - assert result == [] - - {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "🎅") - {:ok, _} = CommonAPI.react_with_emoji(activity.id, other_user, "☕") - - result = - conn - |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") - |> json_response(200) - - [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result - - assert represented_user["id"] == other_user.id - end - - test "/api/v1/pleroma/conversations/:id" do - user = insert(:user) - %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) - - {:ok, _activity} = - CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) - - [participation] = Participation.for_user(other_user) - - result = - conn - |> get("/api/v1/pleroma/conversations/#{participation.id}") - |> json_response(200) - - assert result["id"] == participation.id |> to_string() - end - - test "/api/v1/pleroma/conversations/:id/statuses" do - user = insert(:user) - %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) - third_user = insert(:user) - - {:ok, _activity} = - CommonAPI.post(user, %{status: "Hi @#{third_user.nickname}!", visibility: "direct"}) - - {:ok, activity} = - CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}!", visibility: "direct"}) - - [participation] = Participation.for_user(other_user) - - {:ok, activity_two} = - CommonAPI.post(other_user, %{ - status: "Hi!", - in_reply_to_status_id: activity.id, - in_reply_to_conversation_id: participation.id - }) - - result = - conn - |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses") - |> json_response(200) - - assert length(result) == 2 - - id_one = activity.id - id_two = activity_two.id - assert [%{"id" => ^id_one}, %{"id" => ^id_two}] = result - - {:ok, %{id: id_three}} = - CommonAPI.post(other_user, %{ - status: "Bye!", - in_reply_to_status_id: activity.id, - in_reply_to_conversation_id: participation.id - }) - - assert [%{"id" => ^id_two}, %{"id" => ^id_three}] = - conn - |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?limit=2") - |> json_response(:ok) - - assert [%{"id" => ^id_three}] = - conn - |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?min_id=#{id_two}") - |> json_response(:ok) - end - - test "PATCH /api/v1/pleroma/conversations/:id" do - %{user: user, conn: conn} = oauth_access(["write:conversations"]) - other_user = insert(:user) - - {:ok, _activity} = CommonAPI.post(user, %{status: "Hi", visibility: "direct"}) - - [participation] = Participation.for_user(user) - - participation = Repo.preload(participation, :recipients) - - user = User.get_cached_by_id(user.id) - assert [user] == participation.recipients - assert other_user not in participation.recipients - - result = - conn - |> patch("/api/v1/pleroma/conversations/#{participation.id}", %{ - "recipients" => [user.id, other_user.id] - }) - |> json_response(200) - - assert result["id"] == participation.id |> to_string - - [participation] = Participation.for_user(user) - participation = Repo.preload(participation, :recipients) - - assert user in participation.recipients - assert other_user in participation.recipients - end - - test "POST /api/v1/pleroma/conversations/read" do - user = insert(:user) - %{user: other_user, conn: conn} = oauth_access(["write:conversations"]) - - {:ok, _activity} = - CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) - - {:ok, _activity} = - CommonAPI.post(user, %{status: "Hi @#{other_user.nickname}", visibility: "direct"}) - - [participation2, participation1] = Participation.for_user(other_user) - assert Participation.get(participation2.id).read == false - assert Participation.get(participation1.id).read == false - assert User.get_cached_by_id(other_user.id).unread_conversation_count == 2 - - [%{"unread" => false}, %{"unread" => false}] = - conn - |> post("/api/v1/pleroma/conversations/read", %{}) - |> json_response(200) - - [participation2, participation1] = Participation.for_user(other_user) - assert Participation.get(participation2.id).read == true - assert Participation.get(participation1.id).read == true - assert User.get_cached_by_id(other_user.id).unread_conversation_count == 0 - end - - describe "POST /api/v1/pleroma/notifications/read" do - setup do: oauth_access(["write:notifications"]) - - test "it marks a single notification as read", %{user: user1, conn: conn} do - user2 = insert(:user) - {:ok, activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) - {:ok, activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) - {:ok, [notification1]} = Notification.create_notifications(activity1) - {:ok, [notification2]} = Notification.create_notifications(activity2) - - response = - conn - |> post("/api/v1/pleroma/notifications/read", %{"id" => "#{notification1.id}"}) - |> json_response(:ok) - - assert %{"pleroma" => %{"is_seen" => true}} = response - assert Repo.get(Notification, notification1.id).seen - refute Repo.get(Notification, notification2.id).seen - end - - test "it marks multiple notifications as read", %{user: user1, conn: conn} do - user2 = insert(:user) - {:ok, _activity1} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) - {:ok, _activity2} = CommonAPI.post(user2, %{status: "hi @#{user1.nickname}"}) - {:ok, _activity3} = CommonAPI.post(user2, %{status: "HIE @#{user1.nickname}"}) - - [notification3, notification2, notification1] = Notification.for_user(user1, %{limit: 3}) - - [response1, response2] = - conn - |> post("/api/v1/pleroma/notifications/read", %{"max_id" => "#{notification2.id}"}) - |> json_response(:ok) - - assert %{"pleroma" => %{"is_seen" => true}} = response1 - assert %{"pleroma" => %{"is_seen" => true}} = response2 - assert Repo.get(Notification, notification1.id).seen - assert Repo.get(Notification, notification2.id).seen - refute Repo.get(Notification, notification3.id).seen - end - - test "it returns error when notification not found", %{conn: conn} do - response = - conn - |> post("/api/v1/pleroma/notifications/read", %{"id" => "22222222222222"}) - |> json_response(:bad_request) - - assert response == %{"error" => "Cannot get notification"} - end - end -end diff --git a/test/web/pleroma_api/views/chat/message_reference_view_test.exs b/test/web/pleroma_api/views/chat/message_reference_view_test.exs new file mode 100644 index 000000000..e5b165255 --- /dev/null +++ b/test/web/pleroma_api/views/chat/message_reference_view_test.exs @@ -0,0 +1,61 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.Chat.MessageReferenceViewTest do + use Pleroma.DataCase + + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView + + import Pleroma.Factory + + test "it displays a chat message" do + user = insert(:user) + recipient = insert(:user) + + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id) + {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "kippis :firefox:") + + chat = Chat.get(user.id, recipient.ap_id) + + object = Object.normalize(activity) + + cm_ref = MessageReference.for_chat_and_object(chat, object) + + chat_message = MessageReferenceView.render("show.json", chat_message_reference: cm_ref) + + assert chat_message[:id] == cm_ref.id + assert chat_message[:content] == "kippis :firefox:" + assert chat_message[:account_id] == user.id + assert chat_message[:chat_id] + assert chat_message[:created_at] + assert chat_message[:unread] == false + assert match?([%{shortcode: "firefox"}], chat_message[:emojis]) + + {:ok, activity} = CommonAPI.post_chat_message(recipient, user, "gkgkgk", media_id: upload.id) + + object = Object.normalize(activity) + + cm_ref = MessageReference.for_chat_and_object(chat, object) + + chat_message_two = MessageReferenceView.render("show.json", chat_message_reference: cm_ref) + + assert chat_message_two[:id] == cm_ref.id + assert chat_message_two[:content] == "gkgkgk" + assert chat_message_two[:account_id] == recipient.id + assert chat_message_two[:chat_id] == chat_message[:chat_id] + assert chat_message_two[:attachment] + assert chat_message_two[:unread] == true + end +end diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs new file mode 100644 index 000000000..14eecb1bd --- /dev/null +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -0,0 +1,48 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ChatViewTest do + use Pleroma.DataCase + + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference + alias Pleroma.Object + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView + alias Pleroma.Web.PleromaAPI.ChatView + + import Pleroma.Factory + + test "it represents a chat" do + user = insert(:user) + recipient = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id) + + represented_chat = ChatView.render("show.json", chat: chat) + + assert represented_chat == %{ + id: "#{chat.id}", + account: AccountView.render("show.json", user: recipient), + unread: 0, + last_message: nil, + updated_at: Utils.to_masto_date(chat.updated_at) + } + + {:ok, chat_message_creation} = CommonAPI.post_chat_message(user, recipient, "hello") + + chat_message = Object.normalize(chat_message_creation, false) + + {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id) + + represented_chat = ChatView.render("show.json", chat: chat) + + cm_ref = MessageReference.for_chat_and_object(chat, chat_message) + + assert represented_chat[:last_message] == + MessageReferenceView.render("show.json", chat_message_reference: cm_ref) + end +end diff --git a/test/web/preload/instance_test.exs b/test/web/preload/instance_test.exs new file mode 100644 index 000000000..a46f28312 --- /dev/null +++ b/test/web/preload/instance_test.exs @@ -0,0 +1,48 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.InstanceTest do + use Pleroma.DataCase + alias Pleroma.Web.Preload.Providers.Instance + + setup do: {:ok, Instance.generate_terms(nil)} + + test "it renders the info", %{"/api/v1/instance" => info} do + assert %{ + description: description, + email: "admin@example.com", + registrations: true + } = info + + assert String.equivalent?(description, "Pleroma: An efficient and flexible fediverse server") + end + + test "it renders the panel", %{"/instance/panel.html" => panel} do + assert String.contains?( + panel, + "

    Welcome to Pleroma!

    " + ) + end + + test "it works with overrides" do + clear_config([:instance, :static_dir], "test/fixtures/preload_static") + + %{"/instance/panel.html" => panel} = Instance.generate_terms(nil) + + assert String.contains?( + panel, + "HEY!" + ) + end + + test "it renders the node_info", %{"/nodeinfo/2.0.json" => nodeinfo} do + %{ + metadata: metadata, + version: "2.0" + } = nodeinfo + + assert metadata.private == false + assert metadata.suggestions == %{enabled: false} + end +end diff --git a/test/web/preload/status_net_test.exs b/test/web/preload/status_net_test.exs new file mode 100644 index 000000000..df7acdb11 --- /dev/null +++ b/test/web/preload/status_net_test.exs @@ -0,0 +1,15 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.StatusNetTest do + use Pleroma.DataCase + alias Pleroma.Web.Preload.Providers.StatusNet + + setup do: {:ok, StatusNet.generate_terms(nil)} + + test "it renders the info", %{"/api/statusnet/config.json" => info} do + assert {:ok, res} = Jason.decode(info) + assert res["site"] + end +end diff --git a/test/web/preload/timeline_test.exs b/test/web/preload/timeline_test.exs new file mode 100644 index 000000000..fea95a6a4 --- /dev/null +++ b/test/web/preload/timeline_test.exs @@ -0,0 +1,74 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.TimelineTest do + use Pleroma.DataCase + import Pleroma.Factory + + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.Preload.Providers.Timelines + + @public_url "/api/v1/timelines/public" + + describe "unauthenticated timeliness when restricted" do + setup do + svd_config = Pleroma.Config.get([:restrict_unauthenticated, :timelines]) + Pleroma.Config.put([:restrict_unauthenticated, :timelines], %{local: true, federated: true}) + + on_exit(fn -> + Pleroma.Config.put([:restrict_unauthenticated, :timelines], svd_config) + end) + + :ok + end + + test "return nothing" do + tl_data = Timelines.generate_terms(%{}) + + refute Map.has_key?(tl_data, "/api/v1/timelines/public") + end + end + + describe "unauthenticated timeliness when unrestricted" do + setup do + svd_config = Pleroma.Config.get([:restrict_unauthenticated, :timelines]) + + Pleroma.Config.put([:restrict_unauthenticated, :timelines], %{ + local: false, + federated: false + }) + + on_exit(fn -> + Pleroma.Config.put([:restrict_unauthenticated, :timelines], svd_config) + end) + + {:ok, user: insert(:user)} + end + + test "returns the timeline when not restricted" do + assert Timelines.generate_terms(%{}) + |> Map.has_key?(@public_url) + end + + test "returns public items", %{user: user} do + {:ok, _} = CommonAPI.post(user, %{status: "it's post 1!"}) + {:ok, _} = CommonAPI.post(user, %{status: "it's post 2!"}) + {:ok, _} = CommonAPI.post(user, %{status: "it's post 3!"}) + + assert Timelines.generate_terms(%{}) + |> Map.fetch!(@public_url) + |> Enum.count() == 3 + end + + test "does not return non-public items", %{user: user} do + {:ok, _} = CommonAPI.post(user, %{status: "it's post 1!", visibility: "unlisted"}) + {:ok, _} = CommonAPI.post(user, %{status: "it's post 2!", visibility: "direct"}) + {:ok, _} = CommonAPI.post(user, %{status: "it's post 3!"}) + + assert Timelines.generate_terms(%{}) + |> Map.fetch!(@public_url) + |> Enum.count() == 1 + end + end +end diff --git a/test/web/preload/user_test.exs b/test/web/preload/user_test.exs new file mode 100644 index 000000000..83f065e27 --- /dev/null +++ b/test/web/preload/user_test.exs @@ -0,0 +1,33 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.Preload.Providers.UserTest do + use Pleroma.DataCase + import Pleroma.Factory + alias Pleroma.Web.Preload.Providers.User + + describe "returns empty when user doesn't exist" do + test "nil user specified" do + assert User.generate_terms(%{user: nil}) == %{} + end + + test "missing user specified" do + assert User.generate_terms(%{user: :not_a_user}) == %{} + end + end + + describe "specified user exists" do + setup do + user = insert(:user) + + terms = User.generate_terms(%{user: user}) + %{terms: terms, user: user} + end + + test "account is rendered", %{terms: terms, user: user} do + account = terms["/api/v1/accounts/#{user.id}"] + assert %{acct: user, username: user} = account + end + end +end diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 2acd0939f..b48952b29 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -5,8 +5,10 @@ defmodule Pleroma.Web.Push.ImplTest do use Pleroma.DataCase + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI alias Pleroma.Web.Push.Impl alias Pleroma.Web.Push.Subscription @@ -60,7 +62,8 @@ defmodule Pleroma.Web.Push.ImplTest do notif = insert(:notification, user: user, - activity: activity + activity: activity, + type: "mention" ) assert Impl.perform(notif) == {:ok, [:ok, :ok]} @@ -126,7 +129,7 @@ defmodule Pleroma.Web.Push.ImplTest do ) == "@Bob: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..." - assert Impl.format_title(%{activity: activity}) == + assert Impl.format_title(%{activity: activity, type: "mention"}) == "New Mention" end @@ -136,9 +139,10 @@ defmodule Pleroma.Web.Push.ImplTest do {:ok, _, _, activity} = CommonAPI.follow(user, other_user) object = Object.normalize(activity, false) - assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has followed you" + assert Impl.format_body(%{activity: activity, type: "follow"}, user, object) == + "@Bob has followed you" - assert Impl.format_title(%{activity: activity}) == + assert Impl.format_title(%{activity: activity, type: "follow"}) == "New Follower" end @@ -151,13 +155,13 @@ defmodule Pleroma.Web.Push.ImplTest do "Lorem ipsum dolor sit amet, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." }) - {:ok, announce_activity, _} = CommonAPI.repeat(activity.id, user) + {:ok, announce_activity} = CommonAPI.repeat(activity.id, user) object = Object.normalize(activity) assert Impl.format_body(%{activity: announce_activity}, user, object) == "@#{user.nickname} repeated: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis fini..." - assert Impl.format_title(%{activity: announce_activity}) == + assert Impl.format_title(%{activity: announce_activity, type: "reblog"}) == "New Repeat" end @@ -173,9 +177,10 @@ defmodule Pleroma.Web.Push.ImplTest do {:ok, activity} = CommonAPI.favorite(user, activity.id) object = Object.normalize(activity) - assert Impl.format_body(%{activity: activity}, user, object) == "@Bob has favorited your post" + assert Impl.format_body(%{activity: activity, type: "favourite"}, user, object) == + "@Bob has favorited your post" - assert Impl.format_title(%{activity: activity}) == + assert Impl.format_title(%{activity: activity, type: "favourite"}) == "New Favorite" end @@ -193,6 +198,46 @@ defmodule Pleroma.Web.Push.ImplTest do end describe "build_content/3" do + test "builds content for chat messages" do + user = insert(:user) + recipient = insert(:user) + + {:ok, chat} = CommonAPI.post_chat_message(user, recipient, "hey") + object = Object.normalize(chat, false) + [notification] = Notification.for_user(recipient) + + res = Impl.build_content(notification, user, object) + + assert res == %{ + body: "@#{user.nickname}: hey", + title: "New Chat Message" + } + end + + test "builds content for chat messages with no content" do + user = insert(:user) + recipient = insert(:user) + + file = %Plug.Upload{ + content_type: "image/jpg", + path: Path.absname("test/fixtures/image.jpg"), + filename: "an_image.jpg" + } + + {:ok, upload} = ActivityPub.upload(file, actor: user.ap_id) + + {:ok, chat} = CommonAPI.post_chat_message(user, recipient, nil, media_id: upload.id) + object = Object.normalize(chat, false) + [notification] = Notification.for_user(recipient) + + res = Impl.build_content(notification, user, object) + + assert res == %{ + body: "@#{user.nickname}: (Attachment)", + title: "New Chat Message" + } + end + test "hides details for notifications when privacy option enabled" do user = insert(:user, nickname: "Bob") user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: true}) @@ -218,7 +263,7 @@ defmodule Pleroma.Web.Push.ImplTest do status: "Lorem ipsum dolor sit amet, consectetur :firefox: adipiscing elit. Fusce sagittis finibus turpis." }) - notif = insert(:notification, user: user2, activity: activity) + notif = insert(:notification, user: user2, activity: activity, type: "mention") actor = User.get_cached_by_ap_id(notif.activity.data["actor"]) object = Object.normalize(activity) @@ -281,7 +326,7 @@ defmodule Pleroma.Web.Push.ImplTest do {:ok, activity} = CommonAPI.favorite(user, activity.id) - notif = insert(:notification, user: user2, activity: activity) + notif = insert(:notification, user: user2, activity: activity, type: "favourite") actor = User.get_cached_by_ap_id(notif.activity.data["actor"]) object = Object.normalize(activity) diff --git a/test/web/rich_media/parser_test.exs b/test/web/rich_media/parser_test.exs index e54a13bc8..420a612c6 100644 --- a/test/web/rich_media/parser_test.exs +++ b/test/web/rich_media/parser_test.exs @@ -60,19 +60,19 @@ defmodule Pleroma.Web.RichMedia.ParserTest do test "doesn't just add a title" do assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/non-ogp") == {:error, - "Found metadata was invalid or incomplete: %{url: \"http://example.com/non-ogp\"}"} + "Found metadata was invalid or incomplete: %{\"url\" => \"http://example.com/non-ogp\"}"} end test "parses ogp" do assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/ogp") == {:ok, %{ - image: "http://ia.media-imdb.com/images/rock.jpg", - title: "The Rock", - description: + "image" => "http://ia.media-imdb.com/images/rock.jpg", + "title" => "The Rock", + "description" => "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.", - type: "video.movie", - url: "http://example.com/ogp" + "type" => "video.movie", + "url" => "http://example.com/ogp" }} end @@ -80,12 +80,12 @@ defmodule Pleroma.Web.RichMedia.ParserTest do assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/ogp-missing-title") == {:ok, %{ - image: "http://ia.media-imdb.com/images/rock.jpg", - title: "The Rock (1996)", - description: + "image" => "http://ia.media-imdb.com/images/rock.jpg", + "title" => "The Rock (1996)", + "description" => "Directed by Michael Bay. With Sean Connery, Nicolas Cage, Ed Harris, John Spencer.", - type: "video.movie", - url: "http://example.com/ogp-missing-title" + "type" => "video.movie", + "url" => "http://example.com/ogp-missing-title" }} end @@ -93,12 +93,12 @@ defmodule Pleroma.Web.RichMedia.ParserTest do assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/twitter-card") == {:ok, %{ - card: "summary", - site: "@flickr", - image: "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg", - title: "Small Island Developing States Photo Submission", - description: "View the album on Flickr.", - url: "http://example.com/twitter-card" + "card" => "summary", + "site" => "@flickr", + "image" => "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg", + "title" => "Small Island Developing States Photo Submission", + "description" => "View the album on Flickr.", + "url" => "http://example.com/twitter-card" }} end @@ -106,27 +106,28 @@ defmodule Pleroma.Web.RichMedia.ParserTest do assert Pleroma.Web.RichMedia.Parser.parse("http://example.com/oembed") == {:ok, %{ - author_name: "‮‭‬bees‬", - author_url: "https://www.flickr.com/photos/bees/", - cache_age: 3600, - flickr_type: "photo", - height: "768", - html: + "author_name" => "‮‭‬bees‬", + "author_url" => "https://www.flickr.com/photos/bees/", + "cache_age" => 3600, + "flickr_type" => "photo", + "height" => "768", + "html" => "\"Bacon", - license: "All Rights Reserved", - license_id: 0, - provider_name: "Flickr", - provider_url: "https://www.flickr.com/", - thumbnail_height: 150, - thumbnail_url: "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_q.jpg", - thumbnail_width: 150, - title: "Bacon Lollys", - type: "photo", - url: "http://example.com/oembed", - version: "1.0", - web_page: "https://www.flickr.com/photos/bees/2362225867/", - web_page_short_url: "https://flic.kr/p/4AK2sc", - width: "1024" + "license" => "All Rights Reserved", + "license_id" => 0, + "provider_name" => "Flickr", + "provider_url" => "https://www.flickr.com/", + "thumbnail_height" => 150, + "thumbnail_url" => + "https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_q.jpg", + "thumbnail_width" => 150, + "title" => "Bacon Lollys", + "type" => "photo", + "url" => "http://example.com/oembed", + "version" => "1.0", + "web_page" => "https://www.flickr.com/photos/bees/2362225867/", + "web_page_short_url" => "https://flic.kr/p/4AK2sc", + "width" => "1024" }} end diff --git a/test/web/rich_media/parsers/twitter_card_test.exs b/test/web/rich_media/parsers/twitter_card_test.exs index 87c767c15..219f005a2 100644 --- a/test/web/rich_media/parsers/twitter_card_test.exs +++ b/test/web/rich_media/parsers/twitter_card_test.exs @@ -7,8 +7,7 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do alias Pleroma.Web.RichMedia.Parsers.TwitterCard test "returns error when html not contains twitter card" do - assert TwitterCard.parse([{"html", [], [{"head", [], []}, {"body", [], []}]}], %{}) == - {:error, "No twitter card metadata found"} + assert TwitterCard.parse([{"html", [], [{"head", [], []}, {"body", [], []}]}], %{}) == %{} end test "parses twitter card with only name attributes" do @@ -17,15 +16,21 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do |> Floki.parse_document!() assert TwitterCard.parse(html, %{}) == - {:ok, - %{ - "app:id:googleplay": "com.nytimes.android", - "app:name:googleplay": "NYTimes", - "app:url:googleplay": "nytimes://reader/id/100000006583622", - site: nil, - title: - "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database. - The New York Times" - }} + %{ + "app:id:googleplay" => "com.nytimes.android", + "app:name:googleplay" => "NYTimes", + "app:url:googleplay" => "nytimes://reader/id/100000006583622", + "site" => nil, + "description" => + "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.", + "image" => + "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg", + "type" => "article", + "url" => + "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html", + "title" => + "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database." + } end test "parses twitter card with only property attributes" do @@ -34,19 +39,19 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do |> Floki.parse_document!() assert TwitterCard.parse(html, %{}) == - {:ok, - %{ - card: "summary_large_image", - description: - "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.", - image: - "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", - "image:alt": "", - title: - "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", - url: - "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" - }} + %{ + "card" => "summary_large_image", + "description" => + "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.", + "image" => + "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", + "image:alt" => "", + "title" => + "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", + "url" => + "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html", + "type" => "article" + } end test "parses twitter card with name & property attributes" do @@ -55,23 +60,23 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do |> Floki.parse_document!() assert TwitterCard.parse(html, %{}) == - {:ok, - %{ - "app:id:googleplay": "com.nytimes.android", - "app:name:googleplay": "NYTimes", - "app:url:googleplay": "nytimes://reader/id/100000006583622", - card: "summary_large_image", - description: - "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.", - image: - "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", - "image:alt": "", - site: nil, - title: - "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", - url: - "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" - }} + %{ + "app:id:googleplay" => "com.nytimes.android", + "app:name:googleplay" => "NYTimes", + "app:url:googleplay" => "nytimes://reader/id/100000006583622", + "card" => "summary_large_image", + "description" => + "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.", + "image" => + "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", + "image:alt" => "", + "site" => nil, + "title" => + "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", + "url" => + "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html", + "type" => "article" + } end test "respect only first title tag on the page" do @@ -84,14 +89,17 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do File.read!("test/fixtures/margaret-corbin-grave-west-point.html") |> Floki.parse_document!() assert TwitterCard.parse(html, %{}) == - {:ok, - %{ - site: "@atlasobscura", - title: - "The Missing Grave of Margaret Corbin, Revolutionary War Veteran - Atlas Obscura", - card: "summary_large_image", - image: image_path - }} + %{ + "site" => "@atlasobscura", + "title" => "The Missing Grave of Margaret Corbin, Revolutionary War Veteran", + "card" => "summary_large_image", + "image" => image_path, + "description" => + "She's the only woman veteran honored with a monument at West Point. But where was she buried?", + "site_name" => "Atlas Obscura", + "type" => "article", + "url" => "http://www.atlasobscura.com/articles/margaret-corbin-grave-west-point" + } end test "takes first founded title in html head if there is html markup error" do @@ -100,14 +108,20 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do |> Floki.parse_document!() assert TwitterCard.parse(html, %{}) == - {:ok, - %{ - site: nil, - title: - "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database. - The New York Times", - "app:id:googleplay": "com.nytimes.android", - "app:name:googleplay": "NYTimes", - "app:url:googleplay": "nytimes://reader/id/100000006583622" - }} + %{ + "site" => nil, + "title" => + "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", + "app:id:googleplay" => "com.nytimes.android", + "app:name:googleplay" => "NYTimes", + "app:url:googleplay" => "nytimes://reader/id/100000006583622", + "description" => + "With little oversight, the N.Y.P.D. has been using powerful surveillance technology on photos of children and teenagers.", + "image" => + "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg", + "type" => "article", + "url" => + "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" + } end end diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 95b7d1420..dfe341b34 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -7,11 +7,15 @@ defmodule Pleroma.Web.StreamerTest do import Pleroma.Factory + alias Pleroma.Chat + alias Pleroma.Chat.MessageReference alias Pleroma.Conversation.Participation alias Pleroma.List + alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.CommonAPI alias Pleroma.Web.Streamer + alias Pleroma.Web.StreamerView @moduletag needs_streamer: true, capture_log: true @@ -106,7 +110,38 @@ defmodule Pleroma.Web.StreamerTest do other_user = insert(:user) {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"}) - {:ok, announce, _} = CommonAPI.repeat(activity.id, user) + {:ok, announce} = CommonAPI.repeat(activity.id, user) + + assert_receive {:render_with_user, Pleroma.Web.StreamerView, "update.json", ^announce} + refute Streamer.filtered_by_user?(user, announce) + end + + test "it does not stream announces of the user's own posts in the 'user' stream", %{ + user: user + } do + Streamer.get_topic_and_add_socket("user", user) + + other_user = insert(:user) + {:ok, activity} = CommonAPI.post(user, %{status: "hey"}) + {:ok, announce} = CommonAPI.repeat(activity.id, other_user) + + assert Streamer.filtered_by_user?(user, announce) + end + + test "it streams boosts of mastodon user in the 'user' stream", %{user: user} do + Streamer.get_topic_and_add_socket("user", user) + + other_user = insert(:user) + {:ok, activity} = CommonAPI.post(other_user, %{status: "hey"}) + + data = + File.read!("test/fixtures/mastodon-announce.json") + |> Poison.decode!() + |> Map.put("object", activity.data["object"]) + |> Map.put("actor", user.ap_id) + + {:ok, %Pleroma.Activity{data: _data, local: false} = announce} = + Pleroma.Web.ActivityPub.Transmogrifier.handle_incoming(data) assert_receive {:render_with_user, Pleroma.Web.StreamerView, "update.json", ^announce} refute Streamer.filtered_by_user?(user, announce) @@ -126,6 +161,57 @@ defmodule Pleroma.Web.StreamerTest do refute Streamer.filtered_by_user?(user, notify) end + test "it sends chat messages to the 'user:pleroma_chat' stream", %{user: user} do + other_user = insert(:user) + + {:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey cirno") + object = Object.normalize(create_activity, false) + chat = Chat.get(user.id, other_user.ap_id) + cm_ref = MessageReference.for_chat_and_object(chat, object) + cm_ref = %{cm_ref | chat: chat, object: object} + + Streamer.get_topic_and_add_socket("user:pleroma_chat", user) + Streamer.stream("user:pleroma_chat", {user, cm_ref}) + + text = StreamerView.render("chat_update.json", %{chat_message_reference: cm_ref}) + + assert text =~ "hey cirno" + assert_receive {:text, ^text} + end + + test "it sends chat messages to the 'user' stream", %{user: user} do + other_user = insert(:user) + + {:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey cirno") + object = Object.normalize(create_activity, false) + chat = Chat.get(user.id, other_user.ap_id) + cm_ref = MessageReference.for_chat_and_object(chat, object) + cm_ref = %{cm_ref | chat: chat, object: object} + + Streamer.get_topic_and_add_socket("user", user) + Streamer.stream("user", {user, cm_ref}) + + text = StreamerView.render("chat_update.json", %{chat_message_reference: cm_ref}) + + assert text =~ "hey cirno" + assert_receive {:text, ^text} + end + + test "it sends chat message notifications to the 'user:notification' stream", %{user: user} do + other_user = insert(:user) + + {:ok, create_activity} = CommonAPI.post_chat_message(other_user, user, "hey") + + notify = + Repo.get_by(Pleroma.Notification, user_id: user.id, activity_id: create_activity.id) + |> Repo.preload(:activity) + + Streamer.get_topic_and_add_socket("user:notification", user) + Streamer.stream("user:notification", notify) + assert_receive {:render_with_user, _, _, ^notify} + refute Streamer.filtered_by_user?(user, notify) + end + test "it doesn't send notify to the 'user:notification' stream when a user is blocked", %{ user: user } do @@ -427,7 +513,7 @@ defmodule Pleroma.Web.StreamerTest do {:ok, create_activity} = CommonAPI.post(user3, %{status: "I'm kawen"}) Streamer.get_topic_and_add_socket("user", user1) - {:ok, announce_activity, _} = CommonAPI.repeat(create_activity.id, user2) + {:ok, announce_activity} = CommonAPI.repeat(create_activity.id, user2) assert_receive {:render_with_user, _, _, ^announce_activity} assert Streamer.filtered_by_user?(user1, announce_activity) end @@ -440,7 +526,7 @@ defmodule Pleroma.Web.StreamerTest do {:ok, create_activity} = CommonAPI.post(user1, %{status: "I'm kawen"}) Streamer.get_topic_and_add_socket("user", user1) - {:ok, _favorite_activity, _} = CommonAPI.repeat(create_activity.id, user2) + {:ok, _announce_activity} = CommonAPI.repeat(create_activity.id, user2) assert_receive {:render_with_user, _, "notification.json", notif} assert Streamer.filtered_by_user?(user1, notif) diff --git a/test/workers/cron/new_users_digest_worker_test.exs b/test/workers/cron/new_users_digest_worker_test.exs index 54cf0ca46..ee589bb55 100644 --- a/test/workers/cron/new_users_digest_worker_test.exs +++ b/test/workers/cron/new_users_digest_worker_test.exs @@ -28,6 +28,7 @@ defmodule Pleroma.Workers.Cron.NewUsersDigestWorkerTest do assert email.html_body =~ user.nickname assert email.html_body =~ user2.nickname assert email.html_body =~ "cofe" + assert email.html_body =~ "#{Pleroma.Web.Endpoint.url()}/static/logo.png" end test "it doesn't fail when admin has no email" do diff --git a/test/workers/cron/purge_expired_activities_worker_test.exs b/test/workers/cron/purge_expired_activities_worker_test.exs index 5864f9e5f..b1db59fdf 100644 --- a/test/workers/cron/purge_expired_activities_worker_test.exs +++ b/test/workers/cron/purge_expired_activities_worker_test.exs @@ -11,7 +11,9 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do import Pleroma.Factory import ExUnit.CaptureLog - setup do: clear_config([ActivityExpiration, :enabled]) + setup do + clear_config([ActivityExpiration, :enabled]) + end test "deletes an expiration activity" do Pleroma.Config.put([ActivityExpiration, :enabled], true) @@ -36,6 +38,32 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do refute Pleroma.Repo.get(Pleroma.ActivityExpiration, expiration.id) end + test "works with ActivityExpirationPolicy" do + Pleroma.Config.put([ActivityExpiration, :enabled], true) + + clear_config([:mrf, :policies], Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy) + + user = insert(:user) + + days = Pleroma.Config.get([:mrf_activity_expiration, :days], 365) + + {:ok, %{id: id} = activity} = Pleroma.Web.CommonAPI.post(user, %{status: "cofe"}) + + past_date = + NaiveDateTime.utc_now() |> Timex.shift(days: -days) |> NaiveDateTime.truncate(:second) + + activity + |> Repo.preload(:expiration) + |> Map.get(:expiration) + |> Ecto.Changeset.change(%{scheduled_at: past_date}) + |> Repo.update!() + + Pleroma.Workers.Cron.PurgeExpiredActivitiesWorker.perform(:ops, :pid) + + assert [%{data: %{"type" => "Delete", "deleted_activity_id" => ^id}}] = + Pleroma.Repo.all(Pleroma.Activity) + end + describe "delete_activity/1" do test "adds log message if activity isn't find" do assert capture_log([level: :error], fn ->