From 241a3d744ae4e9d040247ad0aeb6287156acf920 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 11 Feb 2020 13:53:24 +0400 Subject: [PATCH 001/492] Add ActivityExpirationPolicy --- config/config.exs | 2 + lib/pleroma/web/activity_pub/mrf.ex | 7 +--- .../mrf/activity_expiration_policy.ex | 35 +++++++++++++++++ .../mrf/activity_expiration_policy_test.exs | 38 +++++++++++++++++++ 4 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex create mode 100644 test/web/activity_pub/mrf/activity_expiration_policy_test.exs diff --git a/config/config.exs b/config/config.exs index 41c1ff637..d5b298c16 100644 --- a/config/config.exs +++ b/config/config.exs @@ -361,6 +361,8 @@ config :pleroma, :mrf_subchain, match_actor: %{} +config :pleroma, :mrf_activity_expiration, days: 365 + config :pleroma, :mrf_vocabulary, accept: [], reject: [] diff --git a/lib/pleroma/web/activity_pub/mrf.ex b/lib/pleroma/web/activity_pub/mrf.ex index 263ed11af..b6e737de5 100644 --- a/lib/pleroma/web/activity_pub/mrf.ex +++ b/lib/pleroma/web/activity_pub/mrf.ex @@ -8,11 +8,8 @@ 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 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..1b8860161 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -0,0 +1,35 @@ +# 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 activities" + @behaviour Pleroma.Web.ActivityPub.MRF + + @impl true + def filter(%{"id" => id} = activity) do + activity = + if String.starts_with?(id, Pleroma.Web.Endpoint.url()) do + maybe_add_expiration(activity) + else + activity + end + + {:ok, activity} + end + + @impl true + def describe, do: {:ok, %{}} + + 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/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..2e65048c0 --- /dev/null +++ b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs @@ -0,0 +1,38 @@ +# 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, %{"expires_at" => expires_at}} = ActivityExpirationPolicy.filter(%{"id" => @id}) + + 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, %{"expires_at" => ^expires_at}} = + ActivityExpirationPolicy.filter(%{"id" => @id, "expires_at" => expires_at}) + end + + test "owerwrites existing `expires_at` if it greater than the config setting" do + too_distant_future = NaiveDateTime.utc_now() |> Timex.shift(years: 2) + + assert {:ok, %{"expires_at" => expires_at}} = + ActivityExpirationPolicy.filter(%{"id" => @id, "expires_at" => too_distant_future}) + + 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"}) + + refute Map.has_key?(activity, "expires_at") + end +end From 4d459b0e9906b2ebc0280b36c92007b2e680671f Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Wed, 12 Feb 2020 22:51:26 +0400 Subject: [PATCH 002/492] Move ActivityExpiration creation from CommonApi.post/2 to ActivityPub.insert/4 --- lib/pleroma/web/activity_pub/activity_pub.ex | 17 ++++++++++++++--- lib/pleroma/web/common_api/activity_draft.ex | 9 ++++++++- lib/pleroma/web/common_api/common_api.ex | 12 +----------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 5c436941a..408f6c966 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1,10 +1,11 @@ # Pleroma: A lightweight social networking server -# Copyright © 2017-2019 Pleroma Authors +# Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.ActivityPub do alias Pleroma.Activity alias Pleroma.Activity.Ir.Topics + alias Pleroma.ActivityExpiration alias Pleroma.Config alias Pleroma.Conversation alias Pleroma.Conversation.Participation @@ -135,12 +136,14 @@ def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when {: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 = @@ -180,6 +183,14 @@ def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when end 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), diff --git a/lib/pleroma/web/common_api/activity_draft.ex b/lib/pleroma/web/common_api/activity_draft.ex index f7da81b34..7a83cad9c 100644 --- a/lib/pleroma/web/common_api/activity_draft.ex +++ b/lib/pleroma/web/common_api/activity_draft.ex @@ -193,6 +193,13 @@ defp preview?(draft) 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 = %{ @@ -200,7 +207,7 @@ defp changes(draft) 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 2a348dcf6..03921de27 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -277,20 +277,10 @@ def listen(user, %{"title" => _} = data) 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 - # Updates the emojis for a user based on their profile def update(user) do emoji = emoji_from_profile(user) From e2d358f1fb0babbdd2a318bad863e27afecbb3d1 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 14 Feb 2020 15:19:23 +0400 Subject: [PATCH 003/492] Fix typo --- test/web/activity_pub/mrf/activity_expiration_policy_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs index 2e65048c0..2f2f90b44 100644 --- a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs +++ b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs @@ -21,7 +21,7 @@ test "keeps existing `expires_at` if it less than the config setting" do ActivityExpirationPolicy.filter(%{"id" => @id, "expires_at" => expires_at}) end - test "owerwrites existing `expires_at` if it greater than the config setting" do + 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, %{"expires_at" => expires_at}} = From 57878f870879995f53227bb7a24b810531dd4217 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 14 Feb 2020 15:50:31 +0400 Subject: [PATCH 004/492] Improve readability --- .../web/activity_pub/mrf/activity_expiration_policy.ex | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex index 1b8860161..5d823f2c7 100644 --- a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -7,9 +7,9 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do @behaviour Pleroma.Web.ActivityPub.MRF @impl true - def filter(%{"id" => id} = activity) do + def filter(activity) do activity = - if String.starts_with?(id, Pleroma.Web.Endpoint.url()) do + if local?(activity) do maybe_add_expiration(activity) else activity @@ -21,6 +21,10 @@ def filter(%{"id" => id} = activity) do @impl true def describe, do: {:ok, %{}} + defp local?(%{"id" => id}) do + String.starts_with?(id, Pleroma.Web.Endpoint.url()) + 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) From 3732b0ba729bb7443e338b5f6bcc7e018983aa4c Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 14 Feb 2020 16:39:02 +0400 Subject: [PATCH 005/492] Update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 150fd27cd..e4a641a7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Rate limiter is now disabled for localhost/socket (unless remoteip plug is enabled) - Logger: default log level changed from `warn` to `info`. - Config mix task `migrate_to_db` truncates `config` table before migrating the config file. +- MFR policy to set global expiration for every local activity +
API Changes From 0ddcd67d32eb40cb6cb2a3dfee4c55e930e7f37c Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 14 Feb 2020 16:53:53 +0400 Subject: [PATCH 006/492] Update `cheatsheet.md` and `config/description.exs` --- config/description.exs | 15 +++++++++++++++ docs/configuration/cheatsheet.md | 9 +++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/config/description.exs b/config/description.exs index e5bac9b3f..d86a4ccca 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1346,6 +1346,21 @@ } ] }, + %{ + group: :pleroma, + key: :mrf_activity_expiration, + label: "MRF Activity Expiration Policy", + type: :group, + description: "Adds expiration to all local activities", + children: [ + %{ + key: :days, + type: :integer, + description: "Default global expiration time for all local activities (in days)", + suggestions: [90, 365] + } + ] + }, %{ group: :pleroma, key: :mrf_subchain, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 2bd935983..bd03aec66 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -33,7 +33,7 @@ You shouldn't edit the base config directly to avoid breakages and merge conflic * `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.SimplePolicy`: Restrict the visibility of activities from certain 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)). @@ -43,7 +43,8 @@ You shouldn't edit the base config directly to avoid breakages and merge conflic * `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. + * `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Adds expiration to all local activities (see [`:mrf_activity_expiration`](#mrf_activity_expiration)). +* `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). @@ -142,6 +143,10 @@ 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_activity_expiration + +* `days`: Default global expiration time for all local activities (in days) + ### :activitypub * ``unfollow_blocked``: Whether blocks result in people getting unfollowed * ``outgoing_blocks``: Whether to federate blocks to other instances From 819cd467170cb6dd1334cde0a0c79dbb785a22b6 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 20 Feb 2020 22:04:02 +0400 Subject: [PATCH 007/492] Auto-expire Create activities only --- .../mrf/activity_expiration_policy.ex | 2 +- test/web/activity_pub/activity_pub_test.exs | 16 +++++++++ .../mrf/activity_expiration_policy_test.exs | 35 +++++++++++++++---- .../purge_expired_activities_worker_test.exs | 30 ++++++++++++++++ 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex index 5d823f2c7..274bb9a5c 100644 --- a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do @impl true def filter(activity) do activity = - if local?(activity) do + if activity["type"] == "Create" && local?(activity) do maybe_add_expiration(activity) else activity diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index ce68e7d0e..2cd908a87 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -1784,4 +1784,20 @@ test "old user must be in the new user's `also_known_as` list" do ActivityPub.move(old_user, new_user) end end + + describe "global activity expiration" do + clear_config([:instance, :rewrite_policy]) + + test "creates an activity expiration for local Create activities" do + Pleroma.Config.put( + [:instance, :rewrite_policy], + 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 index 2f2f90b44..0d3bcc457 100644 --- a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs +++ b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs @@ -9,7 +9,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do @id Pleroma.Web.Endpoint.url() <> "/activities/cofe" test "adds `expires_at` property" do - assert {:ok, %{"expires_at" => expires_at}} = ActivityExpirationPolicy.filter(%{"id" => @id}) + assert {:ok, %{"type" => "Create", "expires_at" => expires_at}} = + ActivityExpirationPolicy.filter(%{"id" => @id, "type" => "Create"}) assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 end @@ -17,21 +18,43 @@ test "adds `expires_at` property" do test "keeps existing `expires_at` if it less than the config setting" do expires_at = NaiveDateTime.utc_now() |> Timex.shift(days: 1) - assert {:ok, %{"expires_at" => ^expires_at}} = - ActivityExpirationPolicy.filter(%{"id" => @id, "expires_at" => expires_at}) + assert {:ok, %{"type" => "Create", "expires_at" => ^expires_at}} = + ActivityExpirationPolicy.filter(%{ + "id" => @id, + "type" => "Create", + "expires_at" => expires_at + }) 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, %{"expires_at" => expires_at}} = - ActivityExpirationPolicy.filter(%{"id" => @id, "expires_at" => too_distant_future}) + assert {:ok, %{"type" => "Create", "expires_at" => expires_at}} = + ActivityExpirationPolicy.filter(%{ + "id" => @id, + "type" => "Create", + "expires_at" => too_distant_future + }) 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"}) + assert {:ok, activity} = + ActivityExpirationPolicy.filter(%{ + "id" => "https://example.com/123", + "type" => "Create" + }) + + refute Map.has_key?(activity, "expires_at") + end + + test "ignores non-Create activities" do + assert {:ok, activity} = + ActivityExpirationPolicy.filter(%{ + "id" => "https://example.com/123", + "type" => "Follow" + }) refute Map.has_key?(activity, "expires_at") end diff --git a/test/workers/cron/purge_expired_activities_worker_test.exs b/test/workers/cron/purge_expired_activities_worker_test.exs index c2561683e..c6c7ff388 100644 --- a/test/workers/cron/purge_expired_activities_worker_test.exs +++ b/test/workers/cron/purge_expired_activities_worker_test.exs @@ -12,6 +12,7 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do import ExUnit.CaptureLog clear_config([ActivityExpiration, :enabled]) + clear_config([:instance, :rewrite_policy]) test "deletes an expiration activity" do Pleroma.Config.put([ActivityExpiration, :enabled], true) @@ -36,6 +37,35 @@ test "deletes an expiration activity" do refute Pleroma.Repo.get(Pleroma.ActivityExpiration, expiration.id) end + test "works with ActivityExpirationPolicy" do + Pleroma.Config.put([ActivityExpiration, :enabled], true) + + Pleroma.Config.put( + [:instance, :rewrite_policy], + 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 -> From 011ede45361096f55dda938078e24574cdf33b2b Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 21 Feb 2020 14:42:43 +0400 Subject: [PATCH 008/492] Update documentation --- CHANGELOG.md | 2 +- config/description.exs | 4 ++-- docs/configuration/cheatsheet.md | 4 ++-- .../web/activity_pub/mrf/activity_expiration_policy.ex | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4a641a7e..c5558e0c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Rate limiter is now disabled for localhost/socket (unless remoteip plug is enabled) - Logger: default log level changed from `warn` to `info`. - Config mix task `migrate_to_db` truncates `config` table before migrating the config file. -- MFR policy to set global expiration for every local activity +- MFR policy to set global expiration for all local Create activities
API Changes diff --git a/config/description.exs b/config/description.exs index d86a4ccca..f0c6e3377 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1351,12 +1351,12 @@ key: :mrf_activity_expiration, label: "MRF Activity Expiration Policy", type: :group, - description: "Adds expiration to all local activities", + description: "Adds expiration to all local Create activities", children: [ %{ key: :days, type: :integer, - description: "Default global expiration time for all local activities (in days)", + description: "Default global expiration time for all local Create activities (in days)", suggestions: [90, 365] } ] diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index bd03aec66..f50c8bab7 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -43,7 +43,7 @@ You shouldn't edit the base config directly to avoid breakages and merge conflic * `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)). - * `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Adds expiration to all local activities (see [`:mrf_activity_expiration`](#mrf_activity_expiration)). + * `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Adds expiration to all local Create activities (see [`:mrf_activity_expiration`](#mrf_activity_expiration)). * `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``. @@ -145,7 +145,7 @@ config :pleroma, :mrf_user_allowlist, #### :mrf_activity_expiration -* `days`: Default global expiration time for all local activities (in days) +* `days`: Default global expiration time for all local Create activities (in days) ### :activitypub * ``unfollow_blocked``: Whether blocks result in people getting unfollowed diff --git a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex index 274bb9a5c..a9bdf3b69 100644 --- a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -3,7 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do - @moduledoc "Adds expiration to all local activities" + @moduledoc "Adds expiration to all local Create activities" @behaviour Pleroma.Web.ActivityPub.MRF @impl true From cb8236cda62cddb72f4320af6347defae44b81ca Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 20 Mar 2020 21:19:34 +0400 Subject: [PATCH 009/492] Add embeddable posts --- lib/pleroma/web/embed_controller.ex | 42 +++++++ lib/pleroma/web/endpoint.ex | 2 +- lib/pleroma/web/router.ex | 2 + .../web/templates/embed/_attachment.html.eex | 8 ++ lib/pleroma/web/templates/embed/show.html.eex | 76 ++++++++++++ .../web/templates/layout/embed.html.eex | 14 +++ lib/pleroma/web/views/embed_view.ex | 83 +++++++++++++ priv/static/embed.css | 115 ++++++++++++++++++ priv/static/embed.js | 43 +++++++ 9 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 lib/pleroma/web/embed_controller.ex create mode 100644 lib/pleroma/web/templates/embed/_attachment.html.eex create mode 100644 lib/pleroma/web/templates/embed/show.html.eex create mode 100644 lib/pleroma/web/templates/layout/embed.html.eex create mode 100644 lib/pleroma/web/views/embed_view.ex create mode 100644 priv/static/embed.css create mode 100644 priv/static/embed.js 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/endpoint.ex b/lib/pleroma/web/endpoint.ex index 72cb3ee27..4f665db12 100644 --- a/lib/pleroma/web/endpoint.ex +++ b/lib/pleroma/web/endpoint.ex @@ -35,7 +35,7 @@ defmodule Pleroma.Web.Endpoint do at: "/", from: :pleroma, only: - ~w(index.html robots.txt static finmoji emoji packs sounds images instance sw.js sw-pleroma.js favicon.png schemas doc), + ~w(index.html robots.txt static finmoji emoji packs sounds images instance sw.js sw-pleroma.js favicon.png schemas doc embed.js embed.css), # credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength gzip: true, cache_control_for_etags: @static_cache_control, diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 3f36f6c1a..eef0a8023 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -637,6 +637,8 @@ defmodule Pleroma.Web.Router do post("/auth/password", MastodonAPI.AuthController, :password_reset) get("/web/*path", MastoFEController, :index) + + get("/embed/:id", EmbedController, :show) end pipeline :remote_media do 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..6bf8fac29 --- /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..57ae4f802 --- /dev/null +++ b/lib/pleroma/web/templates/layout/embed.html.eex @@ -0,0 +1,14 @@ + + + + + + <%= Pleroma.Config.get([:instance, :name]) %> + + <%= Phoenix.HTML.raw(assigns[:meta] || "") %> + + + + <%= render @view_module, @view_template, assigns %> + + diff --git a/lib/pleroma/web/views/embed_view.ex b/lib/pleroma/web/views/embed_view.ex new file mode 100644 index 000000000..77536835b --- /dev/null +++ b/lib/pleroma/web/views/embed_view.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.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 emoji_for_user(%User{} = user) do + user.source_data + |> Map.get("tag", []) + |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) + |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> + {String.trim(name, ":"), url} + end) + end + + 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/priv/static/embed.css b/priv/static/embed.css new file mode 100644 index 000000000..cc79ee7ab --- /dev/null +++ b/priv/static/embed.css @@ -0,0 +1,115 @@ +body { + background-color: #282c37; + font-family: sans-serif; + color: white; + margin: 0; + padding: 1em; + padding-bottom: 0; +} + +.avatar { + cursor: pointer; +} + +.avatar img { + float: left; + border-radius: 4px; + margin-right: 4px; +} + +.activity-content { + padding-top: 1em; +} + +.attachment { + margin-top: 1em; +} + +.attachment img { + max-width: 100%; +} + +.date a { + text-decoration: none; +} + +.date a:hover { + text-decoration: underline; +} + +.date a, +.counts { + color: #666; + font-size: 0.9em; +} + +.counts dt, +.counts dd { + float: left; + margin-left: 1em; +} + +a { + color: white; +} + +.h-card { + min-height: 48px; + margin-bottom: 8px; +} + +.h-card a { + text-decoration: none; +} + +.h-card a:hover { + text-decoration: underline; +} + +.display-name { + padding-top: 4px; + display: block; + text-overflow: ellipsis; + overflow: hidden; + color: white; +} + +/* keep emoji from being hilariously huge */ +.display-name img { + max-height: 1em; +} + +.display-name .nickname { + padding-top: 4px; + display: block; +} + +.nickname:hover { + text-decoration: none; +} + +.pull-right { + float: right; +} + +.collapse { + margin: 0; + width: auto; +} + +a.button { + box-sizing: border-box; + display: inline-block; + color: white; + background-color: #419bdd; + border-radius: 4px; + border: none; + padding: 10px; + font-weight: 500; + font-size: 0.9em; +} + +a.button:hover { + text-decoration: none; + background-color: #61a6d9; +} diff --git a/priv/static/embed.js b/priv/static/embed.js new file mode 100644 index 000000000..f675f6417 --- /dev/null +++ b/priv/static/embed.js @@ -0,0 +1,43 @@ +(function () { + 'use strict' + + var ready = function (loaded) { + if (['interactive', 'complete'].indexOf(document.readyState) !== -1) { + loaded() + } else { + document.addEventListener('DOMContentLoaded', loaded) + } + } + + ready(function () { + var iframes = [] + + window.addEventListener('message', function (e) { + var data = e.data || {} + + if (data.type !== 'setHeightPleromaEmbed' || !iframes[data.id]) { + return + } + + iframes[data.id].height = data.height + }); + + [].forEach.call(document.querySelectorAll('iframe.pleroma-embed'), function (iframe) { + iframe.scrolling = 'no' + iframe.style.overflow = 'hidden' + + iframes.push(iframe) + + var id = iframes.length - 1 + + iframe.onload = function () { + iframe.contentWindow.postMessage({ + type: 'setHeightPleromaEmbed', + id: id + }, '*') + } + + iframe.onload() + }) + }) +})() From fc2eb1fbd6a5b38a3cf72e557cce1029d6b7f16f Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 20 Mar 2020 22:16:57 +0400 Subject: [PATCH 010/492] Fix formatter warnings --- test/workers/cron/purge_expired_activities_worker_test.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/workers/cron/purge_expired_activities_worker_test.exs b/test/workers/cron/purge_expired_activities_worker_test.exs index 85ae1e5ef..beac55fb2 100644 --- a/test/workers/cron/purge_expired_activities_worker_test.exs +++ b/test/workers/cron/purge_expired_activities_worker_test.exs @@ -11,8 +11,8 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do import Pleroma.Factory import ExUnit.CaptureLog - setup do - clear_config([ActivityExpiration, :enabled]) + setup do + clear_config([ActivityExpiration, :enabled]) clear_config([:instance, :rewrite_policy]) end From fd97b0e634d30dec3217efcf3d67610d1b54bf8b Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 9 Mar 2020 17:00:16 +0100 Subject: [PATCH 011/492] Chats: Basic implementation. --- lib/pleroma/chat.ex | 41 +++++++++++++++++ .../20200309123730_create_chats.exs | 16 +++++++ test/chat_test.exs | 44 +++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 lib/pleroma/chat.ex create mode 100644 priv/repo/migrations/20200309123730_create_chats.exs create mode 100644 test/chat_test.exs diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex new file mode 100644 index 000000000..e2a8b8eba --- /dev/null +++ b/lib/pleroma/chat.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.Chat do + use Ecto.Schema + import Ecto.Changeset + + alias Pleroma.User + alias Pleroma.Repo + + @moduledoc """ + Chat keeps a reference to DirectMessage 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. + """ + + schema "chats" do + belongs_to(:user, User, type: FlakeId.Ecto.CompatType) + field(:recipient, :string) + field(:unread, :integer, default: 0) + + timestamps() + end + + def creation_cng(struct, params) do + struct + |> cast(params, [:user_id, :recipient]) + |> validate_required([:user_id, :recipient]) + |> unique_constraint(:user_id, name: :chats_user_id_recipient_index) + end + + def get_or_create(user_id, recipient) do + %__MODULE__{} + |> creation_cng(%{user_id: user_id, recipient: recipient}) + |> Repo.insert( + on_conflict: [set: [updated_at: NaiveDateTime.utc_now()]], + conflict_target: [:user_id, :recipient] + ) + end +end 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/test/chat_test.exs b/test/chat_test.exs new file mode 100644 index 000000000..ca9206802 --- /dev/null +++ b/test/chat_test.exs @@ -0,0 +1,44 @@ +# 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 creates a chat for a user and recipient" do + user = insert(:user) + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + assert chat.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.get_or_create(user.id, other_user.ap_id) + :timer.sleep(1500) + {:ok, chat_two} = Chat.get_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 From 3775683a04e9b819f88bfba533b755bbd5b3c2df Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 8 Apr 2020 15:55:43 +0200 Subject: [PATCH 012/492] ChatMessage: Basic incoming handling. --- lib/pleroma/chat.ex | 2 +- lib/pleroma/web/activity_pub/activity_pub.ex | 1 + .../web/activity_pub/object_validator.ex | 30 +++++++++- .../chat_message_validator.ex | 58 +++++++++++++++++++ .../create_chat_message_validator.ex | 35 +++++++++++ ..._validator.ex => create_note_validator.ex} | 0 .../object_validators/types/recipients.ex | 23 ++++++++ .../web/activity_pub/transmogrifier.ex | 7 +++ .../transmogrifier/chat_message_handling.ex | 30 ++++++++++ test/fixtures/create-chat-message.json | 19 ++++++ .../types/recipients_test.exs | 15 +++++ .../transmogrifier/chat_message_test.exs | 32 ++++++++++ 12 files changed, 250 insertions(+), 2 deletions(-) create mode 100644 lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex create mode 100644 lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex rename lib/pleroma/web/activity_pub/object_validators/{create_validator.ex => create_note_validator.ex} (100%) create mode 100644 lib/pleroma/web/activity_pub/object_validators/types/recipients.ex create mode 100644 lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex create mode 100644 test/fixtures/create-chat-message.json create mode 100644 test/web/activity_pub/object_validators/types/recipients_test.exs create mode 100644 test/web/activity_pub/transmogrifier/chat_message_test.exs diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index e2a8b8eba..07ad62b97 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -10,7 +10,7 @@ defmodule Pleroma.Chat do alias Pleroma.Repo @moduledoc """ - Chat keeps a reference to DirectMessage conversations between a user and an recipient. The recipient can be a user (for now) or a group (not implemented yet). + 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. """ diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 19286fd01..0b4892501 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -397,6 +397,7 @@ defp do_unreact_with_emoji(user, reaction_id, options) do end end + # TODO: Is this even used now? # TODO: This is weird, maybe we shouldn't check here if we can make the activity. @spec like(User.t(), Object.t(), String.t() | nil, boolean()) :: {:ok, Activity.t(), Object.t()} | {:error, any()} diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index dc4bce059..49cc72561 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -12,18 +12,46 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()} def validate(object, meta) def validate(%{"type" => "Like"} = object, meta) do with {:ok, object} <- - object |> LikeValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do + object + |> LikeValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do object = stringify_keys(object |> Map.from_struct()) {:ok, object, meta} end end + def validate(%{"type" => "ChatMessage"} = object, meta) do + with {:ok, object} <- + object + |> ChatMessageValidator.cast_and_apply() do + object = stringify_keys(object) + {:ok, object, meta} + end + end + + def validate(%{"type" => "Create"} = object, meta) do + with {:ok, object} <- + object + |> CreateChatMessageValidator.cast_and_apply() do + object = stringify_keys(object) + {:ok, object, meta} + end + end + + def stringify_keys(%{__struct__: _} = object) do + object + |> Map.from_struct() + |> stringify_keys + end + def stringify_keys(object) do object |> Map.new(fn {key, val} -> {to_string(key), val} 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..ab5be3596 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -0,0 +1,58 @@ +# 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.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + + @primary_key false + @derive Jason.Encoder + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:to, Types.Recipients, default: []) + field(:type, :string) + field(:content, :string) + field(:actor, Types.ObjectID) + field(:published, Types.DateTime) + 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 + |> Map.put_new("actor", data["attributedTo"]) + end + + def changeset(struct, data) do + data = fix(data) + + struct + |> cast(data, __schema__(:fields)) + end + + def validate_data(data_cng) do + data_cng + |> validate_inclusion(:type, ["ChatMessage"]) + |> validate_required([:id, :actor, :to, :type, :content]) + 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..659311480 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/create_chat_message_validator.ex @@ -0,0 +1,35 @@ +# 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 +# - object has to be validated first, maybe with some meta info from the surrounding create +defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator do + use Ecto.Schema + + 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(:type, :string) + field(:to, Types.Recipients, default: []) + field(:object, Types.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 +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 100% 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 diff --git a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex new file mode 100644 index 000000000..5a3040842 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex @@ -0,0 +1,23 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients do + use Ecto.Type + + def type, do: {:array, :string} + + def cast(object) when is_binary(object) do + cast([object]) + end + + def cast([_ | _] = data), do: {:ok, data} + + 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/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 0a8ad62ad..becc35ea3 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -16,6 +16,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.Pipeline + alias Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.Federator @@ -612,6 +613,12 @@ def handle_incoming( |> handle_incoming(options) end + def handle_incoming( + %{"type" => "Create", "object" => %{"type" => "ChatMessage"}} = data, + options + ), + do: ChatMessageHandling.handle_incoming(data, options) + def handle_incoming(%{"type" => "Like"} = data, _options) do with {_, {:ok, cast_data_sym}} <- {:casting_data, diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex new file mode 100644 index 000000000..b5843736f --- /dev/null +++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex @@ -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.Transmogrifier.ChatMessageHandling do + alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ObjectValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator + alias Pleroma.Web.ActivityPub.Pipeline + + def handle_incoming( + %{"type" => "Create", "object" => %{"type" => "ChatMessage"} = object_data} = data, + _options + ) do + with {_, {:ok, cast_data_sym}} <- + {:casting_data, data |> CreateChatMessageValidator.cast_and_apply()}, + cast_data = ObjectValidator.stringify_keys(cast_data_sym), + {_, {:ok, object_cast_data_sym}} <- + {:casting_object_data, object_data |> ChatMessageValidator.cast_and_apply()}, + object_cast_data = ObjectValidator.stringify_keys(object_cast_data_sym), + {_, {:ok, validated_object, _meta}} <- + {:validate_object, ObjectValidator.validate(object_cast_data, %{})}, + {_, {:ok, _created_object}} <- {:persist_object, Object.create(validated_object)}, + {_, {:ok, activity, _meta}} <- + {:common_pipeline, Pipeline.common_pipeline(cast_data, local: false)} do + {:ok, activity} + end + end +end diff --git a/test/fixtures/create-chat-message.json b/test/fixtures/create-chat-message.json new file mode 100644 index 000000000..4aa17f4a5 --- /dev/null +++ b/test/fixtures/create-chat-message.json @@ -0,0 +1,19 @@ +{ + "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" +} diff --git a/test/web/activity_pub/object_validators/types/recipients_test.exs b/test/web/activity_pub/object_validators/types/recipients_test.exs new file mode 100644 index 000000000..2f9218774 --- /dev/null +++ b/test/web/activity_pub/object_validators/types/recipients_test.exs @@ -0,0 +1,15 @@ +defmodule Pleroma.Web.ObjectValidators.Types.RecipientsTest do + alias Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients + use Pleroma.DataCase + + test "it works with a list" do + list = ["https://lain.com/users/lain"] + assert {:ok, list} == Recipients.cast(list) + end + + test "it turns a single string into a list" do + recipient = "https://lain.com/users/lain" + + assert {:ok, [recipient]} == Recipients.cast(recipient) + 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..aed62c520 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -0,0 +1,32 @@ +# 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.Object + alias Pleroma.Web.ActivityPub.Transmogrifier + + describe "handle_incoming" do + test "it insert it" do + data = + File.read!("test/fixtures/create-chat-message.json") + |> Poison.decode!() + + author = insert(:user, ap_id: data["actor"], local: false) + recipient = insert(:user, ap_id: List.first(data["to"]), local: false) + + {:ok, %Activity{} = activity} = Transmogrifier.handle_incoming(data) + + 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 + end + end +end From 2e78686686f04726ad73749ee744b8a9df91ffb8 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 9 Apr 2020 12:44:20 +0200 Subject: [PATCH 013/492] SideEffects: Handle ChatMessage creation. --- lib/pleroma/chat.ex | 15 ++++++---- lib/pleroma/web/activity_pub/builder.ex | 22 +++++++++++++++ lib/pleroma/web/activity_pub/side_effects.ex | 29 ++++++++++++++++++++ test/chat_test.exs | 14 ++++++---- test/web/activity_pub/side_effects_test.exs | 26 ++++++++++++++++++ 5 files changed, 95 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 07ad62b97..b61bc4c0e 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -18,23 +18,28 @@ defmodule Pleroma.Chat do schema "chats" do belongs_to(:user, User, type: FlakeId.Ecto.CompatType) field(:recipient, :string) - field(:unread, :integer, default: 0) + field(:unread, :integer, default: 0, read_after_writes: true) timestamps() end def creation_cng(struct, params) do struct - |> cast(params, [:user_id, :recipient]) + |> cast(params, [:user_id, :recipient, :unread]) |> validate_required([:user_id, :recipient]) |> unique_constraint(:user_id, name: :chats_user_id_recipient_index) end - def get_or_create(user_id, recipient) do + def get(user_id, recipient) do + __MODULE__ + |> Repo.get_by(user_id: user_id, recipient: recipient) + end + + def bump_or_create(user_id, recipient) do %__MODULE__{} - |> creation_cng(%{user_id: user_id, recipient: recipient}) + |> creation_cng(%{user_id: user_id, recipient: recipient, unread: 1}) |> Repo.insert( - on_conflict: [set: [updated_at: NaiveDateTime.utc_now()]], + on_conflict: [set: [updated_at: NaiveDateTime.utc_now()], inc: [unread: 1]], conflict_target: [:user_id, :recipient] ) end diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 429a510b8..f0a6c1e1b 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -10,6 +10,28 @@ defmodule Pleroma.Web.ActivityPub.Builder do alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility + def create(actor, object_id, recipients) do + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "to" => recipients, + "object" => object_id, + "type" => "Create" + }, []} + end + + def chat_message(actor, recipient, content) do + {:ok, + %{ + "id" => Utils.generate_object_id(), + "actor" => actor.ap_id, + "type" => "ChatMessage", + "to" => [recipient], + "content" => content + }, []} + end + @spec like(User.t(), Object.t()) :: {:ok, map(), keyword()} def like(actor, object) do object_actor = User.get_cached_by_ap_id(object.data["actor"]) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 666a4e310..594f32700 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -5,8 +5,10 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do liked object, a `Follow` activity will add the user to the follower collection, and so on. """ + alias Pleroma.Chat alias Pleroma.Notification alias Pleroma.Object + alias Pleroma.User alias Pleroma.Web.ActivityPub.Utils def handle(object, meta \\ []) @@ -21,8 +23,35 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do {:ok, object, meta} end + def handle(%{data: %{"type" => "Create", "object" => object_id}} = activity, meta) do + object = Object.get_by_ap_id(object_id) + + {:ok, _object} = handle_object_creation(object) + + {:ok, activity, meta} + end + # Nothing to do def handle(object, meta) do {:ok, object, meta} end + + def handle_object_creation(%{data: %{"type" => "ChatMessage"}} = object) do + actor = User.get_cached_by_ap_id(object.data["actor"]) + recipient = User.get_cached_by_ap_id(hd(object.data["to"])) + + [[actor, recipient], [recipient, actor]] + |> Enum.each(fn [user, other_user] -> + if user.local do + Chat.bump_or_create(user.id, other_user.ap_id) + end + end) + + {:ok, object} + end + + # Nothing to do + def handle_object_creation(object) do + {:ok, object} + end end diff --git a/test/chat_test.exs b/test/chat_test.exs index ca9206802..bb2b46d51 100644 --- a/test/chat_test.exs +++ b/test/chat_test.exs @@ -14,7 +14,7 @@ test "it creates a chat for a user and recipient" do user = insert(:user) other_user = insert(:user) - {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) assert chat.id end @@ -23,19 +23,21 @@ 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) + {: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 "a returning chat will have an updated `update_at` field" do + test "a returning chat will have an updated `update_at` field and an incremented unread count" do user = insert(:user) other_user = insert(:user) - {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + assert chat.unread == 1 :timer.sleep(1500) - {:ok, chat_two} = Chat.get_or_create(user.id, other_user.ap_id) + {:ok, chat_two} = Chat.bump_or_create(user.id, other_user.ap_id) + assert chat_two.unread == 2 assert chat.id == chat_two.id assert chat.updated_at != chat_two.updated_at diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index b67bd14b3..5fd8372b5 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -5,6 +5,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do use Pleroma.DataCase + alias Pleroma.Chat alias Pleroma.Object alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Builder @@ -31,4 +32,29 @@ test "add the like to the original object", %{like: like, user: user} do assert user.ap_id in object.data["likes"] end end + + describe "creation of ChatMessages" do + 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, chat_message_object} = Object.create(chat_message_data) + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_object.data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, _meta} = SideEffects.handle(create_activity) + + # 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 + end + end end From 4b047850718086a6d2edb5b2d94c6f888eba3016 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 9 Apr 2020 12:46:33 +0200 Subject: [PATCH 014/492] SideEffects: Extend ChatMessage test. --- test/web/activity_pub/side_effects_test.exs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 5fd8372b5..b629d0d5d 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -55,6 +55,26 @@ test "it creates a Chat for the local users and bumps the unread count" do # 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, chat_message_object} = Object.create(chat_message_data) + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_object.data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, _meta} = SideEffects.handle(create_activity) + + # 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 end From 8e637ae1a7b75fa08679ae9cf424650fc105de85 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 9 Apr 2020 13:20:16 +0200 Subject: [PATCH 015/492] CommonAPI: Basic ChatMessage support. --- lib/pleroma/web/common_api/common_api.ex | 23 +++++++++++++++++++++++ test/web/common_api/common_api_test.exs | 21 +++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 636cf3301..39e15adbf 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Web.CommonAPI do alias Pleroma.Conversation.Participation alias Pleroma.FollowingRelationship alias Pleroma.Object + alias Pleroma.Repo alias Pleroma.ThreadMute alias Pleroma.User alias Pleroma.UserRelationship @@ -23,6 +24,28 @@ defmodule Pleroma.Web.CommonAPI do require Pleroma.Constants require Logger + def post_chat_message(user, recipient, content) do + transaction = + Repo.transaction(fn -> + with {_, {:ok, chat_message_data, _meta}} <- + {:build_object, Builder.chat_message(user, recipient.ap_id, content)}, + {_, {:ok, chat_message_object}} <- + {:create_object, Object.create(chat_message_data)}, + {_, {:ok, create_activity_data, _meta}} <- + {:build_create_activity, + Builder.create(user, chat_message_object.data["id"], [recipient.ap_id])}, + {_, {:ok, %Activity{} = activity, _meta}} <- + {:common_pipeline, Pipeline.common_pipeline(create_activity_data, local: true)} do + {:ok, activity} + end + end) + + case transaction do + {:ok, value} -> value + error -> error + end + end + def follow(follower, followed) do timeout = Pleroma.Config.get([:activitypub, :follow_handshake_timeout]) diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index f46ad0272..1aea06d24 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -5,6 +5,7 @@ defmodule Pleroma.Web.CommonAPITest do use Pleroma.DataCase alias Pleroma.Activity + alias Pleroma.Chat alias Pleroma.Conversation.Participation alias Pleroma.Object alias Pleroma.User @@ -21,6 +22,26 @@ defmodule Pleroma.Web.CommonAPITest do setup do: clear_config([:instance, :limit]) setup do: clear_config([:instance, :max_pinned_statuses]) + describe "posting chat messages" do + test "it posts a chat message" do + author = insert(:user) + recipient = insert(:user) + + {:ok, activity} = CommonAPI.post_chat_message(author, recipient, "a test message") + + 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" + + assert Chat.get(author.id, recipient.ap_id) + assert Chat.get(recipient.id, author.ap_id) + end + end + test "when replying to a conversation / participation, it will set the correct context id even if no explicit reply_to is given" do user = insert(:user) {:ok, activity} = CommonAPI.post(user, %{"status" => ".", "visibility" => "direct"}) From 68abea313d0be49aa6b8d4b980aa361383f991a7 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 9 Apr 2020 15:13:55 +0200 Subject: [PATCH 016/492] ChatController: Add creation and return of chats. --- lib/pleroma/chat.ex | 10 ++++ .../controllers/chat_controller.ex | 47 ++++++++++++++++ lib/pleroma/web/router.ex | 7 +++ .../controllers/chat_controller_test.exs | 55 +++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 lib/pleroma/web/pleroma_api/controllers/chat_controller.ex create mode 100644 test/web/pleroma_api/controllers/chat_controller_test.exs diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index b61bc4c0e..2475019d1 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -35,6 +35,16 @@ def get(user_id, recipient) do |> Repo.get_by(user_id: user_id, recipient: recipient) end + def get_or_create(user_id, recipient) do + %__MODULE__{} + |> creation_cng(%{user_id: user_id, recipient: recipient}) + |> Repo.insert( + on_conflict: :nothing, + returning: true, + conflict_target: [:user_id, :recipient] + ) + end + def bump_or_create(user_id, recipient) do %__MODULE__{} |> creation_cng(%{user_id: user_id, recipient: recipient, unread: 1}) 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..0ee8bea33 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -0,0 +1,47 @@ +# 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.Chat + alias Pleroma.Repo + + import Ecto.Query + + def index(%{assigns: %{user: %{id: user_id}}} = conn, _params) do + chats = + from(c in Chat, + where: c.user_id == ^user_id, + order_by: [desc: c.updated_at] + ) + |> Repo.all() + + represented_chats = + Enum.map(chats, fn chat -> + %{ + id: chat.id, + recipient: chat.recipient, + unread: chat.unread + } + end) + + conn + |> json(represented_chats) + end + + def create(%{assigns: %{user: user}} = conn, params) do + recipient = params["ap_id"] |> URI.decode_www_form() + + with {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do + represented_chat = %{ + id: chat.id, + recipient: chat.recipient, + unread: chat.unread + } + + conn + |> json(represented_chat) + end + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 3ecd59cd1..18ce9ee4b 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -284,6 +284,13 @@ defmodule Pleroma.Web.Router do end scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do + scope [] do + pipe_through(:authenticated_api) + + post("/chats/by-ap-id/:ap_id", ChatController, :create) + get("/chats", ChatController, :index) + end + scope [] do pipe_through(:authenticated_api) 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..40c09d1cd --- /dev/null +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -0,0 +1,55 @@ +# 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 + + import Pleroma.Factory + + describe "POST /api/v1/pleroma/chats/by-ap-id/:id" do + test "it creates or returns a chat", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + result = + conn + |> assign(:user, user) + |> post("/api/v1/pleroma/chats/by-ap-id/#{URI.encode_www_form(other_user.ap_id)}") + |> json_response(200) + + assert result["id"] + end + end + + describe "GET /api/v1/pleroma/chats" do + test "it return a list of chats the current user is participating in, in descending order of updates", + %{conn: conn} do + user = insert(:user) + 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 + |> assign(:user, user) + |> get("/api/v1/pleroma/chats") + |> json_response(200) + + ids = Enum.map(result, & &1["id"]) + + assert ids == [chat_2.id, chat_3.id, chat_1.id] + end + end +end From e8fd0dd689be0c7bbca006f7267955329279da98 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 9 Apr 2020 16:59:49 +0200 Subject: [PATCH 017/492] ChatController: Basic support for returning messages. --- .../controllers/chat_controller.ex | 40 +++++++++++++++++++ lib/pleroma/web/router.ex | 1 + .../controllers/chat_controller_test.exs | 28 +++++++++++++ 3 files changed, 69 insertions(+) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 0ee8bea33..de23b9a22 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -5,10 +5,50 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do use Pleroma.Web, :controller alias Pleroma.Chat + alias Pleroma.Object alias Pleroma.Repo import Ecto.Query + def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id}) do + with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do + messages = + from(o in Object, + where: fragment("?->>'type' = ?", o.data, "ChatMessage"), + where: + fragment( + """ + (?->>'actor' = ? and ?->'to' = ?) + OR (?->>'actor' = ? and ?->'to' = ?) + """, + o.data, + ^user.ap_id, + o.data, + ^[chat.recipient], + o.data, + ^chat.recipient, + o.data, + ^[user.ap_id] + ), + order_by: [desc: o.id] + ) + |> Repo.all() + + represented_messages = + messages + |> Enum.map(fn message -> + %{ + actor: message.data["actor"], + id: message.id, + content: message.data["content"] + } + end) + + conn + |> json(represented_messages) + end + end + def index(%{assigns: %{user: %{id: user_id}}} = conn, _params) do chats = from(c in Chat, diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 18ce9ee4b..368e77d3e 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -289,6 +289,7 @@ defmodule Pleroma.Web.Router do post("/chats/by-ap-id/:ap_id", ChatController, :create) get("/chats", ChatController, :index) + get("/chats/:id/messages", ChatController, :messages) end scope [] do diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 40c09d1cd..6b2db5064 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -5,9 +5,37 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true alias Pleroma.Chat + alias Pleroma.Web.CommonAPI import Pleroma.Factory + describe "GET /api/v1/pleroma/chats/:id/messages" do + # TODO + # - Test that statuses don't show + # - Test the case where it's not the user's chat + # - Test the returned data + test "it returns the messages for a given chat", %{conn: conn} do + user = insert(:user) + 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 + |> assign(:user, user) + |> get("/api/v1/pleroma/chats/#{chat.id}/messages") + |> json_response(200) + + assert length(result) == 3 + end + end + describe "POST /api/v1/pleroma/chats/by-ap-id/:id" do test "it creates or returns a chat", %{conn: conn} do user = insert(:user) From 2cc68414245805dc3b83c200798e424f139e71fc Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 9 Apr 2020 17:18:31 +0200 Subject: [PATCH 018/492] ChatController: Basic message posting. --- .../controllers/chat_controller.ex | 26 +++++++++++++++++++ lib/pleroma/web/router.ex | 1 + .../controllers/chat_controller_test.exs | 17 ++++++++++++ 3 files changed, 44 insertions(+) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index de23b9a22..972330f4e 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -7,9 +7,35 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Chat alias Pleroma.Object alias Pleroma.Repo + alias Pleroma.User + alias Pleroma.Web.CommonAPI import Ecto.Query + # TODO + # - Oauth stuff + # - Views / Representers + # - Error handling + + def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ + "id" => id, + "content" => content + }) 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, content), + message <- Object.normalize(activity) do + represented_message = %{ + actor: message.data["actor"], + id: message.id, + content: message.data["content"] + } + + conn + |> json(represented_message) + end + end + def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id}) do with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do messages = diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 368e77d3e..ce69725dc 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -290,6 +290,7 @@ defmodule Pleroma.Web.Router do post("/chats/by-ap-id/:ap_id", ChatController, :create) get("/chats", ChatController, :index) get("/chats/:id/messages", ChatController, :messages) + post("/chats/:id/messages", ChatController, :post_chat_message) end scope [] do diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 6b2db5064..b4230e5ad 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -9,6 +9,23 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do import Pleroma.Factory + describe "POST /api/v1/pleroma/chats/:id/messages" do + test "it posts a message to the chat", %{conn: conn} do + user = insert(:user) + other_user = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + result = + conn + |> assign(:user, user) + |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"}) + |> json_response(200) + + assert result["content"] == "Hallo!!" + end + end + describe "GET /api/v1/pleroma/chats/:id/messages" do # TODO # - Test that statuses don't show From 64c78581fe397b6d9356c52cf3f43becd2ff3b4e Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 10 Apr 2020 14:47:56 +0200 Subject: [PATCH 019/492] Chat: Only create them for valid users for now. --- lib/pleroma/chat.ex | 7 +++++++ test/chat_test.exs | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 2475019d1..c2044881f 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -26,6 +26,13 @@ defmodule Pleroma.Chat do def creation_cng(struct, params) do struct |> cast(params, [:user_id, :recipient, :unread]) + |> validate_change(:recipient, fn + :recipient, recipient -> + case User.get_cached_by_ap_id(recipient) do + nil -> [recipient: "must a an existing user"] + _ -> [] + end + end) |> validate_required([:user_id, :recipient]) |> unique_constraint(:user_id, name: :chats_user_id_recipient_index) end diff --git a/test/chat_test.exs b/test/chat_test.exs index bb2b46d51..952598c87 100644 --- a/test/chat_test.exs +++ b/test/chat_test.exs @@ -10,6 +10,13 @@ defmodule Pleroma.ChatTest do 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) From 6ace22b56a3ced833bd990de5715048d6bd32f80 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 15 Apr 2020 18:23:16 +0200 Subject: [PATCH 020/492] Chat: Add views, don't return them in timeline queries. --- lib/pleroma/web/activity_pub/activity_pub.ex | 13 +++ .../web/api_spec/operations/chat_operation.ex | 81 +++++++++++++++++++ lib/pleroma/web/common_api/common_api.ex | 2 +- .../controllers/chat_controller.ex | 47 +++-------- .../pleroma_api/views/chat_message_view.ex | 28 +++++++ .../web/pleroma_api/views/chat_view.ex | 21 +++++ .../controllers/timeline_controller_test.exs | 3 + .../controllers/chat_controller_test.exs | 8 +- .../views/chat_message_view_test.exs | 42 ++++++++++ 9 files changed, 207 insertions(+), 38 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/chat_operation.ex create mode 100644 lib/pleroma/web/pleroma_api/views/chat_message_view.ex create mode 100644 lib/pleroma/web/pleroma_api/views/chat_view.ex create mode 100644 test/web/pleroma_api/views/chat_message_view_test.exs diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 4a56beb73..b6ba91052 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1207,6 +1207,18 @@ defp exclude_poll_votes(query, _) do end end + 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_id(query, %{"exclude_id" => id}) when is_binary(id) do from(activity in query, where: activity.id != ^id) end @@ -1312,6 +1324,7 @@ def fetch_activities_query(recipients, opts \\ %{}) do |> restrict_instance(opts) |> Activity.restrict_deactivated_users() |> exclude_poll_votes(opts) + |> exclude_chat_messages(opts) |> exclude_visibility(opts) 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..038ebb29d --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -0,0 +1,81 @@ +# 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 + + @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 create_operation do + %Operation{ + tags: ["chat"], + summary: "Create a chat", + responses: %{ + 200 => + Operation.response("Chat", "application/json", %Schema{ + type: :object, + description: "A created chat is returned", + properties: %{ + id: %Schema{type: :integer} + } + }) + } + } + end + + def index_operation do + %Operation{ + tags: ["chat"], + summary: "Get a list of chats that you participated in", + responses: %{ + 200 => + Operation.response("Chats", "application/json", %Schema{ + type: :array, + description: "A list of chats", + items: %Schema{ + type: :object, + description: "A chat" + } + }) + } + } + end + + def messages_operation do + %Operation{ + tags: ["chat"], + summary: "Get the most recent messages of the chat", + responses: %{ + 200 => + Operation.response("Messages", "application/json", %Schema{ + type: :array, + description: "A list of chat messages", + items: %Schema{ + type: :object, + description: "A chat message" + } + }) + } + } + end + + def post_chat_message_operation do + %Operation{ + tags: ["chat"], + summary: "Post a message to the chat", + responses: %{ + 200 => + Operation.response("Message", "application/json", %Schema{ + type: :object, + description: "A chat message" + }) + } + } + end +end diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 2f13daf0c..c306c1e96 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -24,7 +24,7 @@ defmodule Pleroma.Web.CommonAPI do require Pleroma.Constants require Logger - def post_chat_message(user, recipient, content) do + def post_chat_message(%User{} = user, %User{} = recipient, content) do transaction = Repo.transaction(fn -> with {_, {:ok, chat_message_data, _meta}} <- diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 972330f4e..5ec546847 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -9,6 +9,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.CommonAPI + alias Pleroma.Web.PleromaAPI.ChatView + alias Pleroma.Web.PleromaAPI.ChatMessageView import Ecto.Query @@ -17,6 +19,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do # - Views / Representers # - Error handling + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation + def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ "id" => id, "content" => content @@ -25,14 +29,9 @@ def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ %User{} = recipient <- User.get_cached_by_ap_id(chat.recipient), {:ok, activity} <- CommonAPI.post_chat_message(user, recipient, content), message <- Object.normalize(activity) do - represented_message = %{ - actor: message.data["actor"], - id: message.id, - content: message.data["content"] - } - conn - |> json(represented_message) + |> put_view(ChatMessageView) + |> render("show.json", for: user, object: message, chat: chat) end end @@ -60,18 +59,9 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id}) d ) |> Repo.all() - represented_messages = - messages - |> Enum.map(fn message -> - %{ - actor: message.data["actor"], - id: message.id, - content: message.data["content"] - } - end) - conn - |> json(represented_messages) + |> put_view(ChatMessageView) + |> render("index.json", for: user, objects: messages, chat: chat) end end @@ -83,31 +73,18 @@ def index(%{assigns: %{user: %{id: user_id}}} = conn, _params) do ) |> Repo.all() - represented_chats = - Enum.map(chats, fn chat -> - %{ - id: chat.id, - recipient: chat.recipient, - unread: chat.unread - } - end) - conn - |> json(represented_chats) + |> put_view(ChatView) + |> render("index.json", chats: chats) end def create(%{assigns: %{user: user}} = conn, params) do recipient = params["ap_id"] |> URI.decode_www_form() with {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do - represented_chat = %{ - id: chat.id, - recipient: chat.recipient, - unread: chat.unread - } - conn - |> json(represented_chat) + |> put_view(ChatView) + |> render("show.json", chat: chat) end end end diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex new file mode 100644 index 000000000..2df591358 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex @@ -0,0 +1,28 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.PleromaAPI.ChatMessageView do + use Pleroma.Web, :view + + alias Pleroma.Chat + + def render( + "show.json", + %{ + object: %{id: id, data: %{"type" => "ChatMessage"} = chat_message}, + chat: %Chat{id: chat_id} + } + ) do + %{ + id: id, + content: chat_message["content"], + chat_id: chat_id, + actor: chat_message["actor"] + } + end + + def render("index.json", opts) do + render_many(opts[:objects], __MODULE__, "show.json", Map.put(opts, :as, :object)) + 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..ee48385bf --- /dev/null +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -0,0 +1,21 @@ +# 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 + + def render("show.json", %{chat: %Chat{} = chat}) do + %{ + id: chat.id, + recipient: chat.recipient, + unread: chat.unread + } + end + + def render("index.json", %{chats: chats}) do + render_many(chats, __MODULE__, "show.json") + end +end diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 06efdc901..a5c227991 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -51,6 +51,9 @@ test "the home timeline", %{user: user, conn: conn} do {:ok, activity} = CommonAPI.post(third_user, %{"status" => "repeated post"}) {:ok, _, _} = CommonAPI.repeat(activity.id, following) + # This one should not show up in the TL + {:ok, _activity} = CommonAPI.post_chat_message(third_user, user, ":gun:") + ret_conn = get(conn, uri) assert Enum.empty?(json_response(ret_conn, :ok)) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index b4230e5ad..dad37a889 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -23,14 +23,13 @@ test "it posts a message to the chat", %{conn: conn} do |> json_response(200) assert result["content"] == "Hallo!!" + assert result["chat_id"] == chat.id end end describe "GET /api/v1/pleroma/chats/:id/messages" do # TODO - # - Test that statuses don't show # - Test the case where it's not the user's chat - # - Test the returned data test "it returns the messages for a given chat", %{conn: conn} do user = insert(:user) other_user = insert(:user) @@ -49,6 +48,11 @@ test "it returns the messages for a given chat", %{conn: conn} do |> get("/api/v1/pleroma/chats/#{chat.id}/messages") |> json_response(200) + result + |> Enum.each(fn message -> + assert message["chat_id"] == chat.id + end) + assert length(result) == 3 end end diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_view_test.exs new file mode 100644 index 000000000..e690da022 --- /dev/null +++ b/test/web/pleroma_api/views/chat_message_view_test.exs @@ -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.PleromaAPI.ChatMessageViewTest do + use Pleroma.DataCase + + alias Pleroma.Chat + alias Pleroma.Object + alias Pleroma.Web.CommonAPI + alias Pleroma.Web.PleromaAPI.ChatMessageView + + import Pleroma.Factory + + test "it displays a chat message" do + user = insert(:user) + recipient = insert(:user) + {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "kippis") + + chat = Chat.get(user.id, recipient.ap_id) + + object = Object.normalize(activity) + + chat_message = ChatMessageView.render("show.json", object: object, for: user, chat: chat) + + assert chat_message[:id] == object.id + assert chat_message[:content] == "kippis" + assert chat_message[:actor] == user.ap_id + assert chat_message[:chat_id] + + {:ok, activity} = CommonAPI.post_chat_message(recipient, user, "gkgkgk") + + object = Object.normalize(activity) + + chat_message_two = ChatMessageView.render("show.json", object: object, for: user, chat: chat) + + assert chat_message_two[:id] == object.id + assert chat_message_two[:content] == "gkgkgk" + assert chat_message_two[:actor] == recipient.ap_id + assert chat_message_two[:chat_id] == chat_message[:chat_id] + end +end From 3d4eca5dd4be297f03c244497d78db03e82a9d81 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 16 Apr 2020 12:56:29 +0200 Subject: [PATCH 021/492] CommonAPI: Escape HTML for chat messages. --- lib/pleroma/web/common_api/common_api.ex | 8 +++++++- test/web/common_api/common_api_test.exs | 11 +++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index c306c1e96..2c25850db 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -17,6 +17,7 @@ defmodule Pleroma.Web.CommonAPI do alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Formatter import Pleroma.Web.Gettext import Pleroma.Web.CommonAPI.Utils @@ -28,7 +29,12 @@ def post_chat_message(%User{} = user, %User{} = recipient, content) do transaction = Repo.transaction(fn -> with {_, {:ok, chat_message_data, _meta}} <- - {:build_object, Builder.chat_message(user, recipient.ap_id, content)}, + {:build_object, + Builder.chat_message( + user, + recipient.ap_id, + content |> Formatter.html_escape("text/plain") + )}, {_, {:ok, chat_message_object}} <- {:create_object, Object.create(chat_message_data)}, {_, {:ok, create_activity_data, _meta}} <- diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 168721c81..abe3e6f8d 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -27,7 +27,12 @@ test "it posts a chat message" do author = insert(:user) recipient = insert(:user) - {:ok, activity} = CommonAPI.post_chat_message(author, recipient, "a test message") + {:ok, activity} = + CommonAPI.post_chat_message( + author, + recipient, + "a test message " + ) assert activity.data["type"] == "Create" assert activity.local @@ -35,7 +40,9 @@ test "it posts a chat message" do assert object.data["type"] == "ChatMessage" assert object.data["to"] == [recipient.ap_id] - assert object.data["content"] == "a test message" + + assert object.data["content"] == + "a test message <script>alert('uuu')</script>" assert Chat.get(author.id, recipient.ap_id) assert Chat.get(recipient.id, author.ap_id) From e2ced0491770d6260fe51d5144b81200fd97f268 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 16 Apr 2020 15:21:47 +0200 Subject: [PATCH 022/492] ChatMessages: Better validation. --- .../web/activity_pub/object_validator.ex | 6 ++- .../chat_message_validator.ex | 26 ++++++++++ .../object_validators/common_validations.ex | 6 ++- .../create_chat_message_validator.ex | 5 ++ .../transmogrifier/chat_message_handling.ex | 3 ++ test/fixtures/create-chat-message.json | 2 +- .../activity_pub/object_validator_test.exs | 52 +++++++++++++++++++ .../transmogrifier/chat_message_test.exs | 34 +++++++++++- 8 files changed, 128 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 49cc72561..259bbeb64 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -31,7 +31,8 @@ def validate(%{"type" => "Like"} = object, meta) do def validate(%{"type" => "ChatMessage"} = object, meta) do with {:ok, object} <- object - |> ChatMessageValidator.cast_and_apply() do + |> ChatMessageValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do object = stringify_keys(object) {:ok, object, meta} end @@ -40,7 +41,8 @@ def validate(%{"type" => "ChatMessage"} = object, meta) do def validate(%{"type" => "Create"} = object, meta) do with {:ok, object} <- object - |> CreateChatMessageValidator.cast_and_apply() do + |> CreateChatMessageValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do object = stringify_keys(object) {:ok, object, meta} 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 index ab5be3596..a4e4460cd 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do use Ecto.Schema alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.User import Ecto.Changeset @@ -54,5 +55,30 @@ def validate_data(data_cng) do data_cng |> validate_inclusion(:type, ["ChatMessage"]) |> validate_required([:id, :actor, :to, :type, :content]) + |> validate_length(:to, is: 1) + |> validate_local_concern() + end + + @doc "Validates if at least one of the users in this ChatMessage is a local user, otherwise we don't want the message in our system. It also validates the presence of both users in our system." + 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())}, + {_, true} <- {:local?, Enum.any?([actor, recipient], & &1.local)} do + cng + else + {: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/common_validations.ex b/lib/pleroma/web/activity_pub/object_validators/common_validations.ex index b479c3918..02f3a6438 100644 --- a/lib/pleroma/web/activity_pub/object_validators/common_validations.ex +++ b/lib/pleroma/web/activity_pub/object_validators/common_validations.ex @@ -8,7 +8,11 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations do alias Pleroma.Object alias Pleroma.User - def validate_actor_presence(cng, field_name \\ :actor) do + def validate_actor_presence(cng) do + validate_user_presence(cng, :actor) + end + + def validate_user_presence(cng, field_name) do cng |> validate_change(field_name, fn field_name, actor -> if User.get_cached_by_ap_id(actor) do 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 index 659311480..ce52d5623 100644 --- 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 @@ -32,4 +32,9 @@ def cast_and_apply(data) do def cast_data(data) do cast(%__MODULE__{}, data, __schema__(:fields)) end + + # No validation yet + def cast_and_validate(data) do + cast_data(data) + end end diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex index b5843736f..815b866c9 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex @@ -25,6 +25,9 @@ def handle_incoming( {_, {:ok, activity, _meta}} <- {:common_pipeline, Pipeline.common_pipeline(cast_data, local: false)} do {:ok, activity} + else + e -> + {:error, e} end end end diff --git a/test/fixtures/create-chat-message.json b/test/fixtures/create-chat-message.json index 4aa17f4a5..2e4608f43 100644 --- a/test/fixtures/create-chat-message.json +++ b/test/fixtures/create-chat-message.json @@ -3,7 +3,7 @@ "id": "http://2hu.gensokyo/objects/1", "object": { "attributedTo": "http://2hu.gensokyo/users/raymoo", - "content": "You expected a cute girl? Too bad.", + "content": "You expected a cute girl? Too bad. ", "id": "http://2hu.gensokyo/objects/2", "published": "2020-02-12T14:08:20Z", "to": [ diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 3c5c3696e..bf0bfdfaf 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -5,9 +5,61 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI + alias Pleroma.Web.ActivityPub.Builder import Pleroma.Factory + describe "chat messages" do + setup do + user = insert(:user) + recipient = insert(:user, local: false) + + {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey") + + %{user: user, recipient: recipient, valid_chat_message: valid_chat_message} + 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, []) + 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 "likes" do setup do user = insert(:user) diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index aed62c520..5b238f9c4 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -12,13 +12,43 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageTest do alias Pleroma.Web.ActivityPub.Transmogrifier describe "handle_incoming" do - test "it insert it" do + 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) + _recipient = insert(:user, ap_id: List.first(data["to"]), local: true) + + {: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) + _recipient = insert(:user, ap_id: List.first(data["to"]), local: false) + + {:error, _} = 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) - recipient = insert(:user, ap_id: List.first(data["to"]), local: false) + recipient = insert(:user, ap_id: List.first(data["to"]), local: true) {:ok, %Activity{} = activity} = Transmogrifier.handle_incoming(data) From ca598e9c27a7a66b014523845e62046d19364f2f Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 16 Apr 2020 15:27:35 +0200 Subject: [PATCH 023/492] AccountView: Return user ap_id. --- lib/pleroma/web/mastodon_api/views/account_view.ex | 1 + test/web/mastodon_api/views/account_view_test.exs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 8fb96a22a..f20453744 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -234,6 +234,7 @@ defp do_render("show.json", %{user: user} = opts) do # Pleroma extension pleroma: %{ + ap_id: user.ap_id, confirmation_pending: user.confirmation_pending, tags: user.tags, hide_followers_count: user.hide_followers_count, diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 4435f69ff..2be0d8d0f 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -82,6 +82,7 @@ test "Represent a user account" do fields: [] }, pleroma: %{ + ap_id: user.ap_id, background_image: "https://example.com/images/asuka_hospital.png", confirmation_pending: false, tags: [], @@ -152,6 +153,7 @@ test "Represent a Service(bot) account" do fields: [] }, pleroma: %{ + ap_id: user.ap_id, background_image: nil, confirmation_pending: false, tags: [], @@ -351,6 +353,7 @@ test "represent an embedded relationship" do fields: [] }, pleroma: %{ + ap_id: user.ap_id, background_image: nil, confirmation_pending: false, tags: [], From e983f708846a5784e23b7e18734a61ed7f6e3636 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 16 Apr 2020 17:50:24 +0200 Subject: [PATCH 024/492] ChatMessagesHandling: Strip HTML of incoming messages. --- .../web/activity_pub/transmogrifier/chat_message_handling.ex | 3 +++ test/web/activity_pub/transmogrifier/chat_message_test.exs | 2 ++ 2 files changed, 5 insertions(+) diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex index 815b866c9..11bd10456 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex @@ -19,6 +19,9 @@ def handle_incoming( {_, {:ok, object_cast_data_sym}} <- {:casting_object_data, object_data |> ChatMessageValidator.cast_and_apply()}, object_cast_data = ObjectValidator.stringify_keys(object_cast_data_sym), + # For now, just strip HTML + stripped_content = Pleroma.HTML.strip_tags(object_cast_data["content"]), + object_cast_data = object_cast_data |> Map.put("content", stripped_content), {_, {:ok, validated_object, _meta}} <- {:validate_object, ObjectValidator.validate(object_cast_data, %{})}, {_, {:ok, _created_object}} <- {:persist_object, Object.create(validated_object)}, diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index 5b238f9c4..7e7f9ebec 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -56,7 +56,9 @@ test "it inserts it and creates a chat" do 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')" end end end From f8c3ae7a627817789776f11497041445bb273c19 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 16 Apr 2020 18:43:31 +0200 Subject: [PATCH 025/492] ChatController: Handle pagination. --- .../controllers/chat_controller.ex | 12 ++-- .../pleroma_api/views/chat_message_view.ex | 4 +- .../web/pleroma_api/views/chat_view.ex | 2 +- .../controllers/chat_controller_test.exs | 62 ++++++++++++++++++- 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 5ec546847..8cf8d82e4 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -11,6 +11,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Web.CommonAPI alias Pleroma.Web.PleromaAPI.ChatView alias Pleroma.Web.PleromaAPI.ChatMessageView + alias Pleroma.Pagination import Ecto.Query @@ -35,7 +36,7 @@ def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ end end - def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id}) do + 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 messages = from(o in Object, @@ -54,10 +55,9 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id}) d ^chat.recipient, o.data, ^[user.ap_id] - ), - order_by: [desc: o.id] + ) ) - |> Repo.all() + |> Pagination.fetch_paginated(params) conn |> put_view(ChatMessageView) @@ -65,13 +65,13 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id}) d end end - def index(%{assigns: %{user: %{id: user_id}}} = conn, _params) do + def index(%{assigns: %{user: %{id: user_id}}} = conn, params) do chats = from(c in Chat, where: c.user_id == ^user_id, order_by: [desc: c.updated_at] ) - |> Repo.all() + |> Pagination.fetch_paginated(params) conn |> put_view(ChatView) diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex index 2df591358..fdbb9ff1b 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex @@ -15,9 +15,9 @@ def render( } ) do %{ - id: id, + id: id |> to_string(), content: chat_message["content"], - chat_id: chat_id, + chat_id: chat_id |> to_string(), actor: chat_message["actor"] } end diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index ee48385bf..7b8c6450a 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do def render("show.json", %{chat: %Chat{} = chat}) do %{ - id: chat.id, + id: chat.id |> to_string(), recipient: chat.recipient, unread: chat.unread } diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index dad37a889..f30fd6615 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -23,11 +23,38 @@ test "it posts a message to the chat", %{conn: conn} do |> json_response(200) assert result["content"] == "Hallo!!" - assert result["chat_id"] == chat.id + assert result["chat_id"] == chat.id |> to_string() end end describe "GET /api/v1/pleroma/chats/:id/messages" do + test "it paginates", %{conn: conn} do + user = insert(:user) + 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 + |> assign(:user, user) + |> get("/api/v1/pleroma/chats/#{chat.id}/messages") + |> json_response(200) + + assert length(result) == 20 + + result = + conn + |> assign(:user, user) + |> get("/api/v1/pleroma/chats/#{chat.id}/messages", %{"max_id" => List.last(result)["id"]}) + |> json_response(200) + + assert length(result) == 10 + end + # TODO # - Test the case where it's not the user's chat test "it returns the messages for a given chat", %{conn: conn} do @@ -50,7 +77,7 @@ test "it returns the messages for a given chat", %{conn: conn} do result |> Enum.each(fn message -> - assert message["chat_id"] == chat.id + assert message["chat_id"] == chat.id |> to_string() end) assert length(result) == 3 @@ -73,6 +100,31 @@ test "it creates or returns a chat", %{conn: conn} do end describe "GET /api/v1/pleroma/chats" do + test "it paginates", %{conn: conn} do + user = insert(:user) + + Enum.each(1..30, fn _ -> + recipient = insert(:user) + {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id) + end) + + result = + conn + |> assign(:user, user) + |> get("/api/v1/pleroma/chats") + |> json_response(200) + + assert length(result) == 20 + + result = + conn + |> assign(:user, user) + |> get("/api/v1/pleroma/chats", %{max_id: List.last(result)["id"]}) + |> json_response(200) + + assert length(result) == 10 + end + test "it return a list of chats the current user is participating in, in descending order of updates", %{conn: conn} do user = insert(:user) @@ -98,7 +150,11 @@ test "it return a list of chats the current user is participating in, in descend ids = Enum.map(result, & &1["id"]) - assert ids == [chat_2.id, chat_3.id, chat_1.id] + assert ids == [ + chat_2.id |> to_string(), + chat_3.id |> to_string(), + chat_1.id |> to_string() + ] end end end From d45ae6485811189e98f774ecdb46f0ccdfa8b2b3 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 17 Apr 2020 13:04:46 +0200 Subject: [PATCH 026/492] ChatController: Use OAuth scopes. --- .../controllers/chat_controller.ex | 18 +++++++- .../controllers/chat_controller_test.exs | 41 +++++++++---------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 8cf8d82e4..31c723426 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User + alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Web.CommonAPI alias Pleroma.Web.PleromaAPI.ChatView alias Pleroma.Web.PleromaAPI.ChatMessageView @@ -16,10 +17,18 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do import Ecto.Query # TODO - # - Oauth stuff - # - Views / Representers # - Error handling + plug( + OAuthScopesPlug, + %{scopes: ["write:statuses"]} when action in [:post_chat_message, :create] + ) + + plug( + OAuthScopesPlug, + %{scopes: ["read:statuses"]} when action in [:messages, :index] + ) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ @@ -62,6 +71,11 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id} = conn |> put_view(ChatMessageView) |> render("index.json", for: user, objects: messages, chat: chat) + else + _ -> + conn + |> put_status(:not_found) + |> json(%{error: "not found"}) end end diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index f30fd6615..0750c7273 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -10,15 +10,15 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do import Pleroma.Factory describe "POST /api/v1/pleroma/chats/:id/messages" do - test "it posts a message to the chat", %{conn: conn} do - user = insert(:user) + setup do: oauth_access(["write:statuses"]) + + 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 - |> assign(:user, user) |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"}) |> json_response(200) @@ -28,8 +28,9 @@ test "it posts a message to the chat", %{conn: conn} do end describe "GET /api/v1/pleroma/chats/:id/messages" do - test "it paginates", %{conn: conn} do - user = insert(:user) + setup do: oauth_access(["read:statuses"]) + + test "it paginates", %{conn: conn, user: user} do recipient = insert(:user) Enum.each(1..30, fn _ -> @@ -40,7 +41,6 @@ test "it paginates", %{conn: conn} do result = conn - |> assign(:user, user) |> get("/api/v1/pleroma/chats/#{chat.id}/messages") |> json_response(200) @@ -48,17 +48,13 @@ test "it paginates", %{conn: conn} do result = conn - |> assign(:user, user) |> get("/api/v1/pleroma/chats/#{chat.id}/messages", %{"max_id" => List.last(result)["id"]}) |> json_response(200) assert length(result) == 10 end - # TODO - # - Test the case where it's not the user's chat - test "it returns the messages for a given chat", %{conn: conn} do - user = insert(:user) + test "it returns the messages for a given chat", %{conn: conn, user: user} do other_user = insert(:user) third_user = insert(:user) @@ -71,7 +67,6 @@ test "it returns the messages for a given chat", %{conn: conn} do result = conn - |> assign(:user, user) |> get("/api/v1/pleroma/chats/#{chat.id}/messages") |> json_response(200) @@ -81,17 +76,25 @@ test "it returns the messages for a given chat", %{conn: conn} do 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-ap-id/:id" do + setup do: oauth_access(["write:statuses"]) + test "it creates or returns a chat", %{conn: conn} do - user = insert(:user) other_user = insert(:user) result = conn - |> assign(:user, user) |> post("/api/v1/pleroma/chats/by-ap-id/#{URI.encode_www_form(other_user.ap_id)}") |> json_response(200) @@ -100,9 +103,9 @@ test "it creates or returns a chat", %{conn: conn} do end describe "GET /api/v1/pleroma/chats" do - test "it paginates", %{conn: conn} do - user = insert(:user) + setup do: oauth_access(["read:statuses"]) + test "it paginates", %{conn: conn, user: user} do Enum.each(1..30, fn _ -> recipient = insert(:user) {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id) @@ -110,7 +113,6 @@ test "it paginates", %{conn: conn} do result = conn - |> assign(:user, user) |> get("/api/v1/pleroma/chats") |> json_response(200) @@ -118,7 +120,6 @@ test "it paginates", %{conn: conn} do result = conn - |> assign(:user, user) |> get("/api/v1/pleroma/chats", %{max_id: List.last(result)["id"]}) |> json_response(200) @@ -126,8 +127,7 @@ test "it paginates", %{conn: conn} do end test "it return a list of chats the current user is participating in, in descending order of updates", - %{conn: conn} do - user = insert(:user) + %{conn: conn, user: user} do har = insert(:user) jafnhar = insert(:user) tridi = insert(:user) @@ -144,7 +144,6 @@ test "it return a list of chats the current user is participating in, in descend result = conn - |> assign(:user, user) |> get("/api/v1/pleroma/chats") |> json_response(200) From 372614cfd3119b589c9c47619445714e8ae6c07e Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 17 Apr 2020 14:23:59 +0200 Subject: [PATCH 027/492] ChatView: Add a mastodon api representation of the recipient. --- .../transmogrifier/chat_message_handling.ex | 1 + .../web/pleroma_api/views/chat_view.ex | 7 ++++- .../transmogrifier/chat_message_test.exs | 19 ++++++++++++ test/web/pleroma_api/views/chat_view_test.exs | 29 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 test/web/pleroma_api/views/chat_view_test.exs diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex index 11bd10456..cfe3b767b 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex @@ -22,6 +22,7 @@ def handle_incoming( # For now, just strip HTML stripped_content = Pleroma.HTML.strip_tags(object_cast_data["content"]), object_cast_data = object_cast_data |> Map.put("content", stripped_content), + {_, true} <- {:to_fields_match, cast_data["to"] == object_cast_data["to"]}, {_, {:ok, validated_object, _meta}} <- {:validate_object, ObjectValidator.validate(object_cast_data, %{})}, {_, {:ok, _created_object}} <- {:persist_object, Object.create(validated_object)}, diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index 7b8c6450a..1e9ef4356 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -6,11 +6,16 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do use Pleroma.Web, :view alias Pleroma.Chat + alias Pleroma.User + alias Pleroma.Web.MastodonAPI.AccountView + + def render("show.json", %{chat: %Chat{} = chat} = opts) do + recipient = User.get_cached_by_ap_id(chat.recipient) - def render("show.json", %{chat: %Chat{} = chat}) do %{ id: chat.id |> to_string(), recipient: chat.recipient, + recipient_account: AccountView.render("show.json", Map.put(opts, :user, recipient)), unread: chat.unread } end diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index 7e7f9ebec..4d6f24609 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -8,6 +8,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageTest do import Pleroma.Factory alias Pleroma.Activity + alias Pleroma.Chat alias Pleroma.Object alias Pleroma.Web.ActivityPub.Transmogrifier @@ -42,6 +43,21 @@ test "it rejects messages that don't concern local users" do {: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) + + {:error, _} = Transmogrifier.handle_incoming(data) + end + test "it inserts it and creates a chat" do data = File.read!("test/fixtures/create-chat-message.json") @@ -59,6 +75,9 @@ test "it inserts it and creates a chat" do assert object assert object.data["content"] == "You expected a cute girl? Too bad. alert('XSS')" + + refute Chat.get(author.id, recipient.ap_id) + assert Chat.get(recipient.id, author.ap_id) end 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..1eb0c6241 --- /dev/null +++ b/test/web/pleroma_api/views/chat_view_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.Web.PleromaAPI.ChatMessageViewTest do + use Pleroma.DataCase + + alias Pleroma.Chat + alias Pleroma.Web.PleromaAPI.ChatView + alias Pleroma.Web.MastodonAPI.AccountView + + 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}", + recipient: recipient.ap_id, + recipient_account: AccountView.render("show.json", user: recipient), + unread: 0 + } + end +end From c8458209110ef65101f965e460329308e5843559 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 17 Apr 2020 16:55:01 +0200 Subject: [PATCH 028/492] Notifications: Create a chat notification. --- lib/pleroma/web/activity_pub/side_effects.ex | 2 ++ .../mastodon_api/views/notification_view.ex | 30 ++++++++++++++++++- test/web/activity_pub/side_effects_test.exs | 19 ++++++++++++ .../views/notification_view_test.exs | 26 ++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 594f32700..f32a99ec4 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -28,6 +28,8 @@ def handle(%{data: %{"type" => "Create", "object" => object_id}} = activity, met {:ok, _object} = handle_object_creation(object) + Notification.create_notifications(activity) + {:ok, activity, meta} end diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 734ffbf39..5d231f0c4 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -8,11 +8,13 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do alias Pleroma.Activity alias Pleroma.Notification alias Pleroma.User + alias Pleroma.Object 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.ChatMessageView def render("index.json", %{notifications: notifications, for: reading_user} = opts) do activities = Enum.map(notifications, & &1.activity) @@ -81,7 +83,20 @@ def render( end end - mastodon_type = Activity.mastodon_notification_type(activity) + # This returns the notification type by activity, but both chats and statuses are in "Create" activities. + mastodon_type = + case Activity.mastodon_notification_type(activity) do + "mention" -> + object = Object.normalize(activity) + + case object do + %{data: %{"type" => "ChatMessage"}} -> "pleroma:chat_mention" + _ -> "mention" + end + + type -> + type + end render_opts = %{ relationships: opts[:relationships], @@ -125,6 +140,9 @@ def render( |> put_status(parent_activity_fn.(), reading_user, render_opts) |> put_emoji(activity) + "pleroma:chat_mention" -> + put_chat_message(response, activity, reading_user, render_opts) + _ -> nil end @@ -137,6 +155,16 @@ defp put_emoji(response, activity) 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) + render_opts = Map.merge(opts, %{object: object, for: reading_user, chat: chat}) + chat_message_render = ChatMessageView.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/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index b629d0d5d..d3ad4866c 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -6,7 +6,9 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do use Pleroma.DataCase alias Pleroma.Chat + alias Pleroma.Notification alias Pleroma.Object + alias Pleroma.Repo alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.SideEffects @@ -34,6 +36,23 @@ test "add the like to the original object", %{like: like, user: user} do 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, chat_message_object} = Object.create(chat_message_data) + + {:ok, create_activity_data, _meta} = + Builder.create(author, chat_message_object.data["id"], [recipient.ap_id]) + + {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) + + {:ok, _create_activity, _meta} = SideEffects.handle(create_activity) + + assert Repo.get_by(Notification, user_id: recipient.id, activity_id: create_activity.id) + 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) diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index c3ec9dfec..a48c298f2 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -6,7 +6,9 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do use Pleroma.DataCase alias Pleroma.Activity + alias Pleroma.Chat alias Pleroma.Notification + alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.CommonAPI @@ -14,6 +16,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.ChatMessageView import Pleroma.Factory defp test_notifications_rendering(notifications, user, expected_result) do @@ -31,6 +34,29 @@ defp test_notifications_rendering(notifications, user, expected_result) 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) + + expected = %{ + id: to_string(notification.id), + pleroma: %{is_seen: false}, + type: "pleroma:chat_mention", + account: AccountView.render("show.json", %{user: user, for: recipient}), + chat_message: + ChatMessageView.render("show.json", %{object: object, for: recipient, chat: chat}), + 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) From ce23673ca1539350802326c62d6e72bd040950f6 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 20 Apr 2020 11:45:11 +0200 Subject: [PATCH 029/492] ChatMessageValidator: Don't validate messages that are too long. --- .../object_validators/chat_message_validator.ex | 1 + test/web/activity_pub/object_validator_test.exs | 8 ++++++++ 2 files changed, 9 insertions(+) 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 index a4e4460cd..caf2138a7 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -56,6 +56,7 @@ def validate_data(data_cng) do |> validate_inclusion(:type, ["ChatMessage"]) |> validate_required([:id, :actor, :to, :type, :content]) |> validate_length(:to, is: 1) + |> validate_length(:content, max: Pleroma.Config.get([:instance, :remote_limit])) |> validate_local_concern() end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index bf0bfdfaf..e416e0808 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do describe "chat messages" do setup do + clear_config([:instance, :remote_limit]) user = insert(:user) recipient = insert(:user, local: false) @@ -23,6 +24,13 @@ test "validates for a basic object we build", %{valid_chat_message: valid_chat_m assert {:ok, _object, _meta} = ObjectValidator.validate(valid_chat_message, []) 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 actor or the recipient is not in our system", %{ valid_chat_message: valid_chat_message } do From 5b6818b3e5dc39e328f6f8d4b8f4587e5e1cef94 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 20 Apr 2020 12:08:47 +0200 Subject: [PATCH 030/492] CommonAPI: Obey local limit for chat messages. --- lib/pleroma/web/common_api/common_api.ex | 8 +++++++- test/web/common_api/common_api_test.exs | 18 ++++++++++++++++++ .../views/chat_message_view_test.exs | 4 ++-- test/web/pleroma_api/views/chat_view_test.exs | 2 +- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 2b8add2fa..fcb0af4e8 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -28,7 +28,10 @@ defmodule Pleroma.Web.CommonAPI do def post_chat_message(%User{} = user, %User{} = recipient, content) do transaction = Repo.transaction(fn -> - with {_, {:ok, chat_message_data, _meta}} <- + with {_, true} <- + {:content_length, + String.length(content) <= Pleroma.Config.get([:instance, :chat_limit])}, + {_, {:ok, chat_message_data, _meta}} <- {:build_object, Builder.chat_message( user, @@ -43,6 +46,9 @@ def post_chat_message(%User{} = user, %User{} = recipient, content) do {_, {:ok, %Activity{} = activity, _meta}} <- {:common_pipeline, Pipeline.common_pipeline(create_activity_data, local: true)} do {:ok, activity} + else + {:content_length, false} -> {:error, :content_too_long} + e -> e end end) diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 1984aac8d..c17e30210 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -23,6 +23,8 @@ defmodule Pleroma.Web.CommonAPITest do setup do: clear_config([:instance, :max_pinned_statuses]) describe "posting chat messages" do + setup do: clear_config([:instance, :chat_limit]) + test "it posts a chat message" do author = insert(:user) recipient = insert(:user) @@ -47,6 +49,22 @@ test "it posts a chat message" do assert Chat.get(author.id, recipient.ap_id) assert Chat.get(recipient.id, author.ap_id) 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 test "when replying to a conversation / participation, it will set the correct context id even if no explicit reply_to is given" do diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_view_test.exs index e690da022..ad8febee6 100644 --- a/test/web/pleroma_api/views/chat_message_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_view_test.exs @@ -23,7 +23,7 @@ test "it displays a chat message" do chat_message = ChatMessageView.render("show.json", object: object, for: user, chat: chat) - assert chat_message[:id] == object.id + assert chat_message[:id] == object.id |> to_string() assert chat_message[:content] == "kippis" assert chat_message[:actor] == user.ap_id assert chat_message[:chat_id] @@ -34,7 +34,7 @@ test "it displays a chat message" do chat_message_two = ChatMessageView.render("show.json", object: object, for: user, chat: chat) - assert chat_message_two[:id] == object.id + assert chat_message_two[:id] == object.id |> to_string() assert chat_message_two[:content] == "gkgkgk" assert chat_message_two[:actor] == recipient.ap_id assert chat_message_two[:chat_id] == chat_message[:chat_id] diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index 1eb0c6241..3dca555e8 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.PleromaAPI.ChatMessageViewTest do +defmodule Pleroma.Web.PleromaAPI.ChatViewTest do use Pleroma.DataCase alias Pleroma.Chat From 970b74383b43aa9a54c3cf59012944355e3eafbc Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 20 Apr 2020 12:29:19 +0200 Subject: [PATCH 031/492] Credo fixes. --- lib/pleroma/chat.ex | 2 +- lib/pleroma/web/activity_pub/object_validator.ex | 2 +- .../object_validators/chat_message_validator.ex | 2 +- lib/pleroma/web/common_api/common_api.ex | 2 +- lib/pleroma/web/mastodon_api/views/notification_view.ex | 5 +++-- lib/pleroma/web/pleroma_api/controllers/chat_controller.ex | 6 +++--- test/web/activity_pub/object_validator_test.exs | 2 +- test/web/pleroma_api/views/chat_view_test.exs | 2 +- 8 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index c2044881f..b8545063a 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -6,8 +6,8 @@ defmodule Pleroma.Chat do use Ecto.Schema import Ecto.Changeset - alias Pleroma.User 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). diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 259bbeb64..03db681ec 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -11,9 +11,9 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Object alias Pleroma.User - alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()} def validate(object, meta) 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 index caf2138a7..6e3477cd1 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -5,8 +5,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do use Ecto.Schema - alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index fcb0af4e8..9e25f4c2f 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.Object alias Pleroma.Repo alias Pleroma.ThreadMute @@ -17,7 +18,6 @@ defmodule Pleroma.Web.CommonAPI do alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility - alias Pleroma.Formatter import Pleroma.Web.Gettext import Pleroma.Web.CommonAPI.Utils diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 5d231f0c4..0b05d178b 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -7,8 +7,8 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do alias Pleroma.Activity alias Pleroma.Notification - alias Pleroma.User alias Pleroma.Object + alias Pleroma.User alias Pleroma.UserRelationship alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.AccountView @@ -83,7 +83,8 @@ def render( end end - # This returns the notification type by activity, but both chats and statuses are in "Create" activities. + # This returns the notification type by activity, but both chats and statuses + # are in "Create" activities. mastodon_type = case Activity.mastodon_notification_type(activity) do "mention" -> diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 31c723426..9d8b9b3cf 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -6,13 +6,13 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Chat alias Pleroma.Object + alias Pleroma.Pagination + alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Repo alias Pleroma.User - alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Web.CommonAPI - alias Pleroma.Web.PleromaAPI.ChatView alias Pleroma.Web.PleromaAPI.ChatMessageView - alias Pleroma.Pagination + alias Pleroma.Web.PleromaAPI.ChatView import Ecto.Query diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index e416e0808..3ac5ecaf4 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -1,11 +1,11 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do use Pleroma.DataCase + alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI - alias Pleroma.Web.ActivityPub.Builder import Pleroma.Factory diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index 3dca555e8..725da5ff8 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -6,8 +6,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do use Pleroma.DataCase alias Pleroma.Chat - alias Pleroma.Web.PleromaAPI.ChatView alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.PleromaAPI.ChatView import Pleroma.Factory From b836d3d104f75841d71f9cf7c5c8cb5c07ba7294 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 20 Apr 2020 13:14:59 +0200 Subject: [PATCH 032/492] ChatMessageValidator: Require `published` field --- lib/pleroma/web/activity_pub/builder.ex | 6 ++++-- .../object_validators/chat_message_validator.ex | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index f0a6c1e1b..b67166a30 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -17,7 +17,8 @@ def create(actor, object_id, recipients) do "actor" => actor.ap_id, "to" => recipients, "object" => object_id, - "type" => "Create" + "type" => "Create", + "published" => DateTime.utc_now() |> DateTime.to_iso8601() }, []} end @@ -28,7 +29,8 @@ def chat_message(actor, recipient, content) do "actor" => actor.ap_id, "type" => "ChatMessage", "to" => [recipient], - "content" => content + "content" => content, + "published" => DateTime.utc_now() |> DateTime.to_iso8601() }, []} 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 index 6e3477cd1..9b8262553 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -54,7 +54,7 @@ def changeset(struct, data) do def validate_data(data_cng) do data_cng |> validate_inclusion(:type, ["ChatMessage"]) - |> validate_required([:id, :actor, :to, :type, :content]) + |> validate_required([:id, :actor, :to, :type, :content, :published]) |> validate_length(:to, is: 1) |> validate_length(:content, max: Pleroma.Config.get([:instance, :remote_limit])) |> validate_local_concern() From 7e53da250e3b41e01073148efea0fc4f49dea9d5 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 20 Apr 2020 14:08:54 +0200 Subject: [PATCH 033/492] ChatMessage: Support emoji. --- lib/pleroma/web/activity_pub/builder.ex | 4 ++- .../chat_message_validator.ex | 1 + test/fixtures/create-chat-message.json | 30 +++++++++---------- .../activity_pub/object_validator_test.exs | 6 ++-- test/web/common_api/common_api_test.exs | 8 +++-- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index b67166a30..7576ed278 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -5,6 +5,7 @@ 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.Utils @@ -30,7 +31,8 @@ def chat_message(actor, recipient, content) do "type" => "ChatMessage", "to" => [recipient], "content" => content, - "published" => DateTime.utc_now() |> DateTime.to_iso8601() + "published" => DateTime.utc_now() |> DateTime.to_iso8601(), + "emoji" => Emoji.Formatter.get_emoji_map(content) }, []} 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 index 9b8262553..2feb65f29 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -20,6 +20,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do field(:content, :string) field(:actor, Types.ObjectID) field(:published, Types.DateTime) + field(:emoji, :map, default: %{}) end def cast_and_apply(data) do diff --git a/test/fixtures/create-chat-message.json b/test/fixtures/create-chat-message.json index 2e4608f43..6db5b9f5c 100644 --- a/test/fixtures/create-chat-message.json +++ b/test/fixtures/create-chat-message.json @@ -1,19 +1,19 @@ { - "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", + "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" + "http://2hu.gensokyo/users/marisa" ], - "type": "Create" + "type": "ChatMessage" + }, + "published": "2018-02-12T14:08:20Z", + "to": [ + "http://2hu.gensokyo/users/marisa" + ], + "type": "Create" } diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 3ac5ecaf4..8230ae0d9 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -15,13 +15,15 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do user = insert(:user) recipient = insert(:user, local: false) - {:ok, valid_chat_message, _} = Builder.chat_message(user, recipient.ap_id, "hey") + {: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 "validates for a basic object we build", %{valid_chat_message: valid_chat_message} do - assert {:ok, _object, _meta} = ObjectValidator.validate(valid_chat_message, []) + assert {:ok, object, _meta} = ObjectValidator.validate(valid_chat_message, []) + + assert object == valid_chat_message end test "does not validate if the message is longer than the remote_limit", %{ diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index c17e30210..86b3648ac 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -33,7 +33,7 @@ test "it posts a chat message" do CommonAPI.post_chat_message( author, recipient, - "a test message " + "a test message :firefox:" ) assert activity.data["type"] == "Create" @@ -44,7 +44,11 @@ test "it posts a chat message" do assert object.data["to"] == [recipient.ap_id] assert object.data["content"] == - "a test message <script>alert('uuu')</script>" + "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) From b5df4a98e4044cf1360f03f7dc3a0b59932ec8f5 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 20 Apr 2020 14:38:53 +0200 Subject: [PATCH 034/492] ChatMessageView: Support emoji. --- lib/pleroma/web/pleroma_api/views/chat_message_view.ex | 6 +++++- test/web/pleroma_api/views/chat_message_view_test.exs | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex index fdbb9ff1b..b40ab92a0 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex @@ -6,6 +6,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageView do use Pleroma.Web, :view alias Pleroma.Chat + alias Pleroma.Web.CommonAPI.Utils + alias Pleroma.Web.MastodonAPI.StatusView def render( "show.json", @@ -18,7 +20,9 @@ def render( id: id |> to_string(), content: chat_message["content"], chat_id: chat_id |> to_string(), - actor: chat_message["actor"] + actor: chat_message["actor"], + created_at: Utils.to_masto_date(chat_message["published"]), + emojis: StatusView.build_emojis(chat_message["emoji"]) } end diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_view_test.exs index ad8febee6..115335f10 100644 --- a/test/web/pleroma_api/views/chat_message_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_view_test.exs @@ -15,7 +15,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageViewTest do test "it displays a chat message" do user = insert(:user) recipient = insert(:user) - {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "kippis") + {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "kippis :firefox:") chat = Chat.get(user.id, recipient.ap_id) @@ -24,9 +24,11 @@ test "it displays a chat message" do chat_message = ChatMessageView.render("show.json", object: object, for: user, chat: chat) assert chat_message[:id] == object.id |> to_string() - assert chat_message[:content] == "kippis" + assert chat_message[:content] == "kippis :firefox:" assert chat_message[:actor] == user.ap_id assert chat_message[:chat_id] + assert chat_message[:created_at] + assert match?([%{shortcode: "firefox"}], chat_message[:emojis]) {:ok, activity} = CommonAPI.post_chat_message(recipient, user, "gkgkgk") From 97ad0c45977261df3068ca4f0c3febce3173c058 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 21 Apr 2020 17:51:06 +0200 Subject: [PATCH 035/492] Chats: Add API specs. --- .../web/api_spec/operations/chat_operation.ex | 96 ++++++++++++------- .../schemas/chat_message_create_request.ex | 20 ++++ .../api_spec/schemas/chat_message_response.ex | 38 ++++++++ .../schemas/chat_messages_response.ex | 41 ++++++++ .../web/api_spec/schemas/chat_response.ex | 73 ++++++++++++++ .../web/api_spec/schemas/chats_response.ex | 69 +++++++++++++ .../controllers/chat_controller_test.exs | 42 ++++++++ 7 files changed, 346 insertions(+), 33 deletions(-) create mode 100644 lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex create mode 100644 lib/pleroma/web/api_spec/schemas/chat_message_response.ex create mode 100644 lib/pleroma/web/api_spec/schemas/chat_messages_response.ex create mode 100644 lib/pleroma/web/api_spec/schemas/chat_response.ex create mode 100644 lib/pleroma/web/api_spec/schemas/chats_response.ex diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 038ebb29d..5bd41ec4f 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -4,7 +4,12 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do alias OpenApiSpex.Operation - alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Helpers + alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest + alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatMessagesResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatsResponse @spec open_api_operation(atom) :: Operation.t() def open_api_operation(action) do @@ -16,16 +21,25 @@ def create_operation do %Operation{ tags: ["chat"], summary: "Create a chat", + parameters: [ + Operation.parameter( + :ap_id, + :path, + :string, + "The ActivityPub id of the recipient of this chat.", + required: true, + example: "https://lain.com/users/lain" + ) + ], responses: %{ 200 => - Operation.response("Chat", "application/json", %Schema{ - type: :object, - description: "A created chat is returned", - properties: %{ - id: %Schema{type: :integer} - } - }) - } + Operation.response("The created or existing chat", "application/json", ChatResponse) + }, + security: [ + %{ + "oAuth" => ["write"] + } + ] } end @@ -33,17 +47,19 @@ def index_operation do %Operation{ tags: ["chat"], summary: "Get a list of chats that you participated in", + parameters: [ + Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20), + Operation.parameter(:min_id, :query, :string, "Return only chats after this id"), + Operation.parameter(:max_id, :query, :string, "Return only chats before this id") + ], responses: %{ - 200 => - Operation.response("Chats", "application/json", %Schema{ - type: :array, - description: "A list of chats", - items: %Schema{ - type: :object, - description: "A chat" - } - }) - } + 200 => Operation.response("The chats of the user", "application/json", ChatsResponse) + }, + security: [ + %{ + "oAuth" => ["read"] + } + ] } end @@ -51,17 +67,21 @@ def messages_operation do %Operation{ tags: ["chat"], summary: "Get the most recent messages of the chat", + parameters: [ + Operation.parameter(:id, :path, :string, "The ID of the Chat"), + Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20), + Operation.parameter(:min_id, :query, :string, "Return only messages after this id"), + Operation.parameter(:max_id, :query, :string, "Return only messages before this id") + ], responses: %{ 200 => - Operation.response("Messages", "application/json", %Schema{ - type: :array, - description: "A list of chat messages", - items: %Schema{ - type: :object, - description: "A chat message" - } - }) - } + Operation.response("The messages in the chat", "application/json", ChatMessagesResponse) + }, + security: [ + %{ + "oAuth" => ["read"] + } + ] } end @@ -69,13 +89,23 @@ def post_chat_message_operation do %Operation{ tags: ["chat"], summary: "Post a message to the chat", + parameters: [ + Operation.parameter(:id, :path, :string, "The ID of the Chat") + ], + requestBody: Helpers.request_body("Parameters", ChatMessageCreateRequest, required: true), responses: %{ 200 => - Operation.response("Message", "application/json", %Schema{ - type: :object, - description: "A chat message" - }) - } + Operation.response( + "The newly created ChatMessage", + "application/json", + ChatMessageResponse + ) + }, + security: [ + %{ + "oAuth" => ["write"] + } + ] } end end diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex b/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex new file mode 100644 index 000000000..4dafcda43 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex @@ -0,0 +1,20 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest do + alias OpenApiSpex.Schema + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ChatMessageCreateRequest", + description: "POST body for creating an chat message", + type: :object, + properties: %{ + content: %Schema{type: :string, description: "The content of your message"} + }, + example: %{ + "content" => "Hey wanna buy feet pics?" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex new file mode 100644 index 000000000..e94c00369 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex @@ -0,0 +1,38 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ChatMessageResponse", + description: "Response schema for a ChatMessage", + type: :object, + properties: %{ + id: %Schema{type: :string}, + actor: %Schema{type: :string, description: "The ActivityPub id of the actor"}, + chat_id: %Schema{type: :string}, + content: %Schema{type: :string}, + created_at: %Schema{type: :string, format: :datetime}, + emojis: %Schema{type: :array} + }, + example: %{ + "actor" => "https://dontbulling.me/users/lain", + "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" + } + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/chat_messages_response.ex b/lib/pleroma/web/api_spec/schemas/chat_messages_response.ex new file mode 100644 index 000000000..302bdec95 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/chat_messages_response.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.ChatMessagesResponse do + alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ChatMessagesResponse", + description: "Response schema for multiple ChatMessages", + type: :array, + items: ChatMessageResponse, + 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" => "https://dontbulling.me/users/lain" + }, + %{ + "actor" => "https://dontbulling.me/users/lain", + "content" => "Whats' up?", + "id" => "12", + "chat_id" => "1", + "emojis" => [], + "created_at" => "2020-04-21T15:06:45.000Z" + } + ] + }) +end diff --git a/lib/pleroma/web/api_spec/schemas/chat_response.ex b/lib/pleroma/web/api_spec/schemas/chat_response.ex new file mode 100644 index 000000000..a80f4d173 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/chat_response.ex @@ -0,0 +1,73 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ChatResponse do + alias OpenApiSpex.Schema + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ChatResponse", + description: "Response schema for a Chat", + type: :object, + properties: %{ + id: %Schema{type: :string}, + recipient: %Schema{type: :string}, + # TODO: Make this reference the account structure. + recipient_account: %Schema{type: :object}, + unread: %Schema{type: :integer} + }, + example: %{ + "recipient" => "https://dontbulling.me/users/lain", + "recipient_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 diff --git a/lib/pleroma/web/api_spec/schemas/chats_response.ex b/lib/pleroma/web/api_spec/schemas/chats_response.ex new file mode 100644 index 000000000..3349e0691 --- /dev/null +++ b/lib/pleroma/web/api_spec/schemas/chats_response.ex @@ -0,0 +1,69 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.Schemas.ChatsResponse do + alias Pleroma.Web.ApiSpec.Schemas.ChatResponse + + require OpenApiSpex + + OpenApiSpex.schema(%{ + title: "ChatsResponse", + description: "Response schema for multiple Chats", + type: :array, + items: ChatResponse, + example: [ + %{ + "recipient" => "https://dontbulling.me/users/lain", + "recipient_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 diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 0750c7273..52a34d23f 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -5,8 +5,14 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true alias Pleroma.Chat + alias Pleroma.Web.ApiSpec + alias Pleroma.Web.ApiSpec.Schemas.ChatResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatsResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatMessagesResponse alias Pleroma.Web.CommonAPI + import OpenApiSpex.TestAssertions import Pleroma.Factory describe "POST /api/v1/pleroma/chats/:id/messages" do @@ -24,6 +30,7 @@ test "it posts a message to the chat", %{conn: conn, user: user} do assert result["content"] == "Hallo!!" assert result["chat_id"] == chat.id |> to_string() + assert_schema(result, "ChatMessageResponse", ApiSpec.spec()) end end @@ -45,6 +52,7 @@ test "it paginates", %{conn: conn, user: user} do |> json_response(200) assert length(result) == 20 + assert_schema(result, "ChatMessagesResponse", ApiSpec.spec()) result = conn @@ -52,6 +60,7 @@ test "it paginates", %{conn: conn, user: user} do |> json_response(200) assert length(result) == 10 + assert_schema(result, "ChatMessagesResponse", ApiSpec.spec()) end test "it returns the messages for a given chat", %{conn: conn, user: user} do @@ -76,6 +85,7 @@ test "it returns the messages for a given chat", %{conn: conn, user: user} do end) assert length(result) == 3 + assert_schema(result, "ChatMessagesResponse", ApiSpec.spec()) # Trying to get the chat of a different user result = @@ -99,6 +109,7 @@ test "it creates or returns a chat", %{conn: conn} do |> json_response(200) assert result["id"] + assert_schema(result, "ChatResponse", ApiSpec.spec()) end end @@ -117,6 +128,7 @@ test "it paginates", %{conn: conn, user: user} do |> json_response(200) assert length(result) == 20 + assert_schema(result, "ChatsResponse", ApiSpec.spec()) result = conn @@ -124,6 +136,8 @@ test "it paginates", %{conn: conn, user: user} do |> json_response(200) assert length(result) == 10 + + assert_schema(result, "ChatsResponse", ApiSpec.spec()) end test "it return a list of chats the current user is participating in, in descending order of updates", @@ -154,6 +168,34 @@ test "it return a list of chats the current user is participating in, in descend chat_3.id |> to_string(), chat_1.id |> to_string() ] + + assert_schema(result, "ChatsResponse", ApiSpec.spec()) + end + end + + describe "schemas" do + test "Chat example matches schema" do + api_spec = ApiSpec.spec() + schema = ChatResponse.schema() + assert_schema(schema.example, "ChatResponse", api_spec) + end + + test "Chats example matches schema" do + api_spec = ApiSpec.spec() + schema = ChatsResponse.schema() + assert_schema(schema.example, "ChatsResponse", api_spec) + end + + test "ChatMessage example matches schema" do + api_spec = ApiSpec.spec() + schema = ChatMessageResponse.schema() + assert_schema(schema.example, "ChatMessageResponse", api_spec) + end + + test "ChatsMessage example matches schema" do + api_spec = ApiSpec.spec() + schema = ChatMessagesResponse.schema() + assert_schema(schema.example, "ChatMessagesResponse", api_spec) end end end From 66c2eb670b273d808f0a9c1ae087df064718ca3d Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 21 Apr 2020 18:23:00 +0200 Subject: [PATCH 036/492] ChatController: Validate parameters. --- .../web/api_spec/operations/chat_operation.ex | 4 ++++ .../controllers/chat_controller.ex | 22 ++++++++++++------- .../controllers/chat_controller_test.exs | 5 +++-- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 5bd41ec4f..dc99bd773 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -21,6 +21,7 @@ def create_operation do %Operation{ tags: ["chat"], summary: "Create a chat", + operationId: "ChatController.create", parameters: [ Operation.parameter( :ap_id, @@ -47,6 +48,7 @@ def index_operation do %Operation{ tags: ["chat"], summary: "Get a list of chats that you participated in", + operationId: "ChatController.index", parameters: [ Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20), Operation.parameter(:min_id, :query, :string, "Return only chats after this id"), @@ -67,6 +69,7 @@ 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"), Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20), @@ -89,6 +92,7 @@ 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") ], diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 9d8b9b3cf..771ad6217 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -14,6 +14,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Web.PleromaAPI.ChatMessageView alias Pleroma.Web.PleromaAPI.ChatView + import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1] + import Ecto.Query # TODO @@ -29,12 +31,16 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do %{scopes: ["read:statuses"]} when action in [:messages, :index] ) + plug(OpenApiSpex.Plug.CastAndValidate) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation - def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ - "id" => id, - "content" => content - }) do + def post_chat_message( + %{body_params: %{content: content}, 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, content), @@ -45,7 +51,7 @@ def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ end end - def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id} = params) do + 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 messages = from(o in Object, @@ -66,7 +72,7 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id} = ^[user.ap_id] ) ) - |> Pagination.fetch_paginated(params) + |> Pagination.fetch_paginated(params |> stringify_keys()) conn |> put_view(ChatMessageView) @@ -85,7 +91,7 @@ def index(%{assigns: %{user: %{id: user_id}}} = conn, params) do where: c.user_id == ^user_id, order_by: [desc: c.updated_at] ) - |> Pagination.fetch_paginated(params) + |> Pagination.fetch_paginated(params |> stringify_keys) conn |> put_view(ChatView) @@ -93,7 +99,7 @@ def index(%{assigns: %{user: %{id: user_id}}} = conn, params) do end def create(%{assigns: %{user: user}} = conn, params) do - recipient = params["ap_id"] |> URI.decode_www_form() + recipient = params[:ap_id] with {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do conn diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 52a34d23f..84610e511 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -25,6 +25,7 @@ test "it posts a message to the chat", %{conn: conn, user: user} do result = conn + |> put_req_header("content-type", "application/json") |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"}) |> json_response(200) @@ -56,7 +57,7 @@ test "it paginates", %{conn: conn, user: user} do result = conn - |> get("/api/v1/pleroma/chats/#{chat.id}/messages", %{"max_id" => List.last(result)["id"]}) + |> get("/api/v1/pleroma/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}") |> json_response(200) assert length(result) == 10 @@ -132,7 +133,7 @@ test "it paginates", %{conn: conn, user: user} do result = conn - |> get("/api/v1/pleroma/chats", %{max_id: List.last(result)["id"]}) + |> get("/api/v1/pleroma/chats?max_id=#{List.last(result)["id"]}") |> json_response(200) assert length(result) == 10 From 6c8390fa4d47a86c34bcc71681ba30f04d14eae9 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 21 Apr 2020 18:32:30 +0200 Subject: [PATCH 037/492] ChatControllerTest: Credo fixes. --- test/web/pleroma_api/controllers/chat_controller_test.exs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 84610e511..07b698013 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -6,10 +6,10 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do alias Pleroma.Chat alias Pleroma.Web.ApiSpec - alias Pleroma.Web.ApiSpec.Schemas.ChatResponse - alias Pleroma.Web.ApiSpec.Schemas.ChatsResponse alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse alias Pleroma.Web.ApiSpec.Schemas.ChatMessagesResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatsResponse alias Pleroma.Web.CommonAPI import OpenApiSpex.TestAssertions From 2e62a63749e040b108b8afe2c8839c470f89fa04 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 22 Apr 2020 12:48:52 +0200 Subject: [PATCH 038/492] ChatMessageValidator: Validation changes Don't validate if the recipient is blocking the actor. --- .../object_validators/chat_message_validator.ex | 12 +++++++++++- test/web/activity_pub/object_validator_test.exs | 9 +++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) 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 index 2feb65f29..8b5bb4fdc 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -61,15 +61,25 @@ def validate_data(data_cng) do |> validate_local_concern() end - @doc "Validates if at least one of the users in this ChatMessage is a local user, otherwise we don't want the message in our system. It also validates the presence of both users in our system." + @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") diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 8230ae0d9..bc2317e55 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -33,6 +33,15 @@ test "does not validate if the message is longer than the remote_limit", %{ 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 From 1d6338f2d38284e94e17be58c21c7f34b5621ab7 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 22 Apr 2020 12:52:39 +0200 Subject: [PATCH 039/492] Litepub: Add ChatMessage. --- priv/static/schemas/litepub-0.1.jsonld | 1 + 1 file changed, 1 insertion(+) diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld index 278ad2f96..7cc3fee40 100644 --- a/priv/static/schemas/litepub-0.1.jsonld +++ b/priv/static/schemas/litepub-0.1.jsonld @@ -30,6 +30,7 @@ "@type": "@id" }, "EmojiReact": "litepub:EmojiReact", + "ChatMessage": "litepub:ChatMessage", "alsoKnownAs": { "@id": "as:alsoKnownAs", "@type": "@id" From 1e28d34592a5fae0f3403763f1ff86cc393a52b0 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 23 Apr 2020 16:19:49 +0200 Subject: [PATCH 040/492] ChatMessage: Correctly ingest emoji tags. --- .../object_validators/chat_message_validator.ex | 2 ++ test/fixtures/create-chat-message.json | 12 ++++++++++++ .../transmogrifier/chat_message_test.exs | 1 + 3 files changed, 15 insertions(+) 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 index 8b5bb4fdc..f07045d9d 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -9,6 +9,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset + import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1] @primary_key false @derive Jason.Encoder @@ -42,6 +43,7 @@ def cast_data(data) do def fix(data) do data + |> fix_emoji() |> Map.put_new("actor", data["attributedTo"]) end diff --git a/test/fixtures/create-chat-message.json b/test/fixtures/create-chat-message.json index 6db5b9f5c..9c23a1c9b 100644 --- a/test/fixtures/create-chat-message.json +++ b/test/fixtures/create-chat-message.json @@ -9,6 +9,18 @@ "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", diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index 4d6f24609..a63a31e6e 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -75,6 +75,7 @@ test "it inserts it and creates a chat" do 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) From a51cdafc0192b66ce75659b424a690f52c9b2a49 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 23 Apr 2020 16:55:00 +0200 Subject: [PATCH 041/492] Docs: Add documentation about chatmessages --- docs/ap_extensions.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 docs/ap_extensions.md 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`. From b429a49504b1df6fa085cccbb3e461cd378b15c4 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 23 Apr 2020 23:44:03 +0200 Subject: [PATCH 042/492] mix.exs: Fix for MacOS --- mix.exs | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/mix.exs b/mix.exs index b76aef180..021217400 100644 --- a/mix.exs +++ b/mix.exs @@ -220,32 +220,39 @@ defp aliases 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"]) + {_gitpath, git_present} = 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 git_present do + {tag, tag_err} = + System.cmd("git", ["describe", "--tags", "--abbrev=0"], stderr_to_stdout: true) - commit_hash_err == 0 -> - "0-g" <> String.trim(commit_hash) + {describe, describe_err} = System.cmd("git", ["describe", "--tags", "--abbrev=8"]) + {commit_hash, commit_hash_err} = System.cmd("git", ["rev-parse", "--short", "HEAD"]) - true -> - "" + # 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() + + commit_hash_err == 0 -> + "0-g" <> String.trim(commit_hash) + + true -> + "" + end + else + "" 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 true <- git_present, + {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 <- From c63d6ba0b2686db847f70cf251f92bfed57c4e5f Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 23 Apr 2020 23:44:30 +0200 Subject: [PATCH 043/492] mix.exs: branch_name fallbacks to "" --- mix.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mix.exs b/mix.exs index 021217400..15a65c0fb 100644 --- a/mix.exs +++ b/mix.exs @@ -266,7 +266,7 @@ defp version(version) do branch_name else - _ -> "stable" + _ -> "" end build_name = From 053c46153076f351c5273c2d6b1fb0843e7b6a6d Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 24 Apr 2020 00:26:24 +0200 Subject: [PATCH 044/492] mix.exs: proper check on 0, remove else in git_pre_release --- mix.exs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/mix.exs b/mix.exs index 15a65c0fb..ebb8bdb08 100644 --- a/mix.exs +++ b/mix.exs @@ -220,10 +220,10 @@ defp aliases do defp version(version) do identifier_filter = ~r/[^0-9a-z\-]+/i - {_gitpath, git_present} = System.cmd("sh", ["-c", "command -v git"]) + {_cmdgit, cmdgit_err} = System.cmd("sh", ["-c", "command -v git"]) git_pre_release = - if git_present do + if cmdgit_err == 0 do {tag, tag_err} = System.cmd("git", ["describe", "--tags", "--abbrev=0"], stderr_to_stdout: true) @@ -243,15 +243,13 @@ defp version(version) do "0-g" <> String.trim(commit_hash) true -> - "" + nil end - else - "" end # Branch name as pre-release version component, denoted with a dot branch_name = - with true <- git_present, + 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, From d2bbea1a8076401645600ceb953dd66ec023b3ad Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 12:19:27 +0200 Subject: [PATCH 045/492] ChatControllerTest: Use new schema testing functions. --- .../controllers/chat_controller_test.exs | 58 +++---------------- 1 file changed, 8 insertions(+), 50 deletions(-) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 07b698013..84d7b543e 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -5,14 +5,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true alias Pleroma.Chat - alias Pleroma.Web.ApiSpec - alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse - alias Pleroma.Web.ApiSpec.Schemas.ChatMessagesResponse - alias Pleroma.Web.ApiSpec.Schemas.ChatResponse - alias Pleroma.Web.ApiSpec.Schemas.ChatsResponse alias Pleroma.Web.CommonAPI - import OpenApiSpex.TestAssertions import Pleroma.Factory describe "POST /api/v1/pleroma/chats/:id/messages" do @@ -27,11 +21,10 @@ test "it posts a message to the chat", %{conn: conn, user: user} do conn |> put_req_header("content-type", "application/json") |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"}) - |> json_response(200) + |> json_response_and_validate_schema(200) assert result["content"] == "Hallo!!" assert result["chat_id"] == chat.id |> to_string() - assert_schema(result, "ChatMessageResponse", ApiSpec.spec()) end end @@ -50,18 +43,16 @@ test "it paginates", %{conn: conn, user: user} do result = conn |> get("/api/v1/pleroma/chats/#{chat.id}/messages") - |> json_response(200) + |> json_response_and_validate_schema(200) assert length(result) == 20 - assert_schema(result, "ChatMessagesResponse", ApiSpec.spec()) result = conn |> get("/api/v1/pleroma/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}") - |> json_response(200) + |> json_response_and_validate_schema(200) assert length(result) == 10 - assert_schema(result, "ChatMessagesResponse", ApiSpec.spec()) end test "it returns the messages for a given chat", %{conn: conn, user: user} do @@ -78,7 +69,7 @@ test "it returns the messages for a given chat", %{conn: conn, user: user} do result = conn |> get("/api/v1/pleroma/chats/#{chat.id}/messages") - |> json_response(200) + |> json_response_and_validate_schema(200) result |> Enum.each(fn message -> @@ -86,7 +77,6 @@ test "it returns the messages for a given chat", %{conn: conn, user: user} do end) assert length(result) == 3 - assert_schema(result, "ChatMessagesResponse", ApiSpec.spec()) # Trying to get the chat of a different user result = @@ -107,10 +97,9 @@ test "it creates or returns a chat", %{conn: conn} do result = conn |> post("/api/v1/pleroma/chats/by-ap-id/#{URI.encode_www_form(other_user.ap_id)}") - |> json_response(200) + |> json_response_and_validate_schema(200) assert result["id"] - assert_schema(result, "ChatResponse", ApiSpec.spec()) end end @@ -126,19 +115,16 @@ test "it paginates", %{conn: conn, user: user} do result = conn |> get("/api/v1/pleroma/chats") - |> json_response(200) + |> json_response_and_validate_schema(200) assert length(result) == 20 - assert_schema(result, "ChatsResponse", ApiSpec.spec()) result = conn |> get("/api/v1/pleroma/chats?max_id=#{List.last(result)["id"]}") - |> json_response(200) + |> json_response_and_validate_schema(200) assert length(result) == 10 - - assert_schema(result, "ChatsResponse", ApiSpec.spec()) end test "it return a list of chats the current user is participating in, in descending order of updates", @@ -160,7 +146,7 @@ test "it return a list of chats the current user is participating in, in descend result = conn |> get("/api/v1/pleroma/chats") - |> json_response(200) + |> json_response_and_validate_schema(200) ids = Enum.map(result, & &1["id"]) @@ -169,34 +155,6 @@ test "it return a list of chats the current user is participating in, in descend chat_3.id |> to_string(), chat_1.id |> to_string() ] - - assert_schema(result, "ChatsResponse", ApiSpec.spec()) - end - end - - describe "schemas" do - test "Chat example matches schema" do - api_spec = ApiSpec.spec() - schema = ChatResponse.schema() - assert_schema(schema.example, "ChatResponse", api_spec) - end - - test "Chats example matches schema" do - api_spec = ApiSpec.spec() - schema = ChatsResponse.schema() - assert_schema(schema.example, "ChatsResponse", api_spec) - end - - test "ChatMessage example matches schema" do - api_spec = ApiSpec.spec() - schema = ChatMessageResponse.schema() - assert_schema(schema.example, "ChatMessageResponse", api_spec) - end - - test "ChatsMessage example matches schema" do - api_spec = ApiSpec.spec() - schema = ChatMessagesResponse.schema() - assert_schema(schema.example, "ChatMessagesResponse", api_spec) end end end From 15ba3700af76c44e63bf8881021f3ee2a5a7dafd Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 12:45:59 +0200 Subject: [PATCH 046/492] Chat Schemas: Inline unimportant Schemas. --- .../web/api_spec/operations/chat_operation.ex | 113 +++++++++++++++++- .../schemas/chat_messages_response.ex | 41 ------- .../web/api_spec/schemas/chats_response.ex | 69 ----------- 3 files changed, 108 insertions(+), 115 deletions(-) delete mode 100644 lib/pleroma/web/api_spec/schemas/chat_messages_response.ex delete mode 100644 lib/pleroma/web/api_spec/schemas/chats_response.ex diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index dc99bd773..6f55cbd59 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -7,9 +7,8 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do alias Pleroma.Web.ApiSpec.Helpers alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse - alias Pleroma.Web.ApiSpec.Schemas.ChatMessagesResponse alias Pleroma.Web.ApiSpec.Schemas.ChatResponse - alias Pleroma.Web.ApiSpec.Schemas.ChatsResponse + alias OpenApiSpex.Schema @spec open_api_operation(atom) :: Operation.t() def open_api_operation(action) do @@ -34,7 +33,11 @@ def create_operation do ], responses: %{ 200 => - Operation.response("The created or existing chat", "application/json", ChatResponse) + Operation.response( + "The created or existing chat", + "application/json", + ChatResponse + ) }, security: [ %{ @@ -55,7 +58,7 @@ def index_operation do Operation.parameter(:max_id, :query, :string, "Return only chats before this id") ], responses: %{ - 200 => Operation.response("The chats of the user", "application/json", ChatsResponse) + 200 => Operation.response("The chats of the user", "application/json", chats_response()) }, security: [ %{ @@ -78,7 +81,11 @@ def messages_operation do ], responses: %{ 200 => - Operation.response("The messages in the chat", "application/json", ChatMessagesResponse) + Operation.response( + "The messages in the chat", + "application/json", + chat_messages_response() + ) }, security: [ %{ @@ -112,4 +119,100 @@ def post_chat_message_operation do ] } end + + def chats_response() do + %Schema{ + title: "ChatsResponse", + description: "Response schema for multiple Chats", + type: :array, + items: ChatResponse, + example: [ + %{ + "recipient" => "https://dontbulling.me/users/lain", + "recipient_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: ChatMessageResponse, + 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" => "https://dontbulling.me/users/lain" + }, + %{ + "actor" => "https://dontbulling.me/users/lain", + "content" => "Whats' up?", + "id" => "12", + "chat_id" => "1", + "emojis" => [], + "created_at" => "2020-04-21T15:06:45.000Z" + } + ] + } + end end diff --git a/lib/pleroma/web/api_spec/schemas/chat_messages_response.ex b/lib/pleroma/web/api_spec/schemas/chat_messages_response.ex deleted file mode 100644 index 302bdec95..000000000 --- a/lib/pleroma/web/api_spec/schemas/chat_messages_response.ex +++ /dev/null @@ -1,41 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessagesResponse do - alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse - - require OpenApiSpex - - OpenApiSpex.schema(%{ - title: "ChatMessagesResponse", - description: "Response schema for multiple ChatMessages", - type: :array, - items: ChatMessageResponse, - 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" => "https://dontbulling.me/users/lain" - }, - %{ - "actor" => "https://dontbulling.me/users/lain", - "content" => "Whats' up?", - "id" => "12", - "chat_id" => "1", - "emojis" => [], - "created_at" => "2020-04-21T15:06:45.000Z" - } - ] - }) -end diff --git a/lib/pleroma/web/api_spec/schemas/chats_response.ex b/lib/pleroma/web/api_spec/schemas/chats_response.ex deleted file mode 100644 index 3349e0691..000000000 --- a/lib/pleroma/web/api_spec/schemas/chats_response.ex +++ /dev/null @@ -1,69 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ApiSpec.Schemas.ChatsResponse do - alias Pleroma.Web.ApiSpec.Schemas.ChatResponse - - require OpenApiSpex - - OpenApiSpex.schema(%{ - title: "ChatsResponse", - description: "Response schema for multiple Chats", - type: :array, - items: ChatResponse, - example: [ - %{ - "recipient" => "https://dontbulling.me/users/lain", - "recipient_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 From e62f8542a1933ba71dfd236741ad3afc76b89f22 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 13:48:09 +0200 Subject: [PATCH 047/492] Docs: Add chat motivation and api description. --- docs/API/chats.md | 197 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 docs/API/chats.md diff --git a/docs/API/chats.md b/docs/API/chats.md new file mode 100644 index 000000000..39f493b47 --- /dev/null +++ b/docs/API/chats.md @@ -0,0 +1,197 @@ +# 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`. The actors in the API are generally given by their ActivityPub id to make it easier to support later `Group` scenarios. + +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 AP ID) +you can call: + +`POST /api/v1/pleroma/chats/by-ap-id/{ap_id}` + +The ap_id of the recipients needs to be www-form encoded, so + +``` +https://originalpatchou.li/user/lambda +``` + +would become + +``` +https%3A%2F%2Foriginalpatchou.li%2Fuser%2Flambda +``` + +The full call would then be + +``` +POST /api/v1/pleroma/chats/by-ap-id/https%3A%2F%2Foriginalpatchou.li%2Fuser%2Flambda +``` + +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 +{ + "recipient" : "https://dontbulling.me/users/lain", + "recipient_account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2 +} +``` + +### 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 +[ + { + "recipient" : "https://dontbulling.me/users/lain", + "recipient_account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 2 + } +] +``` + +The recipient of messages that are sent to this chat is given by their AP ID. +The usual pagination options are implemented. + +### 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 +[ + { + "actor": "https://dontbulling.me/users/lain", + "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" + }, + { + "actor": "https://dontbulling.me/users/lain", + "chat_id": "1", + "content": "Whats' up?", + "created_at": "2020-04-21T15:06:45.000Z", + "emojis": [], + "id": "12" + } +] +``` + +### 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 + +Currently, no formatting beyond basic escaping and emoji is implemented, as well as no +attachments. This will most probably change. + +Returned data: + +```json +{ + "actor": "https://dontbulling.me/users/lain", + "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" +} +``` + +### Notifications + +There's a new `pleroma:chat_mention` notification, which has this form: + +```json +{ + "id": "someid", + "type": "pleroma:chat_mention", + "account": { ... } // User account of the sender, + "chat_message": { + "chat_id": "1", + "id": "10", + "content": "Hello", + "actor": "https://dontbulling.me/users/lain" + }, + "created_at": "somedate" +} +``` From 00e956528b392689326d5f5527543a422a874bcc Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 14:02:11 +0200 Subject: [PATCH 048/492] Credo fixes. --- lib/pleroma/web/api_spec/operations/chat_operation.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 6f55cbd59..546bc4d9b 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -4,11 +4,11 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do alias OpenApiSpex.Operation + alias OpenApiSpex.Schema alias Pleroma.Web.ApiSpec.Helpers alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse alias Pleroma.Web.ApiSpec.Schemas.ChatResponse - alias OpenApiSpex.Schema @spec open_api_operation(atom) :: Operation.t() def open_api_operation(action) do @@ -120,7 +120,7 @@ def post_chat_message_operation do } end - def chats_response() do + def chats_response do %Schema{ title: "ChatsResponse", description: "Response schema for multiple Chats", @@ -182,7 +182,7 @@ def chats_response() do } end - def chat_messages_response() do + def chat_messages_response do %Schema{ title: "ChatMessagesResponse", description: "Response schema for multiple ChatMessages", From 49e673dfea0a0cc94bba9691ce171b60f8a2fd75 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 16:08:03 +0200 Subject: [PATCH 049/492] ChatView: Add actor_account_id --- lib/pleroma/web/api_spec/schemas/chat_message_response.ex | 2 ++ lib/pleroma/web/pleroma_api/views/chat_message_view.ex | 2 ++ test/web/pleroma_api/views/chat_message_view_test.exs | 2 ++ 3 files changed, 6 insertions(+) diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex index e94c00369..9459d210b 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex @@ -14,6 +14,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse do properties: %{ id: %Schema{type: :string}, actor: %Schema{type: :string, description: "The ActivityPub id of the actor"}, + actor_account_id: %Schema{type: :string, description: "The Mastodon API id of the actor"}, chat_id: %Schema{type: :string}, content: %Schema{type: :string}, created_at: %Schema{type: :string, format: :datetime}, @@ -21,6 +22,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse do }, example: %{ "actor" => "https://dontbulling.me/users/lain", + "actor_account_id" => "someflakeid", "chat_id" => "1", "content" => "hey you again", "created_at" => "2020-04-21T15:06:45.000Z", diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex index b40ab92a0..5b740cc44 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageView do alias Pleroma.Chat alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.StatusView + alias Pleroma.User def render( "show.json", @@ -21,6 +22,7 @@ def render( content: chat_message["content"], chat_id: chat_id |> to_string(), actor: chat_message["actor"], + actor_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"]) } diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_view_test.exs index 115335f10..7e3aeefab 100644 --- a/test/web/pleroma_api/views/chat_message_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_view_test.exs @@ -26,6 +26,7 @@ test "it displays a chat message" do assert chat_message[:id] == object.id |> to_string() assert chat_message[:content] == "kippis :firefox:" assert chat_message[:actor] == user.ap_id + assert chat_message[:actor_account_id] == user.id assert chat_message[:chat_id] assert chat_message[:created_at] assert match?([%{shortcode: "firefox"}], chat_message[:emojis]) @@ -39,6 +40,7 @@ test "it displays a chat message" do assert chat_message_two[:id] == object.id |> to_string() assert chat_message_two[:content] == "gkgkgk" assert chat_message_two[:actor] == recipient.ap_id + assert chat_message_two[:actor_account_id] == recipient.id assert chat_message_two[:chat_id] == chat_message[:chat_id] end end From ad82a216ff0676507a118e610209bd4259456b3c Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 17:48:34 +0200 Subject: [PATCH 050/492] Chat API: Align more to Pleroma/Mastodon API. --- .../web/api_spec/operations/chat_operation.ex | 13 ++++++------- .../web/api_spec/schemas/chat_message_response.ex | 6 ++---- lib/pleroma/web/api_spec/schemas/chat_response.ex | 11 ++++------- .../web/pleroma_api/controllers/chat_controller.ex | 5 ++--- .../web/pleroma_api/views/chat_message_view.ex | 3 +-- lib/pleroma/web/pleroma_api/views/chat_view.ex | 3 +-- lib/pleroma/web/router.ex | 2 +- .../controllers/chat_controller_test.exs | 4 ++-- .../pleroma_api/views/chat_message_view_test.exs | 6 ++---- test/web/pleroma_api/views/chat_view_test.exs | 3 +-- 10 files changed, 22 insertions(+), 34 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 546bc4d9b..59539e890 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -23,12 +23,12 @@ def create_operation do operationId: "ChatController.create", parameters: [ Operation.parameter( - :ap_id, + :id, :path, :string, - "The ActivityPub id of the recipient of this chat.", + "The account id of the recipient of this chat", required: true, - example: "https://lain.com/users/lain" + example: "someflakeid" ) ], responses: %{ @@ -128,8 +128,7 @@ def chats_response do items: ChatResponse, example: [ %{ - "recipient" => "https://dontbulling.me/users/lain", - "recipient_account" => %{ + "account" => %{ "pleroma" => %{ "is_admin" => false, "confirmation_pending" => false, @@ -202,10 +201,10 @@ def chat_messages_response do "content" => "Check this out :firefox:", "id" => "13", "chat_id" => "1", - "actor" => "https://dontbulling.me/users/lain" + "actor_id" => "someflakeid" }, %{ - "actor" => "https://dontbulling.me/users/lain", + "actor_id" => "someflakeid", "content" => "Whats' up?", "id" => "12", "chat_id" => "1", diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex index 9459d210b..b7a662cbb 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex @@ -13,16 +13,14 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse do type: :object, properties: %{ id: %Schema{type: :string}, - actor: %Schema{type: :string, description: "The ActivityPub id of the actor"}, - actor_account_id: %Schema{type: :string, description: "The Mastodon API id of the actor"}, + account_id: %Schema{type: :string, description: "The Mastodon API id of the actor"}, chat_id: %Schema{type: :string}, content: %Schema{type: :string}, created_at: %Schema{type: :string, format: :datetime}, emojis: %Schema{type: :array} }, example: %{ - "actor" => "https://dontbulling.me/users/lain", - "actor_account_id" => "someflakeid", + "account_id" => "someflakeid", "chat_id" => "1", "content" => "hey you again", "created_at" => "2020-04-21T15:06:45.000Z", diff --git a/lib/pleroma/web/api_spec/schemas/chat_response.ex b/lib/pleroma/web/api_spec/schemas/chat_response.ex index a80f4d173..aa435165d 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_response.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_response.ex @@ -12,15 +12,12 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatResponse do description: "Response schema for a Chat", type: :object, properties: %{ - id: %Schema{type: :string}, - recipient: %Schema{type: :string}, - # TODO: Make this reference the account structure. - recipient_account: %Schema{type: :object}, - unread: %Schema{type: :integer} + id: %Schema{type: :string, nullable: false}, + account: %Schema{type: :object, nullable: false}, + unread: %Schema{type: :integer, nullable: false} }, example: %{ - "recipient" => "https://dontbulling.me/users/lain", - "recipient_account" => %{ + "account" => %{ "pleroma" => %{ "is_admin" => false, "confirmation_pending" => false, diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 771ad6217..8654f4295 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -99,9 +99,8 @@ def index(%{assigns: %{user: %{id: user_id}}} = conn, params) do end def create(%{assigns: %{user: user}} = conn, params) do - recipient = params[:ap_id] - - with {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) 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) diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex index 5b740cc44..28f12d9b0 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex @@ -21,8 +21,7 @@ def render( id: id |> to_string(), content: chat_message["content"], chat_id: chat_id |> to_string(), - actor: chat_message["actor"], - actor_account_id: User.get_cached_by_ap_id(chat_message["actor"]).id, + 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"]) } diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index 1e9ef4356..bc3af5ef5 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -14,8 +14,7 @@ def render("show.json", %{chat: %Chat{} = chat} = opts) do %{ id: chat.id |> to_string(), - recipient: chat.recipient, - recipient_account: AccountView.render("show.json", Map.put(opts, :user, recipient)), + account: AccountView.render("show.json", Map.put(opts, :user, recipient)), unread: chat.unread } end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 0c56318ee..aad2e3b98 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -275,7 +275,7 @@ defmodule Pleroma.Web.Router do scope [] do pipe_through(:authenticated_api) - post("/chats/by-ap-id/:ap_id", ChatController, :create) + post("/chats/by-account-id/:id", ChatController, :create) get("/chats", ChatController, :index) get("/chats/:id/messages", ChatController, :messages) post("/chats/:id/messages", ChatController, :post_chat_message) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 84d7b543e..b1044574b 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -88,7 +88,7 @@ test "it returns the messages for a given chat", %{conn: conn, user: user} do end end - describe "POST /api/v1/pleroma/chats/by-ap-id/:id" do + describe "POST /api/v1/pleroma/chats/by-account-id/:id" do setup do: oauth_access(["write:statuses"]) test "it creates or returns a chat", %{conn: conn} do @@ -96,7 +96,7 @@ test "it creates or returns a chat", %{conn: conn} do result = conn - |> post("/api/v1/pleroma/chats/by-ap-id/#{URI.encode_www_form(other_user.ap_id)}") + |> post("/api/v1/pleroma/chats/by-account-id/#{other_user.id}") |> json_response_and_validate_schema(200) assert result["id"] diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_view_test.exs index 7e3aeefab..5c4c8b0d5 100644 --- a/test/web/pleroma_api/views/chat_message_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_view_test.exs @@ -25,8 +25,7 @@ test "it displays a chat message" do assert chat_message[:id] == object.id |> to_string() assert chat_message[:content] == "kippis :firefox:" - assert chat_message[:actor] == user.ap_id - assert chat_message[:actor_account_id] == user.id + assert chat_message[:account_id] == user.id assert chat_message[:chat_id] assert chat_message[:created_at] assert match?([%{shortcode: "firefox"}], chat_message[:emojis]) @@ -39,8 +38,7 @@ test "it displays a chat message" do assert chat_message_two[:id] == object.id |> to_string() assert chat_message_two[:content] == "gkgkgk" - assert chat_message_two[:actor] == recipient.ap_id - assert chat_message_two[:actor_account_id] == recipient.id + assert chat_message_two[:account_id] == recipient.id assert chat_message_two[:chat_id] == chat_message[:chat_id] end end diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index 725da5ff8..1ac3483d1 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -21,8 +21,7 @@ test "it represents a chat" do assert represented_chat == %{ id: "#{chat.id}", - recipient: recipient.ap_id, - recipient_account: AccountView.render("show.json", user: recipient), + account: AccountView.render("show.json", user: recipient), unread: 0 } end From b550ef56119b9f735cf3fe279a5457e36ab92951 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 17:52:16 +0200 Subject: [PATCH 051/492] Docs: Align chat api changes with docs. --- docs/API/chats.md | 36 +++++++++++------------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 39f493b47..24c4b4d06 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -32,33 +32,21 @@ For this reasons, Chats are a new and different entity, both in the API as well ## API -In general, the way to send a `ChatMessage` is to first create a `Chat`, then post a message to that `Chat`. The actors in the API are generally given by their ActivityPub id to make it easier to support later `Group` scenarios. +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 AP ID) +To create or get an existing Chat for a certain recipient (identified by Account ID) you can call: -`POST /api/v1/pleroma/chats/by-ap-id/{ap_id}` +`POST /api/v1/pleroma/chats/by-account-id/{account_id}` -The ap_id of the recipients needs to be www-form encoded, so +The account id is the normal FlakeId of the usre ``` -https://originalpatchou.li/user/lambda -``` - -would become - -``` -https%3A%2F%2Foriginalpatchou.li%2Fuser%2Flambda -``` - -The full call would then be - -``` -POST /api/v1/pleroma/chats/by-ap-id/https%3A%2F%2Foriginalpatchou.li%2Fuser%2Flambda +POST /api/v1/pleroma/chats/by-account-id/someflakeid ``` There will only ever be ONE Chat for you and a given recipient, so this call @@ -68,8 +56,7 @@ Returned data: ```json { - "recipient" : "https://dontbulling.me/users/lain", - "recipient_account": { + "account": { "id": "someflakeid", "username": "somenick", ... @@ -91,8 +78,7 @@ Returned data: ```json [ { - "recipient" : "https://dontbulling.me/users/lain", - "recipient_account": { + "account": { "id": "someflakeid", "username": "somenick", ... @@ -120,7 +106,7 @@ Returned data: ```json [ { - "actor": "https://dontbulling.me/users/lain", + "account_id": "someflakeid", "chat_id": "1", "content": "Check this out :firefox:", "created_at": "2020-04-21T15:11:46.000Z", @@ -135,7 +121,7 @@ Returned data: "id": "13" }, { - "actor": "https://dontbulling.me/users/lain", + "account_id": "someflakeid", "chat_id": "1", "content": "Whats' up?", "created_at": "2020-04-21T15:06:45.000Z", @@ -161,7 +147,7 @@ Returned data: ```json { - "actor": "https://dontbulling.me/users/lain", + "account_id": "someflakeid", "chat_id": "1", "content": "Check this out :firefox:", "created_at": "2020-04-21T15:11:46.000Z", @@ -190,7 +176,7 @@ There's a new `pleroma:chat_mention` notification, which has this form: "chat_id": "1", "id": "10", "content": "Hello", - "actor": "https://dontbulling.me/users/lain" + "account_id": "someflakeid" }, "created_at": "somedate" } From 3d040b1a87da66ed53a763f781477bd4f5a146d3 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 27 Apr 2020 17:55:29 +0200 Subject: [PATCH 052/492] Credo fixes. --- lib/pleroma/web/pleroma_api/views/chat_message_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex index 28f12d9b0..a821479ab 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex @@ -6,9 +6,9 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageView do use Pleroma.Web, :view alias Pleroma.Chat + alias Pleroma.User alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.StatusView - alias Pleroma.User def render( "show.json", From 906cf53ab94742327d073f56255f695c91339295 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 28 Apr 2020 13:38:02 +0200 Subject: [PATCH 053/492] Recipient Type: Cast all elements as ObjectIDs. --- .../object_validators/types/recipients.ex | 15 +++++++++++++-- .../object_validators/types/recipients_test.exs | 12 ++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex index 5a3040842..48fe61e1a 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex +++ b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex @@ -1,13 +1,24 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients do use Ecto.Type - def type, do: {:array, :string} + 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), do: {:ok, data} + 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 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 2f9218774..f278f039b 100644 --- a/test/web/activity_pub/object_validators/types/recipients_test.exs +++ b/test/web/activity_pub/object_validators/types/recipients_test.exs @@ -2,11 +2,23 @@ defmodule Pleroma.Web.ObjectValidators.Types.RecipientsTest do alias Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients use Pleroma.DataCase + test "it asserts that all elements of the list are object ids" do + list = ["https://lain.com/users/lain", "invalid"] + + assert :error == Recipients.cast(list) + end + test "it works with a list" do list = ["https://lain.com/users/lain"] assert {:ok, list} == Recipients.cast(list) end + test "it works with a list with whole objects" do + list = ["https://lain.com/users/lain", %{"id" => "https://gensokyo.2hu/users/raymoo"}] + resulting_list = ["https://gensokyo.2hu/users/raymoo", "https://lain.com/users/lain"] + assert {:ok, resulting_list} == Recipients.cast(list) + end + test "it turns a single string into a list" do recipient = "https://lain.com/users/lain" From f8e56d4271f8c495316d304dd0de7f0a63eb0645 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 28 Apr 2020 13:43:58 +0200 Subject: [PATCH 054/492] SideEffects: Use Object.normalize to get the object. --- lib/pleroma/web/activity_pub/side_effects.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index ebe3071b0..a2b4da8d6 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -30,8 +30,8 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do result end - def handle(%{data: %{"type" => "Create", "object" => object_id}} = activity, meta) do - object = Object.get_by_ap_id(object_id) + def handle(%{data: %{"type" => "Create"}} = activity, meta) do + object = Object.normalize(activity, false) {:ok, _object} = handle_object_creation(object) From 6aa116eca7d6ef6567dcef03b8c776bd2134bf3f Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 28 Apr 2020 16:26:19 +0200 Subject: [PATCH 055/492] Create activity handling: Flip it and reverse it Both objects and create activities will now go through the common pipeline and will be validated. Objects are now created as a side effect of the Create activity, rolling back a transaction if it's not possible to insert the object. --- lib/pleroma/notification.ex | 2 +- lib/pleroma/web/activity_pub/activity_pub.ex | 7 ++++ .../web/activity_pub/object_validator.ex | 4 +- .../chat_message_validator.ex | 2 +- .../create_chat_message_validator.ex | 27 +++++++++++- .../object_validators/types/safe_text.ex | 25 +++++++++++ lib/pleroma/web/activity_pub/pipeline.ex | 12 ++++-- lib/pleroma/web/activity_pub/side_effects.ex | 41 +++++++++++-------- .../transmogrifier/chat_message_handling.ex | 28 ++++++++----- lib/pleroma/web/common_api/common_api.ex | 10 +++-- lib/pleroma/web/common_api/utils.ex | 2 +- .../types/safe_text_test.exs | 23 +++++++++++ test/web/activity_pub/side_effects_test.exs | 21 ++++++---- .../transmogrifier/chat_message_test.exs | 3 +- 14 files changed, 155 insertions(+), 52 deletions(-) create mode 100644 lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex create mode 100644 test/web/activity_pub/object_validators/types/safe_text_test.exs diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 73e19bf97..d96c12440 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -275,7 +275,7 @@ def dismiss(%{id: user_id} = _user, id) do end def create_notifications(%Activity{data: %{"to" => _, "type" => "Create"}} = activity) do - object = Object.normalize(activity) + object = Object.normalize(activity, false) if object && object.data["type"] == "Answer" do {:ok, []} diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 69ac06f6b..ecb13d76a 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -126,7 +126,14 @@ def increase_poll_votes_if_vote(%{ def 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), diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 03db681ec..a4da9242a 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -23,7 +23,7 @@ def validate(%{"type" => "Like"} = object, meta) do object |> LikeValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do - object = stringify_keys(object |> Map.from_struct()) + object = stringify_keys(object) {:ok, object, meta} end end @@ -41,7 +41,7 @@ def validate(%{"type" => "ChatMessage"} = object, meta) do def validate(%{"type" => "Create"} = object, meta) do with {:ok, object} <- object - |> CreateChatMessageValidator.cast_and_validate() + |> CreateChatMessageValidator.cast_and_validate(meta) |> Ecto.Changeset.apply_action(:insert) do object = stringify_keys(object) {:ok, object, meta} 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 index f07045d9d..e87c1ac2e 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -18,7 +18,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do field(:id, Types.ObjectID, primary_key: true) field(:to, Types.Recipients, default: []) field(:type, :string) - field(:content, :string) + field(:content, Types.SafeText) field(:actor, Types.ObjectID) field(:published, Types.DateTime) field(:emoji, :map, default: %{}) 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 index ce52d5623..21c7a5ba4 100644 --- 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 @@ -33,8 +33,31 @@ def cast_data(data) do cast(%__MODULE__{}, data, __schema__(:fields)) end - # No validation yet - def cast_and_validate(data) do + 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_recipients_match(meta) + 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/types/safe_text.ex b/lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex new file mode 100644 index 000000000..822e8d2c1 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/types/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.Web.ActivityPub.ObjectValidators.Types.SafeText do + use Ecto.Type + + alias Pleroma.HTML + + def type, do: :string + + def cast(str) when is_binary(str) do + {:ok, HTML.strip_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/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 7ccee54c9..4213ba751 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -4,20 +4,22 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do alias Pleroma.Activity + alias Pleroma.Object alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.MRF alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.SideEffects alias Pleroma.Web.Federator - @spec common_pipeline(map(), keyword()) :: {:ok, Activity.t(), keyword()} | {:error, any()} + @spec common_pipeline(map(), keyword()) :: + {:ok, Activity.t() | Object.t(), keyword()} | {:error, any()} def common_pipeline(object, meta) do with {_, {:ok, validated_object, meta}} <- {:validate_object, ObjectValidator.validate(object, meta)}, {_, {:ok, mrfd_object}} <- {:mrf_object, MRF.filter(validated_object)}, - {_, {:ok, %Activity{} = activity, meta}} <- + {_, {:ok, activity, meta}} <- {:persist_object, ActivityPub.persist(mrfd_object, meta)}, - {_, {:ok, %Activity{} = activity, meta}} <- + {_, {:ok, activity, meta}} <- {:execute_side_effects, SideEffects.handle(activity, meta)}, {_, {:ok, _}} <- {:federation, maybe_federate(activity, meta)} do {:ok, activity, meta} @@ -27,7 +29,9 @@ def common_pipeline(object, meta) do end end - defp maybe_federate(activity, meta) do + defp maybe_federate(%Object{}, _), do: {:ok, :not_federated} + + defp maybe_federate(%Activity{} = activity, meta) do with {:ok, local} <- Keyword.fetch(meta, :local) do if local do Federator.publish(activity) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index a2b4da8d6..794a46267 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -8,7 +8,9 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Chat alias Pleroma.Notification alias Pleroma.Object + alias Pleroma.Repo alias Pleroma.User + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils def handle(object, meta \\ []) @@ -30,14 +32,17 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do result 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 - object = Object.normalize(activity, false) - - {:ok, _object} = handle_object_creation(object) - - Notification.create_notifications(activity) - - {:ok, activity, meta} + with {:ok, _object, _meta} <- handle_object_creation(meta[:object_data], meta) do + Notification.create_notifications(activity) + {:ok, activity, meta} + else + e -> Repo.rollback(e) + end end # Nothing to do @@ -45,18 +50,20 @@ def handle(object, meta) do {:ok, object, meta} end - def handle_object_creation(%{data: %{"type" => "ChatMessage"}} = object) do - actor = User.get_cached_by_ap_id(object.data["actor"]) - recipient = User.get_cached_by_ap_id(hd(object.data["to"])) + 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"])) - [[actor, recipient], [recipient, actor]] - |> Enum.each(fn [user, other_user] -> - if user.local do - Chat.bump_or_create(user.id, other_user.ap_id) - end - end) + [[actor, recipient], [recipient, actor]] + |> Enum.each(fn [user, other_user] -> + if user.local do + Chat.bump_or_create(user.id, other_user.ap_id) + end + end) - {:ok, object} + {:ok, object, meta} + end end # Nothing to do diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex index cfe3b767b..043d847d1 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex @@ -3,31 +3,39 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling do - alias Pleroma.Object + alias Pleroma.Repo alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator alias Pleroma.Web.ActivityPub.Pipeline def handle_incoming( - %{"type" => "Create", "object" => %{"type" => "ChatMessage"} = object_data} = data, + %{"type" => "Create", "object" => %{"type" => "ChatMessage"}} = data, _options ) do + # Create has to be run inside a transaction because the object is created as a side effect. + # If this does not work, we need to roll back creating the activity. + case Repo.transaction(fn -> do_handle_incoming(data) end) do + {:ok, value} -> + value + + {:error, e} -> + {:error, e} + end + end + + def do_handle_incoming( + %{"type" => "Create", "object" => %{"type" => "ChatMessage"} = object_data} = data + ) do with {_, {:ok, cast_data_sym}} <- {:casting_data, data |> CreateChatMessageValidator.cast_and_apply()}, cast_data = ObjectValidator.stringify_keys(cast_data_sym), {_, {:ok, object_cast_data_sym}} <- {:casting_object_data, object_data |> ChatMessageValidator.cast_and_apply()}, object_cast_data = ObjectValidator.stringify_keys(object_cast_data_sym), - # For now, just strip HTML - stripped_content = Pleroma.HTML.strip_tags(object_cast_data["content"]), - object_cast_data = object_cast_data |> Map.put("content", stripped_content), - {_, true} <- {:to_fields_match, cast_data["to"] == object_cast_data["to"]}, - {_, {:ok, validated_object, _meta}} <- - {:validate_object, ObjectValidator.validate(object_cast_data, %{})}, - {_, {:ok, _created_object}} <- {:persist_object, Object.create(validated_object)}, {_, {:ok, activity, _meta}} <- - {:common_pipeline, Pipeline.common_pipeline(cast_data, local: false)} do + {:common_pipeline, + Pipeline.common_pipeline(cast_data, local: false, object_data: object_cast_data)} do {:ok, activity} else e -> diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 5eb221668..c39d1cee6 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -38,13 +38,15 @@ def post_chat_message(%User{} = user, %User{} = recipient, content) do recipient.ap_id, content |> Formatter.html_escape("text/plain") )}, - {_, {:ok, chat_message_object}} <- - {:create_object, Object.create(chat_message_data)}, {_, {:ok, create_activity_data, _meta}} <- {:build_create_activity, - Builder.create(user, chat_message_object.data["id"], [recipient.ap_id])}, + Builder.create(user, chat_message_data["id"], [recipient.ap_id])}, {_, {:ok, %Activity{} = activity, _meta}} <- - {:common_pipeline, Pipeline.common_pipeline(create_activity_data, local: true)} do + {:common_pipeline, + Pipeline.common_pipeline(create_activity_data, + local: true, + object_data: chat_message_data + )} do {:ok, activity} else {:content_length, false} -> {:error, :content_too_long} diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 945e63e22..4afdf80af 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -425,7 +425,7 @@ def maybe_notify_mentioned_recipients( %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 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..59ed0a1fe --- /dev/null +++ b/test/web/activity_pub/object_validators/types/safe_text_test.exs @@ -0,0 +1,23 @@ +# 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.Web.ActivityPub.ObjectValidators.Types.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 "errors for non-text" do + assert :error == SafeText.cast(1) + end +end diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 2889a577c..19abac6a6 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -47,14 +47,14 @@ test "notifies the recipient" do recipient = insert(:user, local: true) {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") - {:ok, chat_message_object} = Object.create(chat_message_data) {:ok, create_activity_data, _meta} = - Builder.create(author, chat_message_object.data["id"], [recipient.ap_id]) + 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) + {: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 @@ -64,14 +64,17 @@ test "it creates a Chat for the local users and bumps the unread count" do recipient = insert(:user, local: true) {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") - {:ok, chat_message_object} = Object.create(chat_message_data) {:ok, create_activity_data, _meta} = - Builder.create(author, chat_message_object.data["id"], [recipient.ap_id]) + 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) + {: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) @@ -85,14 +88,14 @@ test "it creates a Chat for the local users and bumps the unread count" do recipient = insert(:user, local: true) {:ok, chat_message_data, _meta} = Builder.chat_message(author, recipient.ap_id, "hey") - {:ok, chat_message_object} = Object.create(chat_message_data) {:ok, create_activity_data, _meta} = - Builder.create(author, chat_message_object.data["id"], [recipient.ap_id]) + 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) + {: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) diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index a63a31e6e..ceaee614c 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -55,7 +55,8 @@ test "it rejects messages where the `to` field of activity and object don't matc data |> Map.put("to", author.ap_id) - {:error, _} = Transmogrifier.handle_incoming(data) + assert match?({:error, _}, Transmogrifier.handle_incoming(data)) + refute Object.get_by_ap_id(data["object"]["id"]) end test "it inserts it and creates a chat" do From abd09282292f7e902c77b158ae3d86e9bfd5b986 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 28 Apr 2020 16:45:28 +0200 Subject: [PATCH 056/492] CreateChatMessageValidator: Validate object existence --- .../create_chat_message_validator.ex | 14 +++++++++++++- test/web/activity_pub/object_validator_test.exs | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) 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 index 21c7a5ba4..dfc91bf71 100644 --- 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 @@ -5,10 +5,10 @@ # NOTES # - Can probably be a generic create validator # - doesn't embed, will only get the object id -# - object has to be validated first, maybe with some meta info from the surrounding create defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator do use Ecto.Schema + alias Pleroma.Object alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset @@ -43,6 +43,18 @@ def validate_data(cng, meta \\ []) do |> validate_required([:id, :actor, :to, :type, :object]) |> validate_inclusion(:type, ["Create"]) |> validate_recipients_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_recipients_match(cng, meta) do diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index bc2317e55..baa4b2585 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -1,6 +1,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do use Pleroma.DataCase + alias Pleroma.Object alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator @@ -9,6 +10,21 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do import Pleroma.Factory + 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["id"], [recipient.ap_id]) + + {:error, cng} = ObjectValidator.validate(create_data, []) + + assert {:object, {"The object to create already exists", []}} in cng.errors + end + end + describe "chat messages" do setup do clear_config([:instance, :remote_limit]) From dedffd100c231aa69d7a7f7cd7126b90a84fc1ec Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 28 Apr 2020 17:29:54 +0200 Subject: [PATCH 057/492] Pipeline: Unify, refactor, DRY. --- lib/pleroma/web/activity_pub/builder.ex | 4 +-- .../web/activity_pub/object_validator.ex | 18 ++++++++--- .../transmogrifier/chat_message_handling.ex | 31 ++++--------------- lib/pleroma/web/common_api/common_api.ex | 5 ++- .../activity_pub/object_validator_test.exs | 2 +- 5 files changed, 24 insertions(+), 36 deletions(-) diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 7576ed278..7f9c071b3 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -11,13 +11,13 @@ defmodule Pleroma.Web.ActivityPub.Builder do alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility - def create(actor, object_id, recipients) do + def create(actor, object, recipients) do {:ok, %{ "id" => Utils.generate_activity_id(), "actor" => actor.ap_id, "to" => recipients, - "object" => object_id, + "object" => object, "type" => "Create", "published" => DateTime.utc_now() |> DateTime.to_iso8601() }, []} diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index a4da9242a..bada3509d 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -38,16 +38,24 @@ def validate(%{"type" => "ChatMessage"} = object, meta) do end end - def validate(%{"type" => "Create"} = object, meta) do - with {:ok, object} <- - object + 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 - object = stringify_keys(object) - {:ok, object, meta} + create_activity = stringify_keys(create_activity) + {:ok, create_activity, 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() diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex index 043d847d1..d9c36e313 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex @@ -4,9 +4,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling do alias Pleroma.Repo - alias Pleroma.Web.ActivityPub.ObjectValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator alias Pleroma.Web.ActivityPub.Pipeline def handle_incoming( @@ -15,31 +12,15 @@ def handle_incoming( ) do # Create has to be run inside a transaction because the object is created as a side effect. # If this does not work, we need to roll back creating the activity. - case Repo.transaction(fn -> do_handle_incoming(data) end) do - {:ok, value} -> - value + case Repo.transaction(fn -> Pipeline.common_pipeline(data, local: false) end) do + {:ok, {:ok, activity, _}} -> + {:ok, activity} + + {:ok, e} -> + e {:error, e} -> {:error, e} end end - - def do_handle_incoming( - %{"type" => "Create", "object" => %{"type" => "ChatMessage"} = object_data} = data - ) do - with {_, {:ok, cast_data_sym}} <- - {:casting_data, data |> CreateChatMessageValidator.cast_and_apply()}, - cast_data = ObjectValidator.stringify_keys(cast_data_sym), - {_, {:ok, object_cast_data_sym}} <- - {:casting_object_data, object_data |> ChatMessageValidator.cast_and_apply()}, - object_cast_data = ObjectValidator.stringify_keys(object_cast_data_sym), - {_, {:ok, activity, _meta}} <- - {:common_pipeline, - Pipeline.common_pipeline(cast_data, local: false, object_data: object_cast_data)} do - {:ok, activity} - else - e -> - {:error, e} - end - end end diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index c39d1cee6..ef86ec1e4 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -40,12 +40,11 @@ def post_chat_message(%User{} = user, %User{} = recipient, content) do )}, {_, {:ok, create_activity_data, _meta}} <- {:build_create_activity, - Builder.create(user, chat_message_data["id"], [recipient.ap_id])}, + Builder.create(user, chat_message_data, [recipient.ap_id])}, {_, {:ok, %Activity{} = activity, _meta}} <- {:common_pipeline, Pipeline.common_pipeline(create_activity_data, - local: true, - object_data: chat_message_data + local: true )} do {:ok, activity} else diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index baa4b2585..41f67964a 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -17,7 +17,7 @@ test "it is invalid if the object already exists" do {:ok, activity} = CommonAPI.post_chat_message(user, recipient, "hey") object = Object.normalize(activity, false) - {:ok, create_data, _} = Builder.create(user, object.data["id"], [recipient.ap_id]) + {:ok, create_data, _} = Builder.create(user, object.data, [recipient.ap_id]) {:error, cng} = ObjectValidator.validate(create_data, []) From 67659afe487def6bd4e0ccfbf8d015fda2a8ac61 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 13:34:43 +0200 Subject: [PATCH 058/492] ChatOperation: Refactor. --- .../web/api_spec/operations/chat_operation.ex | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 59539e890..88b9db048 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -5,11 +5,12 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do alias OpenApiSpex.Operation alias OpenApiSpex.Schema - alias Pleroma.Web.ApiSpec.Helpers alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse alias Pleroma.Web.ApiSpec.Schemas.ChatResponse + 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") @@ -52,11 +53,7 @@ def index_operation do tags: ["chat"], summary: "Get a list of chats that you participated in", operationId: "ChatController.index", - parameters: [ - Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20), - Operation.parameter(:min_id, :query, :string, "Return only chats after this id"), - Operation.parameter(:max_id, :query, :string, "Return only chats before this id") - ], + parameters: pagination_params(), responses: %{ 200 => Operation.response("The chats of the user", "application/json", chats_response()) }, @@ -73,12 +70,9 @@ def messages_operation do 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"), - Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20), - Operation.parameter(:min_id, :query, :string, "Return only messages after this id"), - Operation.parameter(:max_id, :query, :string, "Return only messages before this id") - ], + parameters: + [Operation.parameter(:id, :path, :string, "The ID of the Chat")] ++ + pagination_params(), responses: %{ 200 => Operation.response( @@ -103,7 +97,7 @@ def post_chat_message_operation do parameters: [ Operation.parameter(:id, :path, :string, "The ID of the Chat") ], - requestBody: Helpers.request_body("Parameters", ChatMessageCreateRequest, required: true), + requestBody: request_body("Parameters", ChatMessageCreateRequest, required: true), responses: %{ 200 => Operation.response( From e055b8d2036e18a95d84f6f1db08fc465fe9975d Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 13:45:50 +0200 Subject: [PATCH 059/492] Pipeline: Always run common_pipeline in a transaction for now. --- lib/pleroma/web/activity_pub/pipeline.ex | 11 ++++ .../transmogrifier/chat_message_handling.ex | 12 ++--- lib/pleroma/web/common_api/common_api.ex | 52 ++++++++----------- .../transmogrifier/chat_message_test.exs | 1 + 4 files changed, 36 insertions(+), 40 deletions(-) diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 4213ba751..d5abb7567 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -5,6 +5,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do alias Pleroma.Activity alias Pleroma.Object + alias Pleroma.Repo alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.MRF alias Pleroma.Web.ActivityPub.ObjectValidator @@ -14,6 +15,16 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do @spec common_pipeline(map(), keyword()) :: {: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, value} -> + value + + {:error, e} -> + {:error, e} + end + end + + def do_common_pipeline(object, meta) do with {_, {:ok, validated_object, meta}} <- {:validate_object, ObjectValidator.validate(object, meta)}, {_, {:ok, mrfd_object}} <- {:mrf_object, MRF.filter(validated_object)}, diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex index d9c36e313..b1cc93481 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex @@ -3,24 +3,18 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling do - alias Pleroma.Repo alias Pleroma.Web.ActivityPub.Pipeline def handle_incoming( %{"type" => "Create", "object" => %{"type" => "ChatMessage"}} = data, _options ) do - # Create has to be run inside a transaction because the object is created as a side effect. - # If this does not work, we need to roll back creating the activity. - case Repo.transaction(fn -> Pipeline.common_pipeline(data, local: false) end) do - {:ok, {:ok, activity, _}} -> + case Pipeline.common_pipeline(data, local: false) do + {:ok, activity, _} -> {:ok, activity} - {:ok, e} -> + e -> e - - {:error, e} -> - {:error, e} end end end diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index ef86ec1e4..359045f48 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -9,7 +9,6 @@ defmodule Pleroma.Web.CommonAPI do alias Pleroma.FollowingRelationship alias Pleroma.Formatter alias Pleroma.Object - alias Pleroma.Repo alias Pleroma.ThreadMute alias Pleroma.User alias Pleroma.UserRelationship @@ -26,36 +25,27 @@ defmodule Pleroma.Web.CommonAPI do require Logger def post_chat_message(%User{} = user, %User{} = recipient, content) do - transaction = - Repo.transaction(fn -> - with {_, true} <- - {:content_length, - String.length(content) <= Pleroma.Config.get([:instance, :chat_limit])}, - {_, {:ok, chat_message_data, _meta}} <- - {:build_object, - Builder.chat_message( - user, - recipient.ap_id, - content |> Formatter.html_escape("text/plain") - )}, - {_, {: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} - else - {:content_length, false} -> {:error, :content_too_long} - e -> e - end - end) - - case transaction do - {:ok, value} -> value - error -> error + with {_, true} <- + {:content_length, + String.length(content) <= Pleroma.Config.get([:instance, :chat_limit])}, + {_, {:ok, chat_message_data, _meta}} <- + {:build_object, + Builder.chat_message( + user, + recipient.ap_id, + content |> Formatter.html_escape("text/plain") + )}, + {_, {: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} + else + {:content_length, false} -> {:error, :content_too_long} + e -> e end end diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index ceaee614c..c5600e84e 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -68,6 +68,7 @@ test "it inserts it and creates a chat" do 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] From 53e3063bd041409da83483e8f5c47030bf346123 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 13:52:23 +0200 Subject: [PATCH 060/492] Transmogrifier: Remove ChatMessageHandling module. --- lib/pleroma/web/activity_pub/side_effects.ex | 13 ++++-------- .../web/activity_pub/transmogrifier.ex | 14 +++++++++---- .../transmogrifier/chat_message_handling.ex | 20 ------------------- 3 files changed, 14 insertions(+), 33 deletions(-) delete mode 100644 lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 794a46267..e394c75d7 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -19,17 +19,12 @@ def handle(object, meta \\ []) # - Add like to object # - Set up notification def handle(%{data: %{"type" => "Like"}} = object, meta) do - {:ok, result} = - Pleroma.Repo.transaction(fn -> - liked_object = Object.get_by_ap_id(object.data["object"]) - Utils.add_like_to_object(object, liked_object) + liked_object = Object.get_by_ap_id(object.data["object"]) + Utils.add_like_to_object(object, liked_object) - Notification.create_notifications(object) + Notification.create_notifications(object) - {:ok, object, meta} - end) - - result + {:ok, object, meta} end # Tasks this handles diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 66975cf7d..3c2fe73a3 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -16,7 +16,6 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.Pipeline - alias Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.Federator @@ -646,9 +645,16 @@ def handle_incoming( def handle_incoming( %{"type" => "Create", "object" => %{"type" => "ChatMessage"}} = data, - options - ), - do: ChatMessageHandling.handle_incoming(data, options) + _options + ) do + case Pipeline.common_pipeline(data, local: false) do + {:ok, activity, _} -> + {:ok, activity} + + e -> + e + end + end def handle_incoming(%{"type" => "Like"} = data, _options) do with {_, {:ok, cast_data_sym}} <- diff --git a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex b/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex deleted file mode 100644 index b1cc93481..000000000 --- a/lib/pleroma/web/activity_pub/transmogrifier/chat_message_handling.ex +++ /dev/null @@ -1,20 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageHandling do - alias Pleroma.Web.ActivityPub.Pipeline - - def handle_incoming( - %{"type" => "Create", "object" => %{"type" => "ChatMessage"}} = data, - _options - ) do - case Pipeline.common_pipeline(data, local: false) do - {:ok, activity, _} -> - {:ok, activity} - - e -> - e - end - end -end From a88734a0a22810bcc47c17fc9120ef7881d670d8 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 14:25:33 +0200 Subject: [PATCH 061/492] Transmogrifier: Fetch missing actors for chatmessages. --- .../web/activity_pub/object_validator.ex | 9 ++++- .../create_chat_message_validator.ex | 2 + .../web/activity_pub/transmogrifier.ex | 8 ++-- .../transmogrifier/chat_message_test.exs | 40 ++++++++++++++++--- 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index bada3509d..50904ed59 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator @@ -67,8 +68,14 @@ def stringify_keys(object) do |> Map.new(fn {key, val} -> {to_string(key), val} end) end + def fetch_actor(object) do + with {:ok, actor} <- Types.ObjectID.cast(object["actor"]) do + User.get_or_fetch_by_ap_id(actor) + end + end + def fetch_actor_and_object(object) do - User.get_or_fetch_by_ap_id(object["actor"]) + fetch_actor(object) Object.normalize(object["object"]) :ok 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 index dfc91bf71..88e903182 100644 --- 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 @@ -12,6 +12,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator do alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @primary_key false @@ -42,6 +43,7 @@ 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_object_nonexistence() end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 3c2fe73a3..6dbd3f588 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -647,10 +647,10 @@ def handle_incoming( %{"type" => "Create", "object" => %{"type" => "ChatMessage"}} = data, _options ) do - case Pipeline.common_pipeline(data, local: false) do - {:ok, activity, _} -> - {:ok, activity} - + with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), + {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do + {:ok, activity} + else e -> e end diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index c5600e84e..85644d787 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -26,8 +26,15 @@ test "it rejects messages that don't contain content" do data |> Map.put("object", object) - _author = insert(:user, ap_id: data["actor"], local: false) - _recipient = insert(:user, ap_id: List.first(data["to"]), local: true) + _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 @@ -37,8 +44,15 @@ test "it rejects messages that don't concern local users" do File.read!("test/fixtures/create-chat-message.json") |> Poison.decode!() - _author = insert(:user, ap_id: data["actor"], local: false) - _recipient = insert(:user, ap_id: List.first(data["to"]), local: false) + _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 @@ -59,12 +73,28 @@ test "it rejects messages where the `to` field of activity and object don't matc 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) + 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) From 20587aa931262a5479c98f13450311a135c5d356 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 14:53:53 +0200 Subject: [PATCH 062/492] Chat message creation: Check actor. --- .../create_chat_message_validator.ex | 14 ++++++++++++++ test/web/activity_pub/object_validator_test.exs | 13 +++++++++++++ 2 files changed, 27 insertions(+) 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 index 88e903182..fc582400b 100644 --- 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 @@ -45,6 +45,7 @@ def validate_data(cng, meta \\ []) do |> validate_inclusion(:type, ["Create"]) |> validate_actor_presence() |> validate_recipients_match(meta) + |> validate_actors_match(meta) |> validate_object_nonexistence() end @@ -59,6 +60,19 @@ def validate_object_nonexistence(cng) do 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"] || [] diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 41f67964a..475b7bb21 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -23,6 +23,19 @@ test "it is invalid if the object already exists" do 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 From 528ea779a61d12f74ee9669bbd28783bf66aa5cc Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 17:56:24 +0000 Subject: [PATCH 063/492] Apply suggestion to docs/API/chats.md --- docs/API/chats.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 24c4b4d06..26e83570e 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -99,7 +99,7 @@ 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 +pagination options are implemented. Returned data: From 89a6c340812a53daf00a203dacd8e12a25eb7ad2 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 18:14:34 +0000 Subject: [PATCH 064/492] Apply suggestion to lib/pleroma/chat.ex --- lib/pleroma/chat.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index b8545063a..6b1f832ce 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -29,7 +29,7 @@ def creation_cng(struct, params) do |> validate_change(:recipient, fn :recipient, recipient -> case User.get_cached_by_ap_id(recipient) do - nil -> [recipient: "must a an existing user"] + nil -> [recipient: "must be an existing user"] _ -> [] end end) From 589ce1e96bcaba0bd2d864d3528992f10f4cf5f7 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 19:47:16 +0000 Subject: [PATCH 065/492] Apply suggestion to lib/pleroma/web/activity_pub/transmogrifier.ex --- lib/pleroma/web/activity_pub/transmogrifier.ex | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 6dbd3f588..d3a2e0362 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -650,9 +650,6 @@ def handle_incoming( with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do {:ok, activity} - else - e -> - e end end From 145d35ff70a59efcff881315d5f1f7a0248a34be Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 19:49:03 +0000 Subject: [PATCH 066/492] Apply suggestion to lib/pleroma/web/pleroma_api/controllers/chat_controller.ex --- lib/pleroma/web/pleroma_api/controllers/chat_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 8654f4295..175257921 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -31,7 +31,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do %{scopes: ["read:statuses"]} when action in [:messages, :index] ) - plug(OpenApiSpex.Plug.CastAndValidate) + plug(OpenApiSpex.Plug.CastAndValidate, render_error: Pleroma.Web.ApiSpec.RenderError) defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation From b68d56c8168f27f63e157d43558e22f7c221c0e2 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 29 Apr 2020 19:49:13 +0000 Subject: [PATCH 067/492] Apply suggestion to lib/pleroma/web/api_spec/schemas/chat_message_response.ex --- lib/pleroma/web/api_spec/schemas/chat_message_response.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex index b7a662cbb..707c9808b 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message_response.ex @@ -16,7 +16,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse do account_id: %Schema{type: :string, description: "The Mastodon API id of the actor"}, chat_id: %Schema{type: :string}, content: %Schema{type: :string}, - created_at: %Schema{type: :string, format: :datetime}, + created_at: %Schema{type: :string, format: :"date-time"}, emojis: %Schema{type: :array} }, example: %{ From ad2182bbd231b475c5bfc70485f35ad1f8841912 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 30 Apr 2020 11:38:26 +0000 Subject: [PATCH 068/492] Apply suggestion to lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex --- lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex b/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex index 4dafcda43..8e1b7af14 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest do properties: %{ content: %Schema{type: :string, description: "The content of your message"} }, + required: [:content], example: %{ "content" => "Hey wanna buy feet pics?" } From a35b76431ce7c7bd7ed62374d781778922f0fe2f Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 3 May 2020 14:58:24 +0200 Subject: [PATCH 069/492] Credo fixes. --- lib/pleroma/web/activity_pub/object_validator.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 50904ed59..20c7cceb6 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -11,10 +11,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Object alias Pleroma.User - alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.Types @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()} def validate(object, meta) From 9249742f13445f47167d4b352751c49caf48aa8f Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 3 May 2020 15:28:24 +0200 Subject: [PATCH 070/492] Types.Recipients: Simplify reducer. --- .../object_validators/types/recipients.ex | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex index 48fe61e1a..408e0f6ee 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex +++ b/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex @@ -11,11 +11,13 @@ def cast(object) when is_binary(object) do 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]} + |> Enum.reduce_while({:ok, []}, fn element, {:ok, list} -> + case ObjectID.cast(element) do + {:ok, id} -> + {:cont, {:ok, [id | list]}} + + _ -> + {:halt, :error} end end) end From 651935f1379a1ed3c89e473803251310c13ea571 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 4 May 2020 11:08:00 +0200 Subject: [PATCH 071/492] Schemas: Refactor to our naming scheme. --- .../web/api_spec/operations/chat_operation.ex | 12 ++++++------ .../api_spec/schemas/{chat_response.ex => chat.ex} | 4 ++-- .../{chat_message_response.ex => chat_message.ex} | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) rename lib/pleroma/web/api_spec/schemas/{chat_response.ex => chat.ex} (96%) rename lib/pleroma/web/api_spec/schemas/{chat_message_response.ex => chat_message.ex} (91%) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 88b9db048..fc9d4608a 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -6,8 +6,8 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do alias OpenApiSpex.Operation alias OpenApiSpex.Schema alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest - alias Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse - alias Pleroma.Web.ApiSpec.Schemas.ChatResponse + alias Pleroma.Web.ApiSpec.Schemas.ChatMessage + alias Pleroma.Web.ApiSpec.Schemas.Chat import Pleroma.Web.ApiSpec.Helpers @@ -37,7 +37,7 @@ def create_operation do Operation.response( "The created or existing chat", "application/json", - ChatResponse + Chat ) }, security: [ @@ -103,7 +103,7 @@ def post_chat_message_operation do Operation.response( "The newly created ChatMessage", "application/json", - ChatMessageResponse + ChatMessage ) }, security: [ @@ -119,7 +119,7 @@ def chats_response do title: "ChatsResponse", description: "Response schema for multiple Chats", type: :array, - items: ChatResponse, + items: Chat, example: [ %{ "account" => %{ @@ -180,7 +180,7 @@ def chat_messages_response do title: "ChatMessagesResponse", description: "Response schema for multiple ChatMessages", type: :array, - items: ChatMessageResponse, + items: ChatMessage, example: [ %{ "emojis" => [ diff --git a/lib/pleroma/web/api_spec/schemas/chat_response.ex b/lib/pleroma/web/api_spec/schemas/chat.ex similarity index 96% rename from lib/pleroma/web/api_spec/schemas/chat_response.ex rename to lib/pleroma/web/api_spec/schemas/chat.ex index aa435165d..4d385d6ab 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_response.ex +++ b/lib/pleroma/web/api_spec/schemas/chat.ex @@ -2,13 +2,13 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ApiSpec.Schemas.ChatResponse do +defmodule Pleroma.Web.ApiSpec.Schemas.Chat do alias OpenApiSpex.Schema require OpenApiSpex OpenApiSpex.schema(%{ - title: "ChatResponse", + title: "Chat", description: "Response schema for a Chat", type: :object, properties: %{ diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex b/lib/pleroma/web/api_spec/schemas/chat_message.ex similarity index 91% rename from lib/pleroma/web/api_spec/schemas/chat_message_response.ex rename to lib/pleroma/web/api_spec/schemas/chat_message.ex index 707c9808b..7c93b0c83 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message_response.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message.ex @@ -2,13 +2,13 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageResponse do +defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do alias OpenApiSpex.Schema require OpenApiSpex OpenApiSpex.schema(%{ - title: "ChatMessageResponse", + title: "ChatMessage", description: "Response schema for a ChatMessage", type: :object, properties: %{ From dcf535fe770b638b68928f238f4d8d1cfd410524 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 4 May 2020 11:32:11 +0200 Subject: [PATCH 072/492] Credo fixes. --- lib/pleroma/web/api_spec/operations/chat_operation.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index fc9d4608a..ad05f5ac7 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -5,9 +5,9 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do alias OpenApiSpex.Operation alias OpenApiSpex.Schema - alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest - alias Pleroma.Web.ApiSpec.Schemas.ChatMessage alias Pleroma.Web.ApiSpec.Schemas.Chat + alias Pleroma.Web.ApiSpec.Schemas.ChatMessage + alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest import Pleroma.Web.ApiSpec.Helpers From 57e6f2757afef8941fe3576dbe5e2014d2569c33 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 4 May 2020 12:47:23 +0200 Subject: [PATCH 073/492] ChatOperation: Make simple schema into inline schema --- .../web/api_spec/operations/chat_operation.ex | 18 ++++++++++++++-- .../schemas/chat_message_create_request.ex | 21 ------------------- 2 files changed, 16 insertions(+), 23 deletions(-) delete mode 100644 lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index ad05f5ac7..e8b5eff1f 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -7,7 +7,6 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do alias OpenApiSpex.Schema alias Pleroma.Web.ApiSpec.Schemas.Chat alias Pleroma.Web.ApiSpec.Schemas.ChatMessage - alias Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest import Pleroma.Web.ApiSpec.Helpers @@ -97,7 +96,7 @@ def post_chat_message_operation do parameters: [ Operation.parameter(:id, :path, :string, "The ID of the Chat") ], - requestBody: request_body("Parameters", ChatMessageCreateRequest, required: true), + requestBody: request_body("Parameters", chat_message_create(), required: true), responses: %{ 200 => Operation.response( @@ -208,4 +207,19 @@ def chat_messages_response do ] } 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"} + }, + required: [:content], + example: %{ + "content" => "Hey wanna buy feet pics?" + } + } + end end diff --git a/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex b/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex deleted file mode 100644 index 8e1b7af14..000000000 --- a/lib/pleroma/web/api_spec/schemas/chat_message_create_request.ex +++ /dev/null @@ -1,21 +0,0 @@ -# Pleroma: A lightweight social networking server -# Copyright © 2017-2020 Pleroma Authors -# SPDX-License-Identifier: AGPL-3.0-only - -defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessageCreateRequest do - alias OpenApiSpex.Schema - require OpenApiSpex - - OpenApiSpex.schema(%{ - title: "ChatMessageCreateRequest", - description: "POST body for creating an chat message", - type: :object, - properties: %{ - content: %Schema{type: :string, description: "The content of your message"} - }, - required: [:content], - example: %{ - "content" => "Hey wanna buy feet pics?" - } - }) -end From 30590cf46b88d0008c9a7163b8339aa9376f2378 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 4 May 2020 12:53:40 +0200 Subject: [PATCH 074/492] CommonAPI: Refactor for readability --- lib/pleroma/web/common_api/common_api.ex | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 1eda0b2f2..e428cc17d 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -26,9 +26,7 @@ defmodule Pleroma.Web.CommonAPI do require Logger def post_chat_message(%User{} = user, %User{} = recipient, content) do - with {_, true} <- - {:content_length, - String.length(content) <= Pleroma.Config.get([:instance, :chat_limit])}, + with :ok <- validate_chat_content_length(content), {_, {:ok, chat_message_data, _meta}} <- {:build_object, Builder.chat_message( @@ -44,9 +42,14 @@ def post_chat_message(%User{} = user, %User{} = recipient, content) do local: true )} do {:ok, activity} + end + end + + defp validate_chat_content_length(content) do + if String.length(content) <= Pleroma.Config.get([:instance, :chat_limit]) do + :ok else - {:content_length, false} -> {:error, :content_too_long} - e -> e + {:error, :content_too_long} end end From b04328c3dec4812dbaf3cd89baa2b888d7bb7fbf Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 4 May 2020 13:10:36 +0200 Subject: [PATCH 075/492] ChatController: Add mark_as_read --- lib/pleroma/chat.ex | 6 +++++ .../web/api_spec/operations/chat_operation.ex | 22 ++++++++++++++++++ .../controllers/chat_controller.ex | 11 ++++++++- lib/pleroma/web/router.ex | 1 + .../controllers/chat_controller_test.exs | 23 +++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 6b1f832ce..6008196e4 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -60,4 +60,10 @@ def bump_or_create(user_id, recipient) do conflict_target: [:user_id, :recipient] ) end + + def mark_as_read(chat) do + chat + |> change(%{unread: 0}) + |> Repo.update() + end end diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index e8b5eff1f..0fe0e07b2 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -16,6 +16,28 @@ def open_api_operation(action) do 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")], + responses: %{ + 200 => + Operation.response( + "The updated chat", + "application/json", + Chat + ) + }, + security: [ + %{ + "oAuth" => ["write"] + } + ] + } + end + def create_operation do %Operation{ tags: ["chat"], diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 175257921..bedae73bd 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -23,7 +23,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do plug( OAuthScopesPlug, - %{scopes: ["write:statuses"]} when action in [:post_chat_message, :create] + %{scopes: ["write:statuses"]} when action in [:post_chat_message, :create, :mark_as_read] ) plug( @@ -51,6 +51,15 @@ def post_chat_message( end end + def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do + with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), + {:ok, chat} <- Chat.mark_as_read(chat) 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 messages = diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 3a5063d4a..d6803e8ac 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -293,6 +293,7 @@ defmodule Pleroma.Web.Router do get("/chats", ChatController, :index) get("/chats/:id/messages", ChatController, :messages) post("/chats/:id/messages", ChatController, :post_chat_message) + post("/chats/:id/read", ChatController, :mark_as_read) end scope [] do diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index b1044574b..cdb2683c8 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -9,6 +9,29 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do import Pleroma.Factory + describe "POST /api/v1/pleroma/chats/:id/read" do + setup do: oauth_access(["write:statuses"]) + + test "it marks all messages in a chat as read", %{conn: conn, user: user} do + other_user = insert(:user) + + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + + assert chat.unread == 1 + + result = + conn + |> post("/api/v1/pleroma/chats/#{chat.id}/read") + |> json_response_and_validate_schema(200) + + assert result["unread"] == 0 + + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + + assert chat.unread == 0 + end + end + describe "POST /api/v1/pleroma/chats/:id/messages" do setup do: oauth_access(["write:statuses"]) From 7ff2a7dae2fa651cea579aeca40e2c030d19fcd5 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 4 May 2020 13:12:21 +0200 Subject: [PATCH 076/492] Docs: Add Chat mark_as_read docs --- docs/API/chats.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/API/chats.md b/docs/API/chats.md index 26e83570e..8d925989c 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -66,6 +66,27 @@ Returned data: } ``` +### Marking a chat as read + +To set the `unread` count of a chat to 0, call + +`POST /api/v1/pleroma/chats/:id/read` + +Returned data: + +```json +{ + "account": { + "id": "someflakeid", + "username": "somenick", + ... + }, + "id" : "1", + "unread" : 0 +} +``` + + ### Getting a list of Chats `GET /api/v1/pleroma/chats` From 9637cded21cef1e6c531dd46d5f5245c4c3ed03c Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 5 May 2020 20:07:47 +0200 Subject: [PATCH 077/492] Chat: Fix missing chat id on second 'get' --- lib/pleroma/chat.ex | 3 ++- test/chat_test.exs | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 6008196e4..1a092b992 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -46,7 +46,8 @@ def get_or_create(user_id, recipient) do %__MODULE__{} |> creation_cng(%{user_id: user_id, recipient: recipient}) |> Repo.insert( - on_conflict: :nothing, + # Need to set something, otherwise we get nothing back at all + on_conflict: [set: [recipient: recipient]], returning: true, conflict_target: [:user_id, :recipient] ) diff --git a/test/chat_test.exs b/test/chat_test.exs index 952598c87..943e48111 100644 --- a/test/chat_test.exs +++ b/test/chat_test.exs @@ -26,13 +26,24 @@ test "it creates a chat for a user and recipient" do assert chat.id end - test "it returns a chat for a user and recipient if it already exists" do + 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 + assert chat_two.unread == 2 + 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 From 20baa2eaf04425cf0a2eebc84760be6c12ee7f51 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 6 May 2020 16:12:36 +0200 Subject: [PATCH 078/492] ChatMessages: Add attachments. --- lib/pleroma/web/activity_pub/builder.ex | 33 ++++++--- .../web/activity_pub/object_validator.ex | 11 ++- .../object_validators/attachment_validator.ex | 72 +++++++++++++++++++ .../chat_message_validator.ex | 6 +- .../object_validators/url_object_validator.ex | 20 ++++++ .../web/api_spec/operations/chat_operation.ex | 3 +- .../web/api_spec/schemas/chat_message.ex | 6 +- lib/pleroma/web/common_api/common_api.ex | 6 +- .../controllers/chat_controller.ex | 6 +- .../pleroma_api/views/chat_message_view.ex | 5 +- .../activity_pub/object_validator_test.exs | 50 ++++++++++++- .../types/object_id_test.exs | 4 ++ .../controllers/chat_controller_test.exs | 27 +++++++ .../views/chat_message_view_test.exs | 12 +++- 14 files changed, 237 insertions(+), 24 deletions(-) create mode 100644 lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex create mode 100644 lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 7f9c071b3..67e65c7b9 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -23,17 +23,28 @@ def create(actor, object, recipients) do }, []} end - def chat_message(actor, recipient, content) do - {:ok, - %{ - "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) - }, []} + 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 like(User.t(), Object.t()) :: {:ok, map(), keyword()} diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 20c7cceb6..d6c14f7b8 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -63,11 +63,18 @@ def stringify_keys(%{__struct__: _} = object) do |> 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 User.get_or_fetch_by_ap_id(actor) 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..16ed49051 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.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.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) + 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 + |> Map.put_new("mediaType", data["mimeType"]) + 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/chat_message_validator.ex b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex index e87c1ac2e..99ffeba28 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator import Ecto.Changeset import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1] @@ -22,6 +23,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do field(:actor, Types.ObjectID) field(:published, Types.DateTime) field(:emoji, :map, default: %{}) + + embeds_one(:attachment, AttachmentValidator) end def cast_and_apply(data) do @@ -51,7 +54,8 @@ def changeset(struct, data) do data = fix(data) struct - |> cast(data, __schema__(:fields)) + |> cast(data, List.delete(__schema__(:fields), :attachment)) + |> cast_embed(:attachment) end def validate_data(data_cng) do 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..47e231150 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex @@ -0,0 +1,20 @@ +defmodule Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator do + use Ecto.Schema + + alias Pleroma.Web.ActivityPub.ObjectValidators.Types + + import Ecto.Changeset + @primary_key false + + embedded_schema do + field(:type, :string) + field(:href, Types.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/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 0fe0e07b2..8b9dc2e44 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -236,7 +236,8 @@ def chat_message_create do description: "POST body for creating an chat message", type: :object, properties: %{ - content: %Schema{type: :string, description: "The content of your message"} + content: %Schema{type: :string, description: "The content of your message"}, + media_id: %Schema{type: :string, description: "The id of an upload"} }, required: [:content], example: %{ diff --git a/lib/pleroma/web/api_spec/schemas/chat_message.ex b/lib/pleroma/web/api_spec/schemas/chat_message.ex index 7c93b0c83..89e062ddd 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message.ex @@ -17,7 +17,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do chat_id: %Schema{type: :string}, content: %Schema{type: :string}, created_at: %Schema{type: :string, format: :"date-time"}, - emojis: %Schema{type: :array} + emojis: %Schema{type: :array}, + attachment: %Schema{type: :object, nullable: true} }, example: %{ "account_id" => "someflakeid", @@ -32,7 +33,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do "url" => "https://dontbulling.me/emoji/Firefox.gif" } ], - "id" => "14" + "id" => "14", + "attachment" => nil } }) end diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index e428cc17d..38b5c6f7c 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -25,14 +25,16 @@ defmodule Pleroma.Web.CommonAPI do require Pleroma.Constants require Logger - def post_chat_message(%User{} = user, %User{} = recipient, content) do + def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) do with :ok <- validate_chat_content_length(content), + maybe_attachment <- opts[:media_id] && Object.get_by_id(opts[:media_id]), {_, {:ok, chat_message_data, _meta}} <- {:build_object, Builder.chat_message( user, recipient.ap_id, - content |> Formatter.html_escape("text/plain") + content |> Formatter.html_escape("text/plain"), + attachment: maybe_attachment )}, {_, {:ok, create_activity_data, _meta}} <- {:build_create_activity, Builder.create(user, chat_message_data, [recipient.ap_id])}, diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index bedae73bd..450d85332 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -36,14 +36,16 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation def post_chat_message( - %{body_params: %{content: content}, assigns: %{user: %{id: user_id} = user}} = conn, + %{body_params: %{content: content} = 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, content), + {:ok, activity} <- + CommonAPI.post_chat_message(user, recipient, content, media_id: params[:media_id]), message <- Object.normalize(activity) do conn |> put_view(ChatMessageView) diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex index a821479ab..b088a8734 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_view.ex @@ -23,7 +23,10 @@ def render( 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"]) + emojis: StatusView.build_emojis(chat_message["emoji"]), + attachment: + chat_message["attachment"] && + StatusView.render("attachment.json", attachment: chat_message["attachment"]) } end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 60db7187f..951ed7800 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -2,14 +2,41 @@ 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.LikeValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI import Pleroma.Factory + describe "attachments" do + 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 + end + end + describe "chat message create activities" do test "it is invalid if the object already exists" do user = insert(:user) @@ -52,7 +79,28 @@ test "it is invalid if the object data has a different `to` or `actor` field" do 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 object == 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 "does not validate if the message is longer than the remote_limit", %{ 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..c8911948e 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,3 +1,7 @@ +# 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 use Pleroma.DataCase diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index cdb2683c8..72a9a91ff 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do alias Pleroma.Chat alias Pleroma.Web.CommonAPI + alias Pleroma.Web.ActivityPub.ActivityPub import Pleroma.Factory @@ -49,6 +50,32 @@ test "it posts a message to the chat", %{conn: conn, user: user} do assert result["content"] == "Hallo!!" assert result["chat_id"] == chat.id |> to_string() 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", %{ + "content" => "Hallo!!", + "media_id" => to_string(upload.id) + }) + |> json_response_and_validate_schema(200) + + assert result["content"] == "Hallo!!" + assert result["chat_id"] == chat.id |> to_string() + end end describe "GET /api/v1/pleroma/chats/:id/messages" do diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_view_test.exs index 5c4c8b0d5..a13a41daa 100644 --- a/test/web/pleroma_api/views/chat_message_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_view_test.exs @@ -9,12 +9,21 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageViewTest do alias Pleroma.Object alias Pleroma.Web.CommonAPI alias Pleroma.Web.PleromaAPI.ChatMessageView + alias Pleroma.Web.ActivityPub.ActivityPub 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) @@ -30,7 +39,7 @@ test "it displays a chat message" do assert chat_message[:created_at] assert match?([%{shortcode: "firefox"}], chat_message[:emojis]) - {:ok, activity} = CommonAPI.post_chat_message(recipient, user, "gkgkgk") + {:ok, activity} = CommonAPI.post_chat_message(recipient, user, "gkgkgk", media_id: upload.id) object = Object.normalize(activity) @@ -40,5 +49,6 @@ test "it displays a chat message" do 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] end end From fc9d0b6eec1b206a27f4ec19f7939b3318a209ef Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 6 May 2020 16:31:21 +0200 Subject: [PATCH 079/492] Credo fixes. --- .../activity_pub/object_validators/chat_message_validator.ex | 2 +- test/web/activity_pub/object_validator_test.exs | 2 +- test/web/pleroma_api/controllers/chat_controller_test.exs | 2 +- test/web/pleroma_api/views/chat_message_view_test.exs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 index 99ffeba28..e40c80ab4 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -6,8 +6,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do use Ecto.Schema alias Pleroma.User - alias Pleroma.Web.ActivityPub.ObjectValidators.Types alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1] diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 951ed7800..fcc54c8a1 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -5,8 +5,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.ActivityPub.ObjectValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator + alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.CommonAPI diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 72a9a91ff..b4b73da90 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -5,8 +5,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true alias Pleroma.Chat - alias Pleroma.Web.CommonAPI alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.CommonAPI import Pleroma.Factory diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_view_test.exs index a13a41daa..d7a2d10a5 100644 --- a/test/web/pleroma_api/views/chat_message_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_view_test.exs @@ -7,9 +7,9 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageViewTest do alias Pleroma.Chat alias Pleroma.Object + alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI alias Pleroma.Web.PleromaAPI.ChatMessageView - alias Pleroma.Web.ActivityPub.ActivityPub import Pleroma.Factory From d0bf8cfb8f852a16259af4b808565cdfd58f5e61 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 8 May 2020 14:11:58 +0200 Subject: [PATCH 080/492] Credo fixes. --- lib/pleroma/web/activity_pub/side_effects.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 28b519432..c8b675d54 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -5,8 +5,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do liked object, a `Follow` activity will add the user to the follower collection, and so on. """ - alias Pleroma.Chat alias Pleroma.Activity + alias Pleroma.Chat alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo From 03529f6a0528ed01c7a956bb80628910584a9580 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 8 May 2020 18:26:35 +0200 Subject: [PATCH 081/492] Transmogrifier: Don't modify attachments for chats. --- lib/pleroma/web/activity_pub/transmogrifier.ex | 3 +++ test/web/common_api/common_api_test.exs | 2 ++ 2 files changed, 5 insertions(+) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 29f668cad..f04dec6be 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -1114,6 +1114,9 @@ def add_attributed_to(object) 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/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 61affda5d..5501ba18b 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -54,6 +54,8 @@ test "it posts a chat message" do 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 From 0c2b09a9ba771b3b04a0a08ed940823bd8601a9f Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Fri, 8 May 2020 22:08:11 +0300 Subject: [PATCH 082/492] Add migration for counter_cache table update --- ...00508092434_update_counter_cache_table.exs | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 priv/repo/migrations/20200508092434_update_counter_cache_table.exs 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..81a8d6397 --- /dev/null +++ b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs @@ -0,0 +1,144 @@ +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 + token_id smallint; + hostname character varying(255); + visibility_new character varying(64); + visibility_old character varying(64); + actor character varying(255); + BEGIN + SELECT "tokid" INTO "token_id" FROM ts_token_type('default') WHERE "alias" = 'host'; + IF TG_OP = 'DELETE' THEN + actor := OLD.actor; + ELSE + actor := NEW.actor; + END IF; + SELECT "token" INTO "hostname" FROM ts_parse('default', actor) WHERE "tokid" = token_id; + IF hostname IS NULL THEN + hostname := split_part(actor, '/', 3); + END IF; + IF TG_OP = 'INSERT' THEN + visibility_new := activity_visibility(NEW.actor, NEW.recipients, NEW.data); + IF NEW.data->>'type' = 'Create' 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 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 From 39d2f2118aed7906cb352d8a37f22da73f3a3aa3 Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 9 May 2020 01:20:50 +0300 Subject: [PATCH 083/492] update counter_cache logic --- .../tasks/pleroma/refresh_counter_cache.ex | 42 ++++++++---- lib/pleroma/counter_cache.ex | 66 +++++++++++++++---- lib/pleroma/stats.ex | 8 +-- 3 files changed, 82 insertions(+), 34 deletions(-) diff --git a/lib/mix/tasks/pleroma/refresh_counter_cache.ex b/lib/mix/tasks/pleroma/refresh_counter_cache.ex index 15b4dbfa6..280201bef 100644 --- a/lib/mix/tasks/pleroma/refresh_counter_cache.ex +++ b/lib/mix/tasks/pleroma/refresh_counter_cache.ex @@ -17,30 +17,46 @@ 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}") + Activity + |> distinct([a], true) + |> select([a], fragment("split_part(?, '/', 3)", a.actor)) + |> Repo.all() + |> Enum.each(fn instance -> + counters = instance_counters(instance) + CounterCache.set(instance, counters) + Mix.Pleroma.shell_info("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], like(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/pleroma/counter_cache.ex b/lib/pleroma/counter_cache.ex index 4d348a413..b469e7b50 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_as_map() do + CounterCache + |> select([c], %{ + "public" => sum(c.public), + "unlisted" => sum(c.unlisted), + "private" => sum(c.private), + "direct" => sum(c.direct) + }) + |> 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/stats.ex b/lib/pleroma/stats.ex index 6b3a8a41f..4e355bd5c 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -98,13 +98,7 @@ def calculate_stat_data 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" - ]) + counter_cache = CounterCache.get_as_map() %{ public: counter_cache["status_visibility_public"] || 0, From cbe383ae832f13d5d2a20ee8fb5e85498205fbc3 Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 9 May 2020 11:30:37 +0300 Subject: [PATCH 084/492] Update stats admin endpoint --- lib/pleroma/counter_cache.ex | 6 +- lib/pleroma/stats.ex | 15 ++--- .../web/admin_api/admin_api_controller.ex | 7 +-- ...00508092434_update_counter_cache_table.exs | 8 ++- test/stats_test.exs | 55 ++++++++++++++++--- .../admin_api/admin_api_controller_test.exs | 20 +++++++ 6 files changed, 87 insertions(+), 24 deletions(-) diff --git a/lib/pleroma/counter_cache.ex b/lib/pleroma/counter_cache.ex index b469e7b50..a940b5e50 100644 --- a/lib/pleroma/counter_cache.ex +++ b/lib/pleroma/counter_cache.ex @@ -40,7 +40,7 @@ def get_by_instance(instance) do end end - def get_as_map() do + def get_sum() do CounterCache |> select([c], %{ "public" => sum(c.public), @@ -49,6 +49,10 @@ def get_as_map() do "direct" => sum(c.direct) }) |> Repo.one() + |> Enum.map(fn {visibility, dec_count} -> + {visibility, Decimal.to_integer(dec_count)} + end) + |> Enum.into(%{}) end def set(instance, values) do diff --git a/lib/pleroma/stats.ex b/lib/pleroma/stats.ex index 4e355bd5c..9a03f01db 100644 --- a/lib/pleroma/stats.ex +++ b/lib/pleroma/stats.ex @@ -97,14 +97,11 @@ def calculate_stat_data do } end - def get_status_visibility_count do - counter_cache = CounterCache.get_as_map() - - %{ - 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/web/admin_api/admin_api_controller.ex b/lib/pleroma/web/admin_api/admin_api_controller.ex index 9f1fd3aeb..4db9f4cac 100644 --- a/lib/pleroma/web/admin_api/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/admin_api_controller.ex @@ -1122,11 +1122,10 @@ def oauth_app_delete(conn, params) do end end - def stats(conn, _) do - count = Stats.get_status_visibility_count() + def stats(conn, params) do + counters = Stats.get_status_visibility_count(params["instance"]) - conn - |> json(%{"status_visibility" => count}) + json(conn, %{"status_visibility" => counters}) end defp errors(conn, {:error, :not_found}) do diff --git a/priv/repo/migrations/20200508092434_update_counter_cache_table.exs b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs index 81a8d6397..3d9bfc877 100644 --- a/priv/repo/migrations/20200508092434_update_counter_cache_table.exs +++ b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs @@ -43,7 +43,8 @@ def up do END IF; IF TG_OP = 'INSERT' THEN visibility_new := activity_visibility(NEW.actor, NEW.recipients, NEW.data); - IF NEW.data->>'type' = 'Create' THEN + 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) @@ -53,7 +54,10 @@ def up do 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 THEN + 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 diff --git a/test/stats_test.exs b/test/stats_test.exs index c1aeb2c7f..33ed0b7dd 100644 --- a/test/stats_test.exs +++ b/test/stats_test.exs @@ -17,10 +17,11 @@ test "it ignores internal users" 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 @@ test "on new status" 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 @@ test "doesn't count unrelated activities" 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/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 4697af50e..c3de89ac0 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -3612,6 +3612,26 @@ test "status visibility count", %{conn: conn} do 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 describe "POST /api/pleroma/admin/oauth_app" do From 01b06d6dbfdeff7e1733d575fb94eee4dafbb56a Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 9 May 2020 11:43:31 +0300 Subject: [PATCH 085/492] Show progress in refresh_counter_cache task --- .../tasks/pleroma/refresh_counter_cache.ex | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/mix/tasks/pleroma/refresh_counter_cache.ex b/lib/mix/tasks/pleroma/refresh_counter_cache.ex index 280201bef..b44e2545d 100644 --- a/lib/mix/tasks/pleroma/refresh_counter_cache.ex +++ b/lib/mix/tasks/pleroma/refresh_counter_cache.ex @@ -17,14 +17,21 @@ defmodule Mix.Tasks.Pleroma.RefreshCounterCache do def run([]) do Mix.Pleroma.start_pleroma() - Activity - |> distinct([a], true) - |> select([a], fragment("split_part(?, '/', 3)", a.actor)) - |> Repo.all() - |> Enum.each(fn instance -> + 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("Setting #{instance} counters: #{inspect(counters)}") + + Mix.Pleroma.shell_info( + "[#{i}/#{length(instances)}] Setting #{instance} counters: #{inspect(counters)}" + ) end) Mix.Pleroma.shell_info("Done") From 5c368b004b1a736836d4bc9f68c54714a33056cd Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 9 May 2020 11:49:54 +0300 Subject: [PATCH 086/492] Fix refresh_counter_cache test --- test/tasks/refresh_counter_cache_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tasks/refresh_counter_cache_test.exs b/test/tasks/refresh_counter_cache_test.exs index b63f44c08..378664148 100644 --- a/test/tasks/refresh_counter_cache_test.exs +++ b/test/tasks/refresh_counter_cache_test.exs @@ -37,7 +37,7 @@ test "counts statuses" 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 From 4f265397179e7286f27fafaf8365a0edc6972448 Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 9 May 2020 11:59:49 +0300 Subject: [PATCH 087/492] Fix credo warning --- lib/pleroma/counter_cache.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/counter_cache.ex b/lib/pleroma/counter_cache.ex index a940b5e50..aa6d38687 100644 --- a/lib/pleroma/counter_cache.ex +++ b/lib/pleroma/counter_cache.ex @@ -40,7 +40,7 @@ def get_by_instance(instance) do end end - def get_sum() do + def get_sum do CounterCache |> select([c], %{ "public" => sum(c.public), From 56819f7f0604e5d4eb69edba1d6828256acbc7fe Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 9 May 2020 13:13:26 +0300 Subject: [PATCH 088/492] Use index on refresh_counter_cache --- lib/mix/tasks/pleroma/refresh_counter_cache.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mix/tasks/pleroma/refresh_counter_cache.ex b/lib/mix/tasks/pleroma/refresh_counter_cache.ex index b44e2545d..efcbaa3b1 100644 --- a/lib/mix/tasks/pleroma/refresh_counter_cache.ex +++ b/lib/mix/tasks/pleroma/refresh_counter_cache.ex @@ -42,7 +42,7 @@ defp instance_counters(instance) do Activity |> where([a], fragment("(? ->> 'type'::text) = 'Create'", a.data)) - |> where([a], like(a.actor, ^"%#{instance}%")) + |> where([a], fragment("split_part(?, '/', 3) = ?", a.actor, ^instance)) |> select( [a], {fragment( From 4c197023903a183790fb2dc67b5637bfabd53bcb Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 9 May 2020 14:32:08 +0300 Subject: [PATCH 089/492] Add docs --- CHANGELOG.md | 12 ++++++++++++ docs/API/admin_api.md | 4 ++++ 2 files changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d469793f0..f2c9e106e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed
API Changes + - **Breaking:** Emoji API: changed methods and renamed routes.
+
+ 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. @@ -76,6 +85,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/docs/API/admin_api.md b/docs/API/admin_api.md index c455047cc..fa74e7460 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1096,6 +1096,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 From f3f8ed9e19f1ab8863141ba8b31773c54f4771fb Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sun, 10 May 2020 09:13:24 +0300 Subject: [PATCH 090/492] Set sum types in query --- lib/pleroma/counter_cache.ex | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/pleroma/counter_cache.ex b/lib/pleroma/counter_cache.ex index aa6d38687..ebd1f603d 100644 --- a/lib/pleroma/counter_cache.ex +++ b/lib/pleroma/counter_cache.ex @@ -43,16 +43,12 @@ def get_by_instance(instance) do def get_sum do CounterCache |> select([c], %{ - "public" => sum(c.public), - "unlisted" => sum(c.unlisted), - "private" => sum(c.private), - "direct" => sum(c.direct) + "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() - |> Enum.map(fn {visibility, dec_count} -> - {visibility, Decimal.to_integer(dec_count)} - end) - |> Enum.into(%{}) end def set(instance, values) do From 1054e897622d0a0727f30169d64c83a253a3d11e Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 12:30:24 +0200 Subject: [PATCH 091/492] ChatOperation: Add media id to example --- lib/pleroma/web/api_spec/operations/chat_operation.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 8b9dc2e44..16d3d5e22 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -241,7 +241,8 @@ def chat_message_create do }, required: [:content], example: %{ - "content" => "Hey wanna buy feet pics?" + "content" => "Hey wanna buy feet pics?", + "media_id" => "134234" } } end From e297d8c649a03510023cff61dc6e0c7131bc29dc Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 12:34:12 +0200 Subject: [PATCH 092/492] Documentation: Add attachment docs --- docs/API/chats.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/API/chats.md b/docs/API/chats.md index 8d925989c..3ddc13541 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -160,6 +160,7 @@ Posting a chat message for given Chat id works like this: Parameters: - content: The text content of the message +- media_id: The id of an upload that will be attached to the message. Currently, no formatting beyond basic escaping and emoji is implemented, as well as no attachments. This will most probably change. From f335e1404a9cd19451b531e32e3591aa323761ff Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 13:00:01 +0200 Subject: [PATCH 093/492] ChatView: Add the last message to the view. --- lib/pleroma/chat.ex | 36 ++++++++++++++++++- .../controllers/chat_controller.ex | 23 ++---------- .../web/pleroma_api/views/chat_view.ex | 7 +++- test/web/pleroma_api/views/chat_view_test.exs | 17 ++++++++- 4 files changed, 60 insertions(+), 23 deletions(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 1a092b992..6a03ee3c1 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -4,8 +4,11 @@ defmodule Pleroma.Chat do use Ecto.Schema - import Ecto.Changeset + import Ecto.Changeset + import Ecto.Query + + alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User @@ -23,6 +26,37 @@ defmodule Pleroma.Chat do timestamps() end + def last_message_for_chat(chat) do + messages_for_chat_query(chat) + |> order_by(desc: :id) + |> Repo.one() + end + + def messages_for_chat_query(chat) do + chat = + chat + |> Repo.preload(:user) + + from(o in Object, + where: fragment("?->>'type' = ?", o.data, "ChatMessage"), + where: + fragment( + """ + (?->>'actor' = ? and ?->'to' = ?) + OR (?->>'actor' = ? and ?->'to' = ?) + """, + o.data, + ^chat.user.ap_id, + o.data, + ^[chat.recipient], + o.data, + ^chat.recipient, + o.data, + ^[chat.user.ap_id] + ) + ) + end + def creation_cng(struct, params) do struct |> cast(params, [:user_id, :recipient, :unread]) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 450d85332..1ef3477c8 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -14,9 +14,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Web.PleromaAPI.ChatMessageView alias Pleroma.Web.PleromaAPI.ChatView - import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1] - import Ecto.Query + import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1] # TODO # - Error handling @@ -65,24 +64,8 @@ def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do 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 messages = - from(o in Object, - where: fragment("?->>'type' = ?", o.data, "ChatMessage"), - where: - fragment( - """ - (?->>'actor' = ? and ?->'to' = ?) - OR (?->>'actor' = ? and ?->'to' = ?) - """, - o.data, - ^user.ap_id, - o.data, - ^[chat.recipient], - o.data, - ^chat.recipient, - o.data, - ^[user.ap_id] - ) - ) + chat + |> Chat.messages_for_chat_query() |> Pagination.fetch_paginated(params |> stringify_keys()) conn diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index bc3af5ef5..21f0612ff 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -8,14 +8,19 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do alias Pleroma.Chat alias Pleroma.User alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.PleromaAPI.ChatMessageView def render("show.json", %{chat: %Chat{} = chat} = opts) do recipient = User.get_cached_by_ap_id(chat.recipient) + last_message = Chat.last_message_for_chat(chat) + %{ id: chat.id |> to_string(), account: AccountView.render("show.json", Map.put(opts, :user, recipient)), - unread: chat.unread + unread: chat.unread, + last_message: + last_message && ChatMessageView.render("show.json", chat: chat, object: last_message) } end diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index 1ac3483d1..8568d98c6 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -6,8 +6,11 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do use Pleroma.DataCase alias Pleroma.Chat + alias Pleroma.Object + alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.PleromaAPI.ChatView + alias Pleroma.Web.PleromaAPI.ChatMessageView import Pleroma.Factory @@ -22,7 +25,19 @@ test "it represents a chat" do assert represented_chat == %{ id: "#{chat.id}", account: AccountView.render("show.json", user: recipient), - unread: 0 + unread: 0, + last_message: nil } + + {: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) + + assert represented_chat[:last_message] == + ChatMessageView.render("show.json", chat: chat, object: chat_message) end end From 17be3ff669865102848df034045eb2889eed3976 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 13:01:20 +0200 Subject: [PATCH 094/492] Documentation: Add last_message to chat docs. --- docs/API/chats.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 3ddc13541..1f6175f77 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -62,7 +62,8 @@ Returned data: ... }, "id" : "1", - "unread" : 2 + "unread" : 2, + "last_message" : {...} // The last message in that chat } ``` @@ -105,7 +106,8 @@ Returned data: ... }, "id" : "1", - "unread" : 2 + "unread" : 2, + "last_message" : {...} // The last message in that chat } ] ``` From 172d9b11936bb029093eac430c58c89a81592c08 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 13:08:01 +0200 Subject: [PATCH 095/492] Chat: Add last_message to schema. --- lib/pleroma/web/api_spec/schemas/chat.ex | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/api_spec/schemas/chat.ex b/lib/pleroma/web/api_spec/schemas/chat.ex index 4d385d6ab..8aaa4a792 100644 --- a/lib/pleroma/web/api_spec/schemas/chat.ex +++ b/lib/pleroma/web/api_spec/schemas/chat.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Chat do alias OpenApiSpex.Schema + alias Pleroma.Web.ApiSpec.Schemas.ChatMessage require OpenApiSpex @@ -12,9 +13,10 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Chat do description: "Response schema for a Chat", type: :object, properties: %{ - id: %Schema{type: :string, nullable: false}, - account: %Schema{type: :object, nullable: false}, - unread: %Schema{type: :integer, nullable: false} + id: %Schema{type: :string}, + account: %Schema{type: :object}, + unread: %Schema{type: :integer}, + last_message: %Schema{type: ChatMessage, nullable: true} }, example: %{ "account" => %{ @@ -64,7 +66,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Chat do "url" => "https://dontbulling.me/users/lain" }, "id" => "1", - "unread" => 2 + "unread" => 2, + "last_message" => ChatMessage.schema().example() } }) end From 8d5597ff68de22ee7b126730467649ada248aaf7 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 13:26:14 +0200 Subject: [PATCH 096/492] ChatController: Add GET /chats/:id --- .../web/api_spec/operations/chat_operation.ex | 31 +++++++++++++++++++ lib/pleroma/web/api_spec/schemas/chat.ex | 2 +- .../web/api_spec/schemas/chat_message.ex | 1 + .../controllers/chat_controller.ex | 10 +++++- lib/pleroma/web/router.ex | 1 + .../controllers/chat_controller_test.exs | 17 ++++++++++ 6 files changed, 60 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 16d3d5e22..fe6c2f52f 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -38,6 +38,37 @@ def mark_as_read_operation do } 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"], diff --git a/lib/pleroma/web/api_spec/schemas/chat.ex b/lib/pleroma/web/api_spec/schemas/chat.ex index 8aaa4a792..c6ec07c88 100644 --- a/lib/pleroma/web/api_spec/schemas/chat.ex +++ b/lib/pleroma/web/api_spec/schemas/chat.ex @@ -16,7 +16,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Chat do id: %Schema{type: :string}, account: %Schema{type: :object}, unread: %Schema{type: :integer}, - last_message: %Schema{type: ChatMessage, nullable: true} + last_message: ChatMessage }, example: %{ "account" => %{ diff --git a/lib/pleroma/web/api_spec/schemas/chat_message.ex b/lib/pleroma/web/api_spec/schemas/chat_message.ex index 89e062ddd..6e8f1a10a 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do OpenApiSpex.schema(%{ title: "ChatMessage", description: "Response schema for a ChatMessage", + nullable: true, type: :object, properties: %{ id: %Schema{type: :string}, diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 1ef3477c8..04f136dcd 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -27,7 +27,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do plug( OAuthScopesPlug, - %{scopes: ["read:statuses"]} when action in [:messages, :index] + %{scopes: ["read:statuses"]} when action in [:messages, :index, :show] ) plug(OpenApiSpex.Plug.CastAndValidate, render_error: Pleroma.Web.ApiSpec.RenderError) @@ -100,4 +100,12 @@ def create(%{assigns: %{user: user}} = conn, params) do |> 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/router.ex b/lib/pleroma/web/router.ex index 4b264c43e..3b1834d97 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -307,6 +307,7 @@ defmodule Pleroma.Web.Router do 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) post("/chats/:id/read", ChatController, :mark_as_read) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index b4b73da90..dda4f9e5b 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -153,6 +153,23 @@ test "it creates or returns a chat", %{conn: conn} do end end + describe "GET /api/v1/pleroma/chats/:id" do + setup do: oauth_access(["read:statuses"]) + + 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:statuses"]) From 8cc8d960af87cdc1e2398a8470155b0930f43f5c Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 13:27:40 +0200 Subject: [PATCH 097/492] Documentation: Add GET /chats/:id --- docs/API/chats.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 1f6175f77..ed160abd9 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -43,12 +43,17 @@ you can call: `POST /api/v1/pleroma/chats/by-account-id/{account_id}` -The account id is the normal FlakeId of the usre - +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. From 1b1dfb54eb092921fe9dab2c49928e5b04fa049b Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 10 May 2020 13:28:05 +0200 Subject: [PATCH 098/492] Credo fixes. --- test/web/pleroma_api/views/chat_view_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index 8568d98c6..e24e29835 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -9,8 +9,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do alias Pleroma.Object alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.PleromaAPI.ChatView alias Pleroma.Web.PleromaAPI.ChatMessageView + alias Pleroma.Web.PleromaAPI.ChatView import Pleroma.Factory From fdb98715b8e6ced7c4037b1292fb10980a994803 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 11 May 2020 10:58:14 +0200 Subject: [PATCH 099/492] Chat: Fix wrong query. --- lib/pleroma/chat.ex | 1 + test/chat_test.exs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 6a03ee3c1..4c92a58c7 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -29,6 +29,7 @@ defmodule Pleroma.Chat do def last_message_for_chat(chat) do messages_for_chat_query(chat) |> order_by(desc: :id) + |> limit(1) |> Repo.one() end diff --git a/test/chat_test.exs b/test/chat_test.exs index 943e48111..dfcb6422e 100644 --- a/test/chat_test.exs +++ b/test/chat_test.exs @@ -6,9 +6,26 @@ defmodule Pleroma.ChatTest do use Pleroma.DataCase, async: true alias Pleroma.Chat + 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 = Chat.last_message_for_chat(chat) + + assert message.data["content"] == "ho" + end + end + describe "creation and getting" do test "it only works if the recipient is a valid user (for now)" do user = insert(:user) From 63477d07adb614413a382a87f06af2bc2495b432 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Tue, 12 May 2020 06:44:33 +0300 Subject: [PATCH 100/492] unsubscribes of friends when user deactivated --- lib/mix/tasks/pleroma/user.ex | 14 ++------------ lib/pleroma/user.ex | 20 +++++++++++++++----- test/tasks/user_test.exs | 8 ++++---- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index da140ac86..93ecb4631 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -150,22 +150,12 @@ def run(["unsubscribe", nickname]) do 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 _ -> diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index a86cc3202..1c456b27c 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -750,7 +750,19 @@ def unfollow(%User{ap_id: ap_id}, %User{ap_id: ap_id}) 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) @@ -761,7 +773,7 @@ def unfollow(%User{} = follower, %User{} = followed) do |> update_following_count() |> set_cache() - {:ok, follower, Utils.fetch_latest_follow(follower, followed)} + {:ok, follower, followed} nil -> {:error, "Not subscribed!"} @@ -1401,15 +1413,13 @@ def deactivate(%User{} = user, status) 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 diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index b4f68d494..4b3ab5a87 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -172,23 +172,23 @@ test "no user to toggle" do describe "running unsubscribe" 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]) 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 From b5aa204eb8bf3f737d3d807a9924c0153d1b6d3e Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 12 May 2020 13:13:03 +0200 Subject: [PATCH 101/492] ChatController: Support deletion of chat messages. --- .../object_validators/delete_validator.ex | 3 ++- .../web/api_spec/operations/chat_operation.ex | 25 +++++++++++++++++++ .../controllers/chat_controller.ex | 24 +++++++++++++++++- lib/pleroma/web/router.ex | 1 + .../controllers/chat_controller_test.exs | 24 ++++++++++++++++++ 5 files changed, 75 insertions(+), 2 deletions(-) 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..e5d08eb5c 100644 --- a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex @@ -46,12 +46,13 @@ def add_deleted_activity_id(cng) do Answer Article Audio + ChatMessage Event Note Page Question - Video Tombstone + Video } def validate_data(cng) do cng diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index fe6c2f52f..8ba10c603 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -166,6 +166,31 @@ def post_chat_message_operation do } 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"] + } + ] + } + end + def chats_response do %Schema{ title: "ChatsResponse", diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 04f136dcd..8eed88752 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -4,6 +4,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do use Pleroma.Web, :controller + alias Pleroma.Activity alias Pleroma.Chat alias Pleroma.Object alias Pleroma.Pagination @@ -22,7 +23,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do plug( OAuthScopesPlug, - %{scopes: ["write:statuses"]} when action in [:post_chat_message, :create, :mark_as_read] + %{scopes: ["write:statuses"]} + when action in [:post_chat_message, :create, :mark_as_read, :delete_message] ) plug( @@ -34,6 +36,26 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation + def delete_message(%{assigns: %{user: %{ap_id: actor} = user}} = conn, %{ + message_id: id + }) do + with %Object{ + data: %{ + "actor" => ^actor, + "id" => object, + "to" => [recipient], + "type" => "ChatMessage" + } + } = message <- Object.get_by_id(id), + %Chat{} = chat <- Chat.get(user.id, recipient), + %Activity{} = activity <- Activity.get_create_by_object_ap_id(object), + {:ok, _delete} <- CommonAPI.delete(activity.id, user) do + conn + |> put_view(ChatMessageView) + |> render("show.json", for: user, object: message, chat: chat) + end + end + def post_chat_message( %{body_params: %{content: content} = params, assigns: %{user: %{id: user_id} = user}} = conn, diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 3b1834d97..0e4f45869 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -310,6 +310,7 @@ defmodule Pleroma.Web.Router do 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) end diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index dda4f9e5b..86ccbb117 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -4,6 +4,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true + alias Pleroma.Object alias Pleroma.Chat alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI @@ -78,6 +79,29 @@ test "it works with an attachment", %{conn: conn, user: user} do end end + describe "DELETE /api/v1/pleroma/chats/:id/messages/:message_id" do + setup do: oauth_access(["write:statuses"]) + + test "it deletes a message for the author of the message", %{conn: conn, user: user} do + recipient = insert(:user) + + {:ok, message} = + CommonAPI.post_chat_message(user, recipient, "Hello darkness my old friend") + + object = Object.normalize(message, false) + + chat = Chat.get(user.id, recipient.ap_id) + + result = + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{object.id}") + |> json_response_and_validate_schema(200) + + assert result["id"] == to_string(object.id) + end + end + describe "GET /api/v1/pleroma/chats/:id/messages" do setup do: oauth_access(["read:statuses"]) From ec72cba43ec4f45faadf1b06a6d014cd4136707e Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 12 May 2020 13:23:09 +0200 Subject: [PATCH 102/492] Chat Controller: Add basic error handling. --- .../web/pleroma_api/controllers/chat_controller.ex | 5 +++-- .../pleroma_api/controllers/chat_controller_test.exs | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 8eed88752..4ce3e7419 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -18,8 +18,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do import Ecto.Query import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1] - # TODO - # - Error handling + action_fallback(Pleroma.Web.MastodonAPI.FallbackController) plug( OAuthScopesPlug, @@ -53,6 +52,8 @@ def delete_message(%{assigns: %{user: %{ap_id: actor} = user}} = conn, %{ conn |> put_view(ChatMessageView) |> render("show.json", for: user, object: message, chat: chat) + else + _e -> {:error, :could_not_delete} end end diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 86ccbb117..75d4903ed 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -88,6 +88,8 @@ test "it deletes a message for the author of the message", %{conn: conn, user: u {: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) @@ -99,6 +101,16 @@ test "it deletes a message for the author of the message", %{conn: conn, user: u |> json_response_and_validate_schema(200) assert result["id"] == to_string(object.id) + + object = Object.normalize(other_message, false) + + result = + conn + |> put_req_header("content-type", "application/json") + |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{object.id}") + |> json_response(400) + + assert result == %{"error" => "could_not_delete"} end end From a61120f497e5d17be1207eacd11525edb7b6db36 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 12 May 2020 13:25:25 +0200 Subject: [PATCH 103/492] Documention: Add chat message deletion docs --- docs/API/chats.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/API/chats.md b/docs/API/chats.md index ed160abd9..ad36961ae 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -192,6 +192,14 @@ Returned data: } ``` +### 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: From e44166b510f95bfb2e679b2d64bbf7e0facd0dd2 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 12 May 2020 14:44:11 +0200 Subject: [PATCH 104/492] Credo fixes. --- test/web/pleroma_api/controllers/chat_controller_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 75d4903ed..861ef10b0 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -4,8 +4,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true - alias Pleroma.Object alias Pleroma.Chat + alias Pleroma.Object alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI From c0ea5c60e4e709d3d4415de42a65f878b55dc3bb Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 12 May 2020 16:43:04 +0200 Subject: [PATCH 105/492] ChatController: Don't return chats for user you've blocked. --- .../controllers/chat_controller.ex | 5 +++- .../controllers/chat_controller_test.exs | 23 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 4ce3e7419..496cb8e87 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -102,10 +102,13 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: id} = para end end - def index(%{assigns: %{user: %{id: user_id}}} = conn, params) do + 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] ) |> Pagination.fetch_paginated(params |> stringify_keys) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 861ef10b0..037dd2297 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -6,6 +6,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do alias Pleroma.Chat alias Pleroma.Object + alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI @@ -209,6 +210,28 @@ test "it returns a chat", %{conn: conn, user: user} do describe "GET /api/v1/pleroma/chats" do setup do: oauth_access(["read:statuses"]) + 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 paginates", %{conn: conn, user: user} do Enum.each(1..30, fn _ -> recipient = insert(:user) From 06cad239e50cada3aec4fc3b4c494a70d328672c Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 13 May 2020 14:05:22 +0200 Subject: [PATCH 106/492] InstanceView: Add pleroma chat messages to nodeinfo --- lib/pleroma/web/mastodon_api/views/instance_view.ex | 3 ++- test/web/node_info_test.exs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index a329ffc28..17cfc4fcf 100644 --- a/lib/pleroma/web/mastodon_api/views/instance_view.ex +++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex @@ -68,7 +68,8 @@ def features 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 diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 9bcc07b37..00925caad 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -145,7 +145,8 @@ test "it shows default features flags", %{conn: conn} 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?( From 0f0acc740d30c47d093f27875d4decf0693b2845 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 13 May 2020 15:31:28 +0200 Subject: [PATCH 107/492] Chat: Allow posting without content if an attachment is present. --- docs/API/chats.md | 5 ++- .../chat_message_validator.ex | 14 +++++++- .../web/api_spec/operations/chat_operation.ex | 12 ++++--- .../web/api_spec/schemas/chat_message.ex | 2 +- lib/pleroma/web/common_api/common_api.ex | 17 +++++++--- .../controllers/chat_controller.ex | 7 ++-- .../activity_pub/object_validator_test.exs | 32 +++++++++++++++++++ test/web/common_api/common_api_test.exs | 23 +++++++++++++ .../controllers/chat_controller_test.exs | 18 +++++++++-- 9 files changed, 111 insertions(+), 19 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index ad36961ae..1ea18ff5f 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -166,11 +166,10 @@ 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 +- 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, as well as no -attachments. This will most probably change. +Currently, no formatting beyond basic escaping and emoji is implemented. Returned data: 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 index e40c80ab4..9c20c188a 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -61,12 +61,24 @@ def changeset(struct, data) do def validate_data(data_cng) do data_cng |> validate_inclusion(:type, ["ChatMessage"]) - |> validate_required([:id, :actor, :to, :type, :content, :published]) + |> 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 diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 8ba10c603..a1c5db5dc 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -5,6 +5,7 @@ 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 @@ -149,14 +150,15 @@ def post_chat_message_operation do parameters: [ Operation.parameter(:id, :path, :string, "The ID of the Chat") ], - requestBody: request_body("Parameters", chat_message_create(), required: true), + 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: [ %{ @@ -292,10 +294,12 @@ def chat_message_create do description: "POST body for creating an chat message", type: :object, properties: %{ - content: %Schema{type: :string, description: "The content of your message"}, + 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"} }, - required: [:content], example: %{ "content" => "Hey wanna buy feet pics?", "media_id" => "134234" diff --git a/lib/pleroma/web/api_spec/schemas/chat_message.ex b/lib/pleroma/web/api_spec/schemas/chat_message.ex index 6e8f1a10a..3ee85aa76 100644 --- a/lib/pleroma/web/api_spec/schemas/chat_message.ex +++ b/lib/pleroma/web/api_spec/schemas/chat_message.ex @@ -16,7 +16,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ChatMessage do 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}, + content: %Schema{type: :string, nullable: true}, created_at: %Schema{type: :string, format: :"date-time"}, emojis: %Schema{type: :array}, attachment: %Schema{type: :object, nullable: true} diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 664175a4f..7008cea44 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -26,14 +26,14 @@ defmodule Pleroma.Web.CommonAPI do require Logger def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) do - with :ok <- validate_chat_content_length(content), - maybe_attachment <- opts[:media_id] && Object.get_by_id(opts[:media_id]), + 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 |> Formatter.html_escape("text/plain"), + content |> format_chat_content, attachment: maybe_attachment )}, {_, {:ok, create_activity_data, _meta}} <- @@ -47,7 +47,16 @@ def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) end end - defp validate_chat_content_length(content) do + defp format_chat_content(nil), do: nil + + defp format_chat_content(content) do + content |> Formatter.html_escape("text/plain") + 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 diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 496cb8e87..210c8ec4a 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -58,8 +58,7 @@ def delete_message(%{assigns: %{user: %{ap_id: actor} = user}} = conn, %{ end def post_chat_message( - %{body_params: %{content: content} = params, assigns: %{user: %{id: user_id} = user}} = - conn, + %{body_params: params, assigns: %{user: %{id: user_id} = user}} = conn, %{ id: id } @@ -67,7 +66,9 @@ def post_chat_message( 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, content, media_id: params[:media_id]), + CommonAPI.post_chat_message(user, recipient, params[:content], + media_id: params[:media_id] + ), message <- Object.normalize(activity) do conn |> put_view(ChatMessageView) diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index d9f5a8fac..da33d3dbc 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -103,6 +103,38 @@ test "validates for a basic object with an attachment", %{ 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 diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index fd2c486a1..46ffd2888 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -27,6 +27,29 @@ defmodule Pleroma.Web.CommonAPITest do 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) + + {:ok, activity} = + CommonAPI.post_chat_message( + author, + recipient, + nil, + media_id: upload.id + ) + + assert activity + end + test "it posts a chat message" do author = insert(:user) recipient = insert(:user) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 037dd2297..d79aa3148 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -53,6 +53,20 @@ test "it posts a message to the chat", %{conn: conn, user: user} do 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", @@ -70,13 +84,11 @@ test "it works with an attachment", %{conn: conn, user: user} do conn |> put_req_header("content-type", "application/json") |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{ - "content" => "Hallo!!", "media_id" => to_string(upload.id) }) |> json_response_and_validate_schema(200) - assert result["content"] == "Hallo!!" - assert result["chat_id"] == chat.id |> to_string() + assert result["attachment"] end end From e688d4ee69dfbda0f8fd3a5544720a566b3946c5 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Tue, 14 Apr 2020 18:59:04 +0200 Subject: [PATCH 108/492] MRF.StealEmojiPolicy: New Policy Inspired by https://git.pleroma.social/moonman/emoji-stealer-mrf/-/blob/master/steal_emoji_policy.ex --- CHANGELOG.md | 1 + docs/configuration/cheatsheet.md | 5 + .../activity_pub/mrf/steal_emoji_policy.ex | 97 +++++++++++++++++++ test/support/http_request_mock.ex | 4 + .../mrf/steal_emoji_policy_test.exs | 64 ++++++++++++ 5 files changed, 171 insertions(+) create mode 100644 lib/pleroma/web/activity_pub/mrf/steal_emoji_policy.ex create mode 100644 test/web/activity_pub/mrf/steal_emoji_policy_test.exs diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b7fb603d..acd0fe171 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Mix task to create trusted OAuth App. - 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
API Changes - Mastodon API: Extended `/api/v1/instance`. diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 707d7fdbd..1b2d72087 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -149,6 +149,11 @@ 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 + ### :activitypub * `unfollow_blocked`: Whether blocks result in people getting unfollowed * `outgoing_blocks`: Whether to federate blocks to other instances 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/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 @@ def get("https://skippers-bin.com/notes/7x9tmrp97i", _, _, _) 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/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..8882c8c13 --- /dev/null +++ b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs @@ -0,0 +1,64 @@ +# 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 + clear_config(:mrf_steal_emoji) + + emoji_path = Path.join(Config.get([:instance, :static_dir]), "emoji/stolen") + File.rm_rf!(emoji_path) + File.mkdir!(emoji_path) + + Pleroma.Emoji.reload() + 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" + } + } + + Config.put([:mrf_steal_emoji, :hosts], ["example.org"]) + Config.put([: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 From 3342846ac2bbd48e985cfeff26ba4593f4815879 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 14 May 2020 13:20:28 +0200 Subject: [PATCH 109/492] ChatView: Add update_at field. --- lib/pleroma/web/pleroma_api/views/chat_view.ex | 4 +++- test/web/pleroma_api/views/chat_view_test.exs | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index 21f0612ff..08d5110c3 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do alias Pleroma.Chat alias Pleroma.User + alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.PleromaAPI.ChatMessageView @@ -20,7 +21,8 @@ def render("show.json", %{chat: %Chat{} = chat} = opts) do account: AccountView.render("show.json", Map.put(opts, :user, recipient)), unread: chat.unread, last_message: - last_message && ChatMessageView.render("show.json", chat: chat, object: last_message) + last_message && ChatMessageView.render("show.json", chat: chat, object: last_message), + updated_at: Utils.to_masto_date(chat.updated_at) } end diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index e24e29835..6062a0cfe 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -8,6 +8,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do alias Pleroma.Chat alias Pleroma.Object alias Pleroma.Web.CommonAPI + alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.PleromaAPI.ChatMessageView alias Pleroma.Web.PleromaAPI.ChatView @@ -26,7 +27,8 @@ test "it represents a chat" do id: "#{chat.id}", account: AccountView.render("show.json", user: recipient), unread: 0, - last_message: nil + last_message: nil, + updated_at: Utils.to_masto_date(chat.updated_at) } {:ok, chat_message_creation} = CommonAPI.post_chat_message(user, recipient, "hello") From 1d18721a3c60aa0acc7d1ba858a92277e544a54a Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 15 May 2020 13:18:41 +0200 Subject: [PATCH 110/492] Chats: Add updated_at to Schema and docs. --- docs/API/chats.md | 9 ++++++--- lib/pleroma/web/api_spec/schemas/chat.ex | 6 ++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 1ea18ff5f..2e415e4da 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -68,7 +68,8 @@ Returned data: }, "id" : "1", "unread" : 2, - "last_message" : {...} // The last message in that chat + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" } ``` @@ -88,7 +89,8 @@ Returned data: ... }, "id" : "1", - "unread" : 0 + "unread" : 0, + "updated_at": "2020-04-21T15:11:46.000Z" } ``` @@ -112,7 +114,8 @@ Returned data: }, "id" : "1", "unread" : 2, - "last_message" : {...} // The last message in that chat + "last_message" : {...}, // The last message in that chat + "updated_at": "2020-04-21T15:11:46.000Z" } ] ``` diff --git a/lib/pleroma/web/api_spec/schemas/chat.ex b/lib/pleroma/web/api_spec/schemas/chat.ex index c6ec07c88..b4986b734 100644 --- a/lib/pleroma/web/api_spec/schemas/chat.ex +++ b/lib/pleroma/web/api_spec/schemas/chat.ex @@ -16,7 +16,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Chat do id: %Schema{type: :string}, account: %Schema{type: :object}, unread: %Schema{type: :integer}, - last_message: ChatMessage + last_message: ChatMessage, + updated_at: %Schema{type: :string, format: :"date-time"} }, example: %{ "account" => %{ @@ -67,7 +68,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Chat do }, "id" => "1", "unread" => 2, - "last_message" => ChatMessage.schema().example() + "last_message" => ChatMessage.schema().example(), + "updated_at" => "2020-04-21T15:06:45.000Z" } }) end From baf051a59e8bfcb2e55b5e28e46e80d6961b9bb4 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 17 May 2020 12:22:26 +0200 Subject: [PATCH 111/492] SideEffects: Don't update unread count for actor in chatmessages. --- lib/pleroma/web/activity_pub/side_effects.ex | 6 +++++- test/web/activity_pub/side_effects_test.exs | 21 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index c8b675d54..8e64b4615 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -117,7 +117,11 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do [[actor, recipient], [recipient, actor]] |> Enum.each(fn [user, other_user] -> if user.local do - Chat.bump_or_create(user.id, other_user.ap_id) + if user.ap_id == actor.ap_id do + Chat.get_or_create(user.id, other_user.ap_id) + else + Chat.bump_or_create(user.id, other_user.ap_id) + end end end) diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 148fa4442..37d7491ca 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -284,6 +284,27 @@ test "notifies the recipient" do assert Repo.get_by(Notification, user_id: recipient.id, activity_id: create_activity.id) end + test "it creates a Chat 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) + + {:ok, _create_activity, _meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + chat = Chat.get(author.id, recipient.ap_id) + assert chat.unread == 0 + + chat = Chat.get(recipient.id, author.ap_id) + assert chat.unread == 1 + 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) From e7bc2f980cce170731960e024614c497b821fe90 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 7 May 2020 13:44:38 +0300 Subject: [PATCH 112/492] account visibility --- lib/pleroma/user.ex | 52 ++++++++++------ .../api_spec/operations/account_operation.ex | 8 ++- .../controllers/account_controller.ex | 21 +++++-- .../web/mastodon_api/views/account_view.ex | 2 +- test/user_test.exs | 10 ++-- .../controllers/account_controller_test.exs | 59 ++++++++++++++----- 6 files changed, 105 insertions(+), 47 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index cba391072..7a2558c29 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -262,37 +262,51 @@ def account_status(%User{deactivated: true}), do: :deactivated 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) :: + boolean() + | :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: true - def visible_for?(%User{local: local} = user, nil) do - cfg_key = - if local, - do: :local, - else: :remote - - if Config.get([:restrict_unauthenticated, :profiles, cfg_key]), - do: false, - else: account_status(user) == :active + def visible_for(%User{} = user, nil) do + if restrict_unauthenticated?(user) do + :restrict_unauthenticated + 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(%User{} = user, for_user) do + superuser?(for_user) || visible_account_status(user) end - def visible_for?(_, _), do: false + def visible_for(_, _), do: false + + defp restrict_unauthenticated?(%User{local: local}) do + config_key = if local, do: :local, else: :remote + + Config.get([:restrict_unauthenticated, :profiles, config_key], false) + end + + defp visible_account_status(user) do + status = account_status(user) + status in [:active, :password_reset_pending] || status + end @spec superuser?(User.t()) :: boolean() def superuser?(%User{local: true, is_admin: true}), do: true diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex index 934f6038e..43168acf7 100644 --- a/lib/pleroma/web/api_spec/operations/account_operation.ex +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -102,7 +102,9 @@ def show_operation do parameters: [%Reference{"$ref": "#/components/parameters/accountIdOrNickname"}], responses: %{ 200 => Operation.response("Account", "application/json", Account), - 404 => Operation.response("Error", "application/json", ApiError) + 401 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError), + 410 => Operation.response("Error", "application/json", ApiError) } } end @@ -142,7 +144,9 @@ def statuses_operation do ] ++ pagination_params(), responses: %{ 200 => Operation.response("Statuses", "application/json", array_of_statuses()), - 404 => Operation.response("Error", "application/json", ApiError) + 401 => Operation.response("Error", "application/json", ApiError), + 404 => Operation.response("Error", "application/json", ApiError), + 410 => Operation.response("Error", "application/json", ApiError) } } end diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index ef41f9e96..ffa82731f 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -221,17 +221,17 @@ def relationships(%{assigns: %{user: _user}} = conn, _), do: json(conn, []) @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 + true <- 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 + true <- User.visible_for(user, reading_user) do params = params |> Map.delete(:tagged) @@ -250,7 +250,20 @@ def statuses(%{assigns: %{user: reading_user}} = conn, params) 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 + :deactivated -> + render_error(conn, :gone, "") + + :restrict_unauthenticated -> + render_error(conn, :unauthorized, "This API requires an authenticated user") + + _ -> + render_error(conn, :not_found, "Can't find user") 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..8e723d013 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 @@ def render("index.json", %{users: users} = opts) 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]) == true do do_render("show.json", opts) else %{} diff --git a/test/user_test.exs b/test/user_test.exs index 6b9df60a4..3bfcfd10c 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1289,11 +1289,11 @@ test "returns false for a non-invisible user" 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) end test "returns false when the account is unauthenticated and auth is required" do @@ -1302,14 +1302,14 @@ test "returns false when the account is unauthenticated and auth is required" 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) == true 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) end test "returns true when the account is unauthenticated and being viewed by a privileged account (auth required)" do @@ -1318,7 +1318,7 @@ test "returns true when the account is unauthenticated and being viewed by a pri user = insert(:user, local: true, confirmation_pending: true) other_user = insert(:user, local: true, is_admin: true) - assert User.visible_for?(user, other_user) + assert User.visible_for(user, other_user) end end diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 280bd6aca..7dfea2f9e 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 @@ test "returns 404 for internal.fetch actor", %{conn: conn} do |> get("/api/v1/accounts/internal.fetch") |> json_response_and_validate_schema(404) end + + test "returns 401 for deactivated user", %{conn: conn} do + user = insert(:user, deactivated: true) + + assert %{} = + conn + |> get("/api/v1/accounts/#{user.id}") + |> json_response_and_validate_schema(:gone) + end end defp local_and_remote_users do @@ -143,15 +152,15 @@ defp local_and_remote_users 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 @@ test "if user is authenticated", %{local: local, remote: remote} 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 @@ test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} d 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 @@ test "works with announces that are just addressed to public", %{conn: conn} do assert id == announce.id end + test "deactivated user", %{conn: conn} do + user = insert(:user, deactivated: true) + + assert %{} == + conn + |> get("/api/v1/accounts/#{user.id}/statuses") + |> json_response_and_validate_schema(:gone) + 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) @@ -422,15 +449,15 @@ defp local_and_remote_activities(%{local: local, remote: remote}) 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 +478,10 @@ test "if user is authenticated", %{local: local, remote: remote} 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 +508,10 @@ test "if user is unauthenticated", %{conn: conn, local: local, remote: remote} d 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 From b1aa402229b6422a5ab1aa7102c7a104e218d0e3 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Wed, 13 May 2020 11:11:10 +0300 Subject: [PATCH 113/492] removing 410 status --- lib/pleroma/web/api_spec/operations/account_operation.ex | 6 ++---- .../web/mastodon_api/controllers/account_controller.ex | 3 --- .../mastodon_api/controllers/account_controller_test.exs | 8 ++++---- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/account_operation.ex b/lib/pleroma/web/api_spec/operations/account_operation.ex index 43168acf7..74b395dfe 100644 --- a/lib/pleroma/web/api_spec/operations/account_operation.ex +++ b/lib/pleroma/web/api_spec/operations/account_operation.ex @@ -103,8 +103,7 @@ def show_operation do responses: %{ 200 => Operation.response("Account", "application/json", Account), 401 => Operation.response("Error", "application/json", ApiError), - 404 => Operation.response("Error", "application/json", ApiError), - 410 => Operation.response("Error", "application/json", ApiError) + 404 => Operation.response("Error", "application/json", ApiError) } } end @@ -145,8 +144,7 @@ def statuses_operation do responses: %{ 200 => Operation.response("Statuses", "application/json", array_of_statuses()), 401 => Operation.response("Error", "application/json", ApiError), - 404 => Operation.response("Error", "application/json", ApiError), - 410 => Operation.response("Error", "application/json", ApiError) + 404 => Operation.response("Error", "application/json", ApiError) } } end diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index ffa82731f..1edc0d96a 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -256,9 +256,6 @@ def statuses(%{assigns: %{user: reading_user}} = conn, params) do defp user_visibility_error(conn, error) do case error do - :deactivated -> - render_error(conn, :gone, "") - :restrict_unauthenticated -> render_error(conn, :unauthorized, "This API requires an authenticated user") diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 7dfea2f9e..8700ab2f5 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -131,10 +131,10 @@ test "returns 404 for internal.fetch actor", %{conn: conn} do test "returns 401 for deactivated user", %{conn: conn} do user = insert(:user, deactivated: true) - assert %{} = + assert %{"error" => "Can't find user"} = conn |> get("/api/v1/accounts/#{user.id}") - |> json_response_and_validate_schema(:gone) + |> json_response_and_validate_schema(:not_found) end end @@ -261,10 +261,10 @@ test "works with announces that are just addressed to public", %{conn: conn} do test "deactivated user", %{conn: conn} do user = insert(:user, deactivated: true) - assert %{} == + assert %{"error" => "Can't find user"} == conn |> get("/api/v1/accounts/#{user.id}/statuses") - |> json_response_and_validate_schema(:gone) + |> json_response_and_validate_schema(:not_found) end test "returns 404 when user is invisible", %{conn: conn} do From 1671864d886bf63d11bbf3d7303719e8744bfc32 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Fri, 15 May 2020 20:29:09 +0300 Subject: [PATCH 114/492] return :visible instead of boolean --- lib/pleroma/user.ex | 19 ++++++++++++++----- .../controllers/account_controller.ex | 4 ++-- .../web/mastodon_api/views/account_view.ex | 2 +- test/user_test.exs | 8 ++++---- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 7a2558c29..5052f7b97 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -272,7 +272,7 @@ def account_status(%User{confirmation_pending: true}) do def account_status(%User{}), do: :active @spec visible_for(User.t(), User.t() | nil) :: - boolean() + :visible | :invisible | :restricted_unauthenticated | :deactivated @@ -281,7 +281,7 @@ def visible_for(user, for_user \\ nil) 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{} = user, nil) do if restrict_unauthenticated?(user) do @@ -292,10 +292,14 @@ def visible_for(%User{} = user, nil) do end def visible_for(%User{} = user, for_user) do - superuser?(for_user) || visible_account_status(user) + if superuser?(for_user) do + :visible + else + visible_account_status(user) + end end - def visible_for(_, _), do: false + def visible_for(_, _), do: :invisible defp restrict_unauthenticated?(%User{local: local}) do config_key = if local, do: :local, else: :remote @@ -305,7 +309,12 @@ defp restrict_unauthenticated?(%User{local: local}) do defp visible_account_status(user) do status = account_status(user) - status in [:active, :password_reset_pending] || status + + if status in [:active, :password_reset_pending] do + :visible + else + status + end end @spec superuser?(User.t()) :: boolean() diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 1edc0d96a..8727faab7 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -221,7 +221,7 @@ def relationships(%{assigns: %{user: _user}} = conn, _), do: json(conn, []) @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 error -> user_visibility_error(conn, error) @@ -231,7 +231,7 @@ def show(%{assigns: %{user: for_user}} = conn, %{id: nickname_or_id}) do @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) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 8e723d013..4a1508b22 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 @@ def render("index.json", %{users: users} = opts) do end def render("show.json", %{user: user} = opts) do - if User.visible_for(user, opts[:for]) == true do + if User.visible_for(user, opts[:for]) == :visible do do_render("show.json", opts) else %{} diff --git a/test/user_test.exs b/test/user_test.exs index 3bfcfd10c..6865bd9be 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1293,7 +1293,7 @@ test "returns false for a non-invisible user" 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 @@ -1302,14 +1302,14 @@ test "returns false when the account is unauthenticated and auth is required" do user = insert(:user, local: true, confirmation_pending: true) other_user = insert(:user, local: true) - refute User.visible_for(user, other_user) == true + 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 @@ -1318,7 +1318,7 @@ test "returns true when the account is unauthenticated and being viewed by a pri 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 From 0321a3e07814c3f225f19e0372b69a7813cef15e Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 18 May 2020 10:34:34 +0300 Subject: [PATCH 115/492] test naming fix --- test/web/mastodon_api/controllers/account_controller_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 8700ab2f5..3008970af 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -128,7 +128,7 @@ test "returns 404 for internal.fetch actor", %{conn: conn} do |> json_response_and_validate_schema(404) end - test "returns 401 for deactivated user", %{conn: conn} do + test "returns 404 for deactivated user", %{conn: conn} do user = insert(:user, deactivated: true) assert %{"error" => "Can't find user"} = From 1be6b3056e97654612f377eaf3c8d80de6d8d77f Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Mon, 18 May 2020 12:38:16 +0300 Subject: [PATCH 116/492] Use indexed split_part/3 to get a hostname rather than ts_ functions --- .../20200508092434_update_counter_cache_table.exs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/priv/repo/migrations/20200508092434_update_counter_cache_table.exs b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs index 3d9bfc877..738344868 100644 --- a/priv/repo/migrations/20200508092434_update_counter_cache_table.exs +++ b/priv/repo/migrations/20200508092434_update_counter_cache_table.exs @@ -25,22 +25,17 @@ def up do RETURNS TRIGGER AS $$ DECLARE - token_id smallint; hostname character varying(255); visibility_new character varying(64); visibility_old character varying(64); actor character varying(255); BEGIN - SELECT "tokid" INTO "token_id" FROM ts_token_type('default') WHERE "alias" = 'host'; IF TG_OP = 'DELETE' THEN actor := OLD.actor; ELSE actor := NEW.actor; END IF; - SELECT "token" INTO "hostname" FROM ts_parse('default', actor) WHERE "tokid" = token_id; - IF hostname IS NULL THEN - hostname := split_part(actor, '/', 3); - 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' From 7d381b16b7b80a22dd9964fb5618998ae41b9c08 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 18 May 2020 14:48:37 +0200 Subject: [PATCH 117/492] Transmogrifier Test: Extract Announce handling. --- .../web/activity_pub/transmogrifier.ex | 9 +- .../kroeg-announce-with-inline-actor.json | 89 ++++++- .../transmogrifier/announce_handling_test.exs | 158 +++++++++++++ test/web/activity_pub/transmogrifier_test.exs | 223 +++++------------- 4 files changed, 308 insertions(+), 171 deletions(-) create mode 100644 test/web/activity_pub/transmogrifier/announce_handling_test.exs diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 80701bb63..6104af4f9 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -677,13 +677,14 @@ def handle_incoming( _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), + {_, {:ok, %User{} = actor}} <- {:fetch_user, User.get_or_fetch_by_ap_id(actor)}, + {_, {:ok, object}} <- {:get_embedded, get_embedded_obj_helper(object_id, actor)}, public <- Visibility.is_public?(data), - {:ok, activity, _object} <- ActivityPub.announce(actor, object, id, false, public) do + {_, {:ok, activity, _object}} <- + {:announce, ActivityPub.announce(actor, object, id, false, public)} do {:ok, activity} else - _e -> :error + e -> {:error, e} end end 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/web/activity_pub/transmogrifier/announce_handling_test.exs b/test/web/activity_pub/transmogrifier/announce_handling_test.exs new file mode 100644 index 000000000..8a4af6546 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/announce_handling_test.exs @@ -0,0 +1,158 @@ +# 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.CommonAPI + alias Pleroma.Web.ActivityPub.Transmogrifier + + 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) + 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 + Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) + data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!() + + _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 + + 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_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 0a54e3bb9..ae88a4480 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 @@ test "it works for incoming notices with to/cc not being an array (kroeg)" 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) From 63ab2743ce7f33b8072d5addc3e6545d12df27fd Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 18 May 2020 15:47:26 +0200 Subject: [PATCH 118/492] TransmogrifierTest: Fix tests. --- test/web/activity_pub/transmogrifier_test.exs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index ae88a4480..81f966ad9 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -1329,7 +1329,7 @@ test "it rejects activities which reference objects with bogus origins" do } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end @@ -1344,7 +1344,7 @@ test "it rejects activities which reference objects that have an incorrect attri } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end @@ -1359,7 +1359,7 @@ test "it rejects activities which reference objects that have an incorrect attri } assert capture_log(fn -> - :error = Transmogrifier.handle_incoming(data) + {:error, _} = Transmogrifier.handle_incoming(data) end) =~ "Object containment failed" end end From 17a8342c1e2bd615edb8e41535aa96c1b22d440a Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 18 May 2020 16:45:11 +0200 Subject: [PATCH 119/492] ObjectValidators: Add basic Announce validator. --- lib/pleroma/web/activity_pub/builder.ex | 14 +++++ .../web/activity_pub/object_validator.ex | 11 ++++ .../object_validators/announce_validator.ex | 53 +++++++++++++++++++ .../activity_pub/object_validator_test.exs | 50 +++++++++++++++++ 4 files changed, 128 insertions(+) create mode 100644 lib/pleroma/web/activity_pub/object_validators/announce_validator.ex diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 4a247ad0c..63f89c2b4 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -83,6 +83,20 @@ def like(actor, object) do end end + def announce(actor, object) do + to = [actor.follower_address, object.data["actor"]] + + {:ok, + %{ + "id" => Utils.generate_activity_id(), + "actor" => actor.ap_id, + "object" => object.data["id"], + "to" => to, + "context" => object.data["context"], + "type" => "Announce" + }, []} + 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/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 549e5e761..600e58123 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator alias Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator @@ -58,6 +59,16 @@ def validate(%{"type" => "EmojiReact"} = object, meta) do 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 stringify_keys(%{__struct__: _} = object) do object |> Map.from_struct() 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..fbefaf257 --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex @@ -0,0 +1,53 @@ +# 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.Web.ActivityPub.ObjectValidators.Types + + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations + import Ecto.Changeset + + @primary_key false + + embedded_schema do + field(:id, Types.ObjectID, primary_key: true) + field(:type, :string) + field(:object, Types.ObjectID) + field(:actor, Types.ObjectID) + field(:context, :string) + field(:to, Types.Recipients, default: []) + field(:cc, Types.Recipients, default: []) + 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, :context, :to, :cc]) + |> validate_actor_presence() + |> validate_object_presence() + end +end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 96eff1c30..9313015f1 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -280,4 +280,54 @@ test "it works when actor or object are wrapped in maps", %{valid_like: valid_li 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 + end end From 0d5bce018df9c99c771daaaa1de3ab0efc0cba5c Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 18 May 2020 16:54:10 +0200 Subject: [PATCH 120/492] AnnounceValidator: Validate for existing announce --- .../object_validators/announce_validator.ex | 17 ++++++++++++++++- test/web/activity_pub/object_validator_test.exs | 13 +++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex index fbefaf257..158ae199d 100644 --- a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex @@ -6,9 +6,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator do use Ecto.Schema alias Pleroma.Web.ActivityPub.ObjectValidators.Types + alias Pleroma.Web.ActivityPub.Utils - import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations import Ecto.Changeset + import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @primary_key false @@ -49,5 +50,19 @@ def validate_data(data_cng) do |> validate_required([:id, :type, :object, :actor, :context, :to, :cc]) |> validate_actor_presence() |> validate_object_presence() + |> validate_existing_announce() + 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/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 9313015f1..e24e0f913 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -329,5 +329,18 @@ test "returns an error if we don't have the actor", %{valid_announce: valid_anno 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 end end From be4db41d713f981cc464e5fa7bc7191d3ff776d6 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 18 May 2020 18:45:33 +0200 Subject: [PATCH 121/492] ChatMessageValidator: Allow one message in an array, too. --- .../chat_message_validator.ex | 9 +++++ .../activity_pub/object_validator_test.exs | 35 +++++++++++++++++++ 2 files changed, 44 insertions(+) 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 index 9c20c188a..138736f23 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -47,9 +47,18 @@ def cast_data(data) do 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) diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index da33d3dbc..a79e50a29 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -13,6 +13,20 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do import Pleroma.Factory describe "attachments" do + test "works with honkerific attachments" do + attachment = %{ + "mediaType" => "image/jpeg", + "name" => "298p3RG7j27tfsZ9RQ.jpg", + "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) + end + test "it turns mastodon attachments into our attachments" do attachment = %{ "url" => @@ -103,6 +117,27 @@ test "validates for a basic object with an attachment", %{ 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 From d19c7167704308df093f060082639c0a15996af7 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 18 May 2020 20:17:28 +0200 Subject: [PATCH 122/492] AttachmentValidator: Handle empty mediatypes --- .../object_validators/attachment_validator.ex | 14 +++++-- .../activity_pub/object_validator_test.exs | 4 +- .../transmogrifier/chat_message_test.exs | 37 +++++++++++++++++++ 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex index 16ed49051..c4b502cb9 100644 --- a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex @@ -12,7 +12,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator do @primary_key false embedded_schema do field(:type, :string) - field(:mediaType, :string) + field(:mediaType, :string, default: "application/octet-stream") field(:name, :string) embeds_many(:url, UrlObjectValidator) @@ -41,8 +41,16 @@ def changeset(struct, data) do end def fix_media_type(data) do - data - |> Map.put_new("mediaType", data["mimeType"]) + data = + data + |> Map.put_new("mediaType", data["mimeType"]) + + if data["mediaType"] == "" do + data + |> Map.put("mediaType", "application/octet-stream") + else + data + end end def fix_url(data) do diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index a79e50a29..ed6b84e8e 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -15,8 +15,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidatorTest do describe "attachments" do test "works with honkerific attachments" do attachment = %{ - "mediaType" => "image/jpeg", - "name" => "298p3RG7j27tfsZ9RQ.jpg", + "mediaType" => "", + "name" => "", "summary" => "298p3RG7j27tfsZ9RQ.jpg", "type" => "Document", "url" => "https://honk.tedunangst.com/d/298p3RG7j27tfsZ9RQ.jpg" diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index 85644d787..820090de3 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -13,6 +13,43 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageTest do alias Pleroma.Web.ActivityPub.Transmogrifier describe "handle_incoming" do + test "handles this" 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") From 918ee46417036e3325b6a1d6e8d51ca78bcb31ac Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 19 May 2020 16:05:39 -0500 Subject: [PATCH 123/492] Synchronize :fe settings in config.exs --- config/config.exs | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/config/config.exs b/config/config.exs index c51884f3a..7b99a41aa 100644 --- a/config/config.exs +++ b/config/config.exs @@ -271,20 +271,32 @@ config :pleroma, :frontend_configurations, pleroma_fe: %{ - theme: "pleroma-dark", - logo: "/static/logo.png", - background: "/images/city.jpg", - redirectRootNoLogin: "/main/all", - redirectRootLogin: "/main/friends", - showInstanceSpecificPanel: true, - scopeOptionsEnabled: false, - formattingOptionsEnabled: false, + alwaysShowSubjectInput: true, + background: "/static/aurora_borealis.jpg", 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, + showFeaturesPanel: true, + showInstanceSpecificPanel: false, subjectLineBehavior: "email", - alwaysShowSubjectInput: true + theme: "pleroma-dark", + webPushNotifications: false }, masto_fe: %{ showInstanceSpecificPanel: true From 490a3a34b63fa10e9151e9a385920c10615a1a3c Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 19 May 2020 21:52:26 +0400 Subject: [PATCH 124/492] Add OpenAPI spec for PleromaAPI.PleromaAPIController --- docs/API/pleroma_api.md | 4 +- .../operations/notification_operation.ex | 2 +- .../api_spec/operations/pleroma_operation.ex | 223 ++++++++++++++++++ .../controllers/pleroma_api_controller.ex | 28 ++- test/support/api_spec_helpers.ex | 2 +- .../pleroma_api_controller_test.exs | 44 ++-- 6 files changed, 264 insertions(+), 39 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/pleroma_operation.ex diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 867f59919..d6dbafc06 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 @@ -536,7 +536,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/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex index 64adc5319..46e72f8bf 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 @@ def destroy_multiple_operation do } end - defp notification do + def notification do %Schema{ title: "Notification", description: "Response schema for a notification", diff --git a/lib/pleroma/web/api_spec/operations/pleroma_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_operation.ex new file mode 100644 index 000000000..c6df5c854 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/pleroma_operation.ex @@ -0,0 +1,223 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ApiSpec.PleromaOperation 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.Conversation + alias Pleroma.Web.ApiSpec.StatusOperation + alias Pleroma.Web.ApiSpec.NotificationOperation + + import Pleroma.Web.ApiSpec.Helpers + + def open_api_operation(action) do + operation = String.to_existing_atom("#{action}_operation") + apply(__MODULE__, operation, []) + end + + def emoji_reactions_by_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: "PleromaController.emoji_reactions_by", + responses: %{ + 200 => array_of_reactions_response() + } + } + end + + def react_with_emoji_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: "PleromaController.react_with_emoji", + responses: %{ + 200 => Operation.response("Status", "application/json", Status) + } + } + end + + def unreact_with_emoji_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: "PleromaController.unreact_with_emoji", + 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 + + def conversation_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: "PleromaController.conversation", + responses: %{ + 200 => Operation.response("Conversation", "application/json", Conversation) + } + } + end + + def conversation_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: "PleromaController.conversation_statuses", + responses: %{ + 200 => + Operation.response( + "Array of Statuses", + "application/json", + StatusOperation.array_of_statuses() + ) + } + } + end + + def update_conversation_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: "PleromaController.update_conversation", + responses: %{ + 200 => Operation.response("Conversation", "application/json", Conversation) + } + } + end + + def mark_conversations_as_read_operation do + %Operation{ + tags: ["Conversations"], + summary: "Marks all user's conversations as read", + security: [%{"oAuth" => ["write:conversations"]}], + operationId: "PleromaController.mark_conversations_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 + + def mark_notifications_as_read_operation do + %Operation{ + tags: ["Notifications"], + summary: "Mark notifications as read. Query parameters are mutually exclusive.", + parameters: [ + Operation.parameter(:id, :query, :string, "A single notification ID to read"), + Operation.parameter(:max_id, :query, :string, "Read all notifications up to this id") + ], + security: [%{"oAuth" => ["write:notifications"]}], + operationId: "PleromaController.mark_notifications_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/pleroma_api/controllers/pleroma_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex index e834133b2..8220d13bc 100644 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex @@ -20,6 +20,8 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do alias Pleroma.Web.MastodonAPI.NotificationView alias Pleroma.Web.MastodonAPI.StatusView + plug(Pleroma.Web.ApiSpec.CastAndValidate) + plug( OAuthScopesPlug, %{scopes: ["read:statuses"]} @@ -49,14 +51,16 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do %{scopes: ["write:notifications"]} when action == :mark_notifications_as_read ) - def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id} = params) do + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaOperation + + 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 + if params[:emoji] && params[:emoji] != emoji do nil else users = @@ -79,7 +83,7 @@ def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id} } end end) - |> Enum.filter(& &1) + |> Enum.reject(&is_nil/1) conn |> json(reactions) @@ -90,7 +94,7 @@ def emoji_reactions_by(%{assigns: %{user: user}} = conn, %{"id" => activity_id} end end - def react_with_emoji(%{assigns: %{user: user}} = conn, %{"id" => activity_id, "emoji" => emoji}) do + 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 @@ -99,10 +103,7 @@ def react_with_emoji(%{assigns: %{user: user}} = conn, %{"id" => activity_id, "e end end - def unreact_with_emoji(%{assigns: %{user: user}} = conn, %{ - "id" => activity_id, - "emoji" => emoji - }) do + 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 @@ -112,7 +113,7 @@ def unreact_with_emoji(%{assigns: %{user: user}} = conn, %{ end end - def conversation(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) do + 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 @@ -128,12 +129,13 @@ def conversation(%{assigns: %{user: user}} = conn, %{"id" => participation_id}) def conversation_statuses( %{assigns: %{user: %{id: user_id} = user}} = conn, - %{"id" => participation_id} = params + %{id: participation_id} = params ) do with %Participation{user_id: ^user_id} = participation <- Participation.get(participation_id, preload: [:conversation]) do params = params + |> Map.new(fn {key, value} -> {to_string(key), value} end) |> Map.put("blocking_user", user) |> Map.put("muting_user", user) |> Map.put("user", user) @@ -162,7 +164,7 @@ def conversation_statuses( def update_conversation( %{assigns: %{user: user}} = conn, - %{"id" => participation_id, "recipients" => recipients} + %{id: participation_id, recipients: recipients} ) do with %Participation{} = participation <- Participation.get(participation_id), true <- user.id == participation.user_id, @@ -192,7 +194,7 @@ def mark_conversations_as_read(%{assigns: %{user: user}} = conn, _params) do end end - def mark_notifications_as_read(%{assigns: %{user: user}} = conn, %{"id" => notification_id}) do + 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) @@ -205,7 +207,7 @@ def mark_notifications_as_read(%{assigns: %{user: user}} = conn, %{"id" => notif end end - def mark_notifications_as_read(%{assigns: %{user: user}} = conn, %{"max_id" => max_id}) do + 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) 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 @@ def api_operations 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/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs index cfd1dbd24..f0cdc2f08 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs @@ -27,7 +27,7 @@ test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do |> 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) + |> json_response_and_validate_schema(200) # We return the status, but this our implementation detail. assert %{"id" => id} = result @@ -53,7 +53,7 @@ test "DELETE /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do |> 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 %{"id" => id} = json_response_and_validate_schema(result, 200) assert to_string(activity.id) == id ObanHelpers.perform_all() @@ -73,7 +73,7 @@ test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do result = conn |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) + |> json_response_and_validate_schema(200) assert result == [] @@ -85,7 +85,7 @@ test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do result = conn |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions") - |> json_response(200) + |> json_response_and_validate_schema(200) [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result @@ -96,7 +96,7 @@ test "GET /api/v1/pleroma/statuses/:id/reactions", %{conn: conn} do |> 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) + |> json_response_and_validate_schema(200) assert [%{"name" => "🎅", "count" => 1, "accounts" => [_represented_user], "me" => true}] = result @@ -111,7 +111,7 @@ test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do result = conn |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") - |> json_response(200) + |> json_response_and_validate_schema(200) assert result == [] @@ -121,7 +121,7 @@ test "GET /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do result = conn |> get("/api/v1/pleroma/statuses/#{activity.id}/reactions/🎅") - |> json_response(200) + |> json_response_and_validate_schema(200) [%{"name" => "🎅", "count" => 1, "accounts" => [represented_user], "me" => false}] = result @@ -140,7 +140,7 @@ test "/api/v1/pleroma/conversations/:id" do result = conn |> get("/api/v1/pleroma/conversations/#{participation.id}") - |> json_response(200) + |> json_response_and_validate_schema(200) assert result["id"] == participation.id |> to_string() end @@ -168,7 +168,7 @@ test "/api/v1/pleroma/conversations/:id/statuses" do result = conn |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses") - |> json_response(200) + |> json_response_and_validate_schema(200) assert length(result) == 2 @@ -186,12 +186,12 @@ test "/api/v1/pleroma/conversations/:id/statuses" do assert [%{"id" => ^id_two}, %{"id" => ^id_three}] = conn |> get("/api/v1/pleroma/conversations/#{participation.id}/statuses?limit=2") - |> json_response(:ok) + |> 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(:ok) + |> json_response_and_validate_schema(:ok) end test "PATCH /api/v1/pleroma/conversations/:id" do @@ -208,12 +208,12 @@ test "PATCH /api/v1/pleroma/conversations/:id" do 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}", %{ - "recipients" => [user.id, other_user.id] - }) - |> json_response(200) + |> patch("/api/v1/pleroma/conversations/#{participation.id}?#{query}") + |> json_response_and_validate_schema(200) assert result["id"] == participation.id |> to_string @@ -242,7 +242,7 @@ test "POST /api/v1/pleroma/conversations/read" do [%{"unread" => false}, %{"unread" => false}] = conn |> post("/api/v1/pleroma/conversations/read", %{}) - |> json_response(200) + |> json_response_and_validate_schema(200) [participation2, participation1] = Participation.for_user(other_user) assert Participation.get(participation2.id).read == true @@ -262,8 +262,8 @@ test "it marks a single notification as read", %{user: user1, conn: conn} do response = conn - |> post("/api/v1/pleroma/notifications/read", %{"id" => "#{notification1.id}"}) - |> json_response(:ok) + |> 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 @@ -280,8 +280,8 @@ test "it marks multiple notifications as read", %{user: user1, conn: conn} do [response1, response2] = conn - |> post("/api/v1/pleroma/notifications/read", %{"max_id" => "#{notification2.id}"}) - |> json_response(:ok) + |> 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 @@ -293,8 +293,8 @@ test "it marks multiple notifications as read", %{user: user1, conn: conn} do 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) + |> post("/api/v1/pleroma/notifications/read?id=22222222222222") + |> json_response_and_validate_schema(:bad_request) assert response == %{"error" => "Cannot get notification"} end From 9a5de0f4548cfe6b62265596bbe3cef2d639b978 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 19 May 2020 23:50:49 +0400 Subject: [PATCH 125/492] Move reaction actions to EmojiReactionController --- .../operations/emoji_reaction_operation.ex | 102 ++++++++++++++ .../api_spec/operations/pleroma_operation.ex | 96 +------------- .../controllers/emoji_reaction_controller.ex | 61 +++++++++ .../controllers/pleroma_api_controller.ex | 77 ----------- .../pleroma_api/views/emoji_reaction_view.ex | 33 +++++ lib/pleroma/web/router.ex | 8 +- .../emoji_reaction_controller_test.exs | 125 ++++++++++++++++++ .../pleroma_api_controller_test.exs | 115 ---------------- 8 files changed, 329 insertions(+), 288 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex create mode 100644 lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex create mode 100644 lib/pleroma/web/pleroma_api/views/emoji_reaction_view.ex create mode 100644 test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs 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..7c08fbaa7 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex @@ -0,0 +1,102 @@ +# 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.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) + } + } + 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/pleroma_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_operation.ex index c6df5c854..7e46ba553 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_operation.ex @@ -5,13 +5,11 @@ defmodule Pleroma.Web.ApiSpec.PleromaOperation 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.Conversation - alias Pleroma.Web.ApiSpec.StatusOperation alias Pleroma.Web.ApiSpec.NotificationOperation + alias Pleroma.Web.ApiSpec.Schemas.ApiError + alias Pleroma.Web.ApiSpec.Schemas.Conversation + alias Pleroma.Web.ApiSpec.Schemas.FlakeID + alias Pleroma.Web.ApiSpec.StatusOperation import Pleroma.Web.ApiSpec.Helpers @@ -20,92 +18,6 @@ def open_api_operation(action) do apply(__MODULE__, operation, []) end - def emoji_reactions_by_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: "PleromaController.emoji_reactions_by", - responses: %{ - 200 => array_of_reactions_response() - } - } - end - - def react_with_emoji_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: "PleromaController.react_with_emoji", - responses: %{ - 200 => Operation.response("Status", "application/json", Status) - } - } - end - - def unreact_with_emoji_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: "PleromaController.unreact_with_emoji", - 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 - def conversation_operation do %Operation{ tags: ["Conversations"], 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..a002912f3 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex @@ -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.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 + + 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/pleroma_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex index 8220d13bc..61273f7ee 100644 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex @@ -7,15 +7,10 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do 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 @@ -28,18 +23,6 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do 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"]} @@ -53,66 +36,6 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaOperation - 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.reject(&is_nil/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 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/router.ex b/lib/pleroma/web/router.ex index 369c54cf4..12381511e 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -297,8 +297,8 @@ 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 @@ -314,8 +314,8 @@ defmodule Pleroma.Web.Router do pipe_through(:authenticated_api) patch("/conversations/:id", PleromaAPIController, :update_conversation) - put("/statuses/:id/reactions/:emoji", PleromaAPIController, :react_with_emoji) - delete("/statuses/:id/reactions/:emoji", PleromaAPIController, :unreact_with_emoji) + put("/statuses/:id/reactions/:emoji", EmojiReactionController, :create) + delete("/statuses/:id/reactions/:emoji", EmojiReactionController, :delete) post("/notifications/read", PleromaAPIController, :mark_notifications_as_read) patch("/accounts/update_avatar", AccountController, :update_avatar) 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..ee66ebf87 --- /dev/null +++ b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs @@ -0,0 +1,125 @@ +# 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} + ] + 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/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs index f0cdc2f08..6f4f01e6f 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs @@ -3,131 +3,16 @@ # 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_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} - ] - 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, "☕") - - 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 - end - test "/api/v1/pleroma/conversations/:id" do user = insert(:user) %{user: other_user, conn: conn} = oauth_access(["read:statuses"]) From f3fc8b22b1dca8d432d066417e2bb9b62a3f1520 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Wed, 20 May 2020 15:00:11 +0400 Subject: [PATCH 126/492] Move conversation actions to PleromaAPI.ConversationController --- .../pleroma_conversation_operation.ex | 106 ++++++++++++++ .../api_spec/operations/pleroma_operation.ex | 93 ------------ .../controllers/conversation_controller.ex | 95 ++++++++++++ .../controllers/pleroma_api_controller.ex | 99 ------------- lib/pleroma/web/router.ex | 12 +- .../conversation_controller_test.exs | 136 ++++++++++++++++++ .../pleroma_api_controller_test.exs | 124 ---------------- 7 files changed, 341 insertions(+), 324 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/pleroma_conversation_operation.ex create mode 100644 lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex create mode 100644 test/web/pleroma_api/controllers/conversation_controller_test.exs 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_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_operation.ex index 7e46ba553..d28451933 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_operation.ex @@ -7,105 +7,12 @@ defmodule Pleroma.Web.ApiSpec.PleromaOperation do alias OpenApiSpex.Schema alias Pleroma.Web.ApiSpec.NotificationOperation alias Pleroma.Web.ApiSpec.Schemas.ApiError - 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 conversation_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: "PleromaController.conversation", - responses: %{ - 200 => Operation.response("Conversation", "application/json", Conversation) - } - } - end - - def conversation_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: "PleromaController.conversation_statuses", - responses: %{ - 200 => - Operation.response( - "Array of Statuses", - "application/json", - StatusOperation.array_of_statuses() - ) - } - } - end - - def update_conversation_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: "PleromaController.update_conversation", - responses: %{ - 200 => Operation.response("Conversation", "application/json", Conversation) - } - } - end - - def mark_conversations_as_read_operation do - %Operation{ - tags: ["Conversations"], - summary: "Marks all user's conversations as read", - security: [%{"oAuth" => ["write:conversations"]}], - operationId: "PleromaController.mark_conversations_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 - def mark_notifications_as_read_operation do %Operation{ tags: ["Notifications"], 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..21d5eb8d5 --- /dev/null +++ b/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex @@ -0,0 +1,95 @@ +# 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.new(fn {key, value} -> {to_string(key), value} end) + |> 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/pleroma_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex index 61273f7ee..a58665abe 100644 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex @@ -5,30 +5,12 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do use Pleroma.Web, :controller - import Pleroma.Web.ControllerHelper, only: [add_link_headers: 2] - - alias Pleroma.Conversation.Participation alias Pleroma.Notification alias Pleroma.Plugs.OAuthScopesPlug - alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.MastodonAPI.ConversationView alias Pleroma.Web.MastodonAPI.NotificationView - alias Pleroma.Web.MastodonAPI.StatusView plug(Pleroma.Web.ApiSpec.CastAndValidate) - plug( - OAuthScopesPlug, - %{scopes: ["read:statuses"]} - when action in [:conversation, :conversation_statuses] - ) - - 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 @@ -36,87 +18,6 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaOperation - 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.new(fn {key, value} -> {to_string(key), value} end) - |> 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 diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 12381511e..78da4a871 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -305,15 +305,11 @@ defmodule Pleroma.Web.Router 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 + get("/conversations/:id/statuses", ConversationController, :statuses) + get("/conversations/:id", ConversationController, :show) + post("/conversations/read", ConversationController, :mark_as_read) + patch("/conversations/:id", ConversationController, :update) - scope [] do - pipe_through(:authenticated_api) - - patch("/conversations/:id", PleromaAPIController, :update_conversation) put("/statuses/:id/reactions/:emoji", EmojiReactionController, :create) delete("/statuses/:id/reactions/:emoji", EmojiReactionController, :delete) post("/notifications/read", PleromaAPIController, :mark_notifications_as_read) 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/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs index 6f4f01e6f..c4c661266 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs @@ -5,136 +5,12 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do use Pleroma.Web.ConnCase - alias Pleroma.Conversation.Participation alias Pleroma.Notification 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 - describe "POST /api/v1/pleroma/notifications/read" do setup do: oauth_access(["write:notifications"]) From 5ba6e1c322c0937849eca53fc816f348659fb34c Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Wed, 20 May 2020 15:14:11 +0400 Subject: [PATCH 127/492] Move notification actions to PleromaAPI.NotificationController --- ...n.ex => pleroma_notification_operation.ex} | 6 +-- .../controllers/notification_controller.ex | 36 +++++++++++++++ .../controllers/pleroma_api_controller.ex | 46 ------------------- lib/pleroma/web/router.ex | 2 +- ...t.exs => notification_controller_test.exs} | 2 +- 5 files changed, 41 insertions(+), 51 deletions(-) rename lib/pleroma/web/api_spec/operations/{pleroma_operation.ex => pleroma_notification_operation.ex} (89%) create mode 100644 lib/pleroma/web/pleroma_api/controllers/notification_controller.ex delete mode 100644 lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex rename test/web/pleroma_api/controllers/{pleroma_api_controller_test.exs => notification_controller_test.exs} (97%) diff --git a/lib/pleroma/web/api_spec/operations/pleroma_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex similarity index 89% rename from lib/pleroma/web/api_spec/operations/pleroma_operation.ex rename to lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex index d28451933..636c39a15 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ApiSpec.PleromaOperation do +defmodule Pleroma.Web.ApiSpec.PleromaNotificationOperation do alias OpenApiSpex.Operation alias OpenApiSpex.Schema alias Pleroma.Web.ApiSpec.NotificationOperation @@ -13,7 +13,7 @@ def open_api_operation(action) do apply(__MODULE__, operation, []) end - def mark_notifications_as_read_operation do + def mark_as_read_operation do %Operation{ tags: ["Notifications"], summary: "Mark notifications as read. Query parameters are mutually exclusive.", @@ -22,7 +22,7 @@ def mark_notifications_as_read_operation do Operation.parameter(:max_id, :query, :string, "Read all notifications up to this id") ], security: [%{"oAuth" => ["write:notifications"]}], - operationId: "PleromaController.mark_notifications_as_read", + operationId: "PleromaAPI.NotificationController.mark_as_read", responses: %{ 200 => Operation.response( 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..0b2f678c5 --- /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}} = conn, %{id: notification_id}) 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}} = conn, %{max_id: max_id}) 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 a58665abe..000000000 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ /dev/null @@ -1,46 +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 - - alias Pleroma.Notification - alias Pleroma.Plugs.OAuthScopesPlug - alias Pleroma.Web.MastodonAPI.NotificationView - - plug(Pleroma.Web.ApiSpec.CastAndValidate) - - plug( - OAuthScopesPlug, - %{scopes: ["write:notifications"]} when action == :mark_notifications_as_read - ) - - defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaOperation - - 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/router.ex b/lib/pleroma/web/router.ex index 78da4a871..0e29e5645 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -312,7 +312,7 @@ defmodule Pleroma.Web.Router do put("/statuses/:id/reactions/:emoji", EmojiReactionController, :create) delete("/statuses/:id/reactions/:emoji", EmojiReactionController, :delete) - post("/notifications/read", PleromaAPIController, :mark_notifications_as_read) + post("/notifications/read", NotificationController, :mark_as_read) patch("/accounts/update_avatar", AccountController, :update_avatar) patch("/accounts/update_banner", AccountController, :update_banner) diff --git a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs b/test/web/pleroma_api/controllers/notification_controller_test.exs similarity index 97% rename from test/web/pleroma_api/controllers/pleroma_api_controller_test.exs rename to test/web/pleroma_api/controllers/notification_controller_test.exs index c4c661266..7c5ace804 100644 --- a/test/web/pleroma_api/controllers/pleroma_api_controller_test.exs +++ b/test/web/pleroma_api/controllers/notification_controller_test.exs @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.PleromaAPI.PleromaAPIControllerTest do +defmodule Pleroma.Web.PleromaAPI.NotificationControllerTest do use Pleroma.Web.ConnCase alias Pleroma.Notification From eb5f4285651c923aa3d776a2bc317c2a902031cc Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 20 May 2020 13:38:47 +0200 Subject: [PATCH 128/492] CommonAPI: Change public->private implicit addressing. This will not add the OP to the `to` field anymore when going from public to private. --- lib/pleroma/web/common_api/utils.ex | 3 ++- test/web/common_api/common_api_test.exs | 26 +++++++++++++++++++ test/web/common_api/common_api_utils_test.exs | 12 +++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index e8deee223..b9fa21648 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -102,7 +102,8 @@ def get_to_and_cc(user, mentioned_users, inReplyTo, "private", _) 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, []} diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 52e95397c..6014ffdac 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -335,6 +335,32 @@ test "it does not allow replies to direct messages that are not direct messages 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) diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index 5708db6a4..d7d2d10d5 100644 --- a/test/web/common_api/common_api_utils_test.exs +++ b/test/web/common_api/common_api_utils_test.exs @@ -297,11 +297,10 @@ test "for private posts, a reply" 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 +326,15 @@ test "for direct posts, a reply" 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) From e42bc5f55732d42bf40ed9129ec737e654a911b8 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 20 May 2020 15:44:37 +0200 Subject: [PATCH 129/492] Announcements: Handle through common pipeline. --- lib/pleroma/web/activity_pub/activity_pub.ex | 30 ----------- lib/pleroma/web/activity_pub/builder.ex | 15 +++++- .../web/activity_pub/object_validator.ex | 2 +- .../object_validators/announce_validator.ex | 5 +- lib/pleroma/web/activity_pub/side_effects.ex | 12 +++++ .../web/activity_pub/transmogrifier.ex | 19 +------ lib/pleroma/web/common_api/common_api.ex | 23 +++++---- test/fixtures/mastodon-note-object.json | 50 ++++++++++++++++--- test/web/activity_pub/side_effects_test.exs | 25 ++++++++++ .../transmogrifier/announce_handling_test.exs | 20 ++++++-- test/web/common_api/common_api_test.exs | 13 ++--- 11 files changed, 135 insertions(+), 79 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index d752f4f04..2cea55285 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -356,36 +356,6 @@ def update(%{to: to, cc: cc, actor: actor, object: object} = params) do 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()) :: {:ok, Activity.t()} | {:error, any()} def follow(follower, followed, activity_id \\ nil, local \\ true) do diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 63f89c2b4..7ece764f5 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -10,6 +10,8 @@ defmodule Pleroma.Web.ActivityPub.Builder do 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 @@ -83,9 +85,17 @@ def like(actor, object) do end end - def announce(actor, object) do + def announce(actor, object, options \\ []) do + public? = Keyword.get(options, :public, false) to = [actor.follower_address, object.data["actor"]] + to = + if public? do + [Pleroma.Constants.as_public() | to] + else + to + end + {:ok, %{ "id" => Utils.generate_activity_id(), @@ -93,7 +103,8 @@ def announce(actor, object) do "object" => object.data["id"], "to" => to, "context" => object.data["context"], - "type" => "Announce" + "type" => "Announce", + "published" => Utils.make_date() }, []} end diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 600e58123..2599067a8 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -88,7 +88,7 @@ def fetch_actor(object) do 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 index 158ae199d..082fdea4d 100644 --- a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex @@ -18,9 +18,10 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator do field(:type, :string) field(:object, Types.ObjectID) field(:actor, Types.ObjectID) - field(:context, :string) + field(:context, :string, autogenerate: {Utils, :generate_context_id, []}) field(:to, Types.Recipients, default: []) field(:cc, Types.Recipients, default: []) + field(:published, Types.DateTime) end def cast_and_validate(data) do @@ -47,7 +48,7 @@ def fix_after_cast(cng) do def validate_data(data_cng) do data_cng |> validate_inclusion(:type, ["Announce"]) - |> validate_required([:id, :type, :object, :actor, :context, :to, :cc]) + |> validate_required([:id, :type, :object, :actor, :to, :cc]) |> validate_actor_presence() |> validate_object_presence() |> validate_existing_announce() diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index bfc2ab845..bc0d31c45 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -27,6 +27,18 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do {:ok, object, meta} end + # Tasks this handles: + # - Add announce to object + # - Set up notification + def handle(%{data: %{"type" => "Announce"}} = object, meta) do + announced_object = Object.get_by_ap_id(object.data["object"]) + Utils.add_announce_to_object(object, announced_object) + + Notification.create_notifications(object) + + {: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 diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 6104af4f9..d594c64f4 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -662,7 +662,8 @@ def handle_incoming( |> handle_incoming(options) end - def handle_incoming(%{"type" => type} = data, _options) when type in ["Like", "EmojiReact"] do + def handle_incoming(%{"type" => type} = data, _options) + when type in ["Like", "EmojiReact", "Announce"] do with :ok <- ObjectValidator.fetch_actor_and_object(data), {:ok, activity, _meta} <- Pipeline.common_pipeline(data, local: false) do @@ -672,22 +673,6 @@ def handle_incoming(%{"type" => type} = data, _options) when type in ["Like", "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}} <- {:fetch_user, User.get_or_fetch_by_ap_id(actor)}, - {_, {:ok, object}} <- {:get_embedded, get_embedded_obj_helper(object_id, actor)}, - public <- Visibility.is_public?(data), - {_, {:ok, activity, _object}} <- - {:announce, ActivityPub.announce(actor, object, id, false, public)} do - {:ok, activity} - else - e -> {:error, e} - end - end - def handle_incoming( %{"type" => "Update", "object" => %{"type" => object_type} = object, "actor" => actor_id} = data, diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 447dbe4e6..dbb3d7ade 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -127,18 +127,19 @@ def delete(activity_id, user) 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 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/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index a46254a05..5dede3957 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -289,4 +289,29 @@ test "creates a notification", %{like: like, poster: poster} do assert Repo.get_by(Notification, user_id: poster.id, activity_id: like.id) end end + + describe "announce objects" do + setup do + poster = insert(:user) + user = insert(:user) + {:ok, post} = CommonAPI.post(poster, %{status: "hey"}) + + {:ok, announce_data, _meta} = Builder.announce(user, post.object) + {:ok, announce, _meta} = ActivityPub.persist(announce_data, local: true) + + %{announce: announce, user: user, poster: poster} + end + + test "add 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 "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 + end end diff --git a/test/web/activity_pub/transmogrifier/announce_handling_test.exs b/test/web/activity_pub/transmogrifier/announce_handling_test.exs index 8a4af6546..50bcb307f 100644 --- a/test/web/activity_pub/transmogrifier/announce_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/announce_handling_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do import Pleroma.Factory test "it works for incoming honk announces" do - _user = insert(:user, ap_id: "https://honktest/u/test", local: false) + user = insert(:user, ap_id: "https://honktest/u/test", local: false) other_user = insert(:user) {:ok, post} = CommonAPI.post(other_user, %{status: "bonkeronk"}) @@ -28,6 +28,11 @@ test "it works for incoming honk announces" do } {: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 @@ -48,8 +53,15 @@ test "it works for incoming announces with actor being inlined (kroeg)" do end test "it works for incoming announces, fetching the announced object" do - Tesla.Mock.mock_global(fn env -> apply(HttpRequestMock, :request, [env]) end) - data = File.read!("test/fixtures/mastodon-announce.json") |> Poison.decode!() + 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"]) @@ -92,6 +104,8 @@ test "it works for incoming announces with an existing activity" do 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") diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 52e95397c..e68a6a7d2 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -416,7 +416,8 @@ test "repeating a status" 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 +425,9 @@ test "can't repeat a repeat" 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,7 +436,7 @@ test "repeating a status privately" 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) @@ -458,8 +459,8 @@ test "retweeting a status twice returns the status" 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 From 39031f4860c91dee9418f69cc3b295cdfc9316bd Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 20 May 2020 16:36:55 +0200 Subject: [PATCH 130/492] Pipeline: Don't federate if federation is disabled. --- lib/pleroma/web/activity_pub/pipeline.ex | 3 +- test/web/activity_pub/pipeline_test.exs | 44 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 657cdfdb1..1d6bc2000 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.SideEffects alias Pleroma.Web.Federator + alias Pleroma.Config @spec common_pipeline(map(), keyword()) :: {:ok, Activity.t() | Object.t(), keyword()} | {:error, any()} @@ -44,7 +45,7 @@ defp maybe_federate(%Object{}, _), do: {:ok, :not_federated} 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/test/web/activity_pub/pipeline_test.exs b/test/web/activity_pub/pipeline_test.exs index f3c437498..26557720b 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] @@ -83,5 +88,44 @@ test "it goes through validation, filtering, persisting, side effects without fe 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] + }, + { + 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 end end From 4c48626585d2efae21625d106dac7e28b3227925 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 20 May 2020 12:22:31 -0500 Subject: [PATCH 131/492] Also add new sidebarRight setting --- config/config.exs | 1 + config/description.exs | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/config/config.exs b/config/config.exs index 7b99a41aa..e9a727557 100644 --- a/config/config.exs +++ b/config/config.exs @@ -292,6 +292,7 @@ redirectRootLogin: "/main/friends", redirectRootNoLogin: "/main/all", scopeCopy: true, + sidebarRight: false, showFeaturesPanel: true, showInstanceSpecificPanel: false, subjectLineBehavior: "email", diff --git a/config/description.exs b/config/description.exs index 324cae8cf..716bcf4ff 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1117,6 +1117,7 @@ redirectRootLogin: "/main/friends", redirectRootNoLogin: "/main/all", scopeCopy: true, + sidebarRight: false, showFeaturesPanel: true, showInstanceSpecificPanel: false, subjectLineBehavior: "email", @@ -1256,6 +1257,12 @@ 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", From c96f425cb0fbac04b2ad5be2cff3805903bbd9b9 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Wed, 20 May 2020 21:16:40 +0300 Subject: [PATCH 132/492] fixed `mix pleroma.instance gen` --- lib/mix/tasks/pleroma/instance.ex | 8 ++++---- test/tasks/instance_test.exs | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) 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 @@ def run(["gen" | rest]) 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 @@ def run(["gen" | rest]) 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 @@ def run(["gen" | rest]) 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 @@ def run(["gen" | rest]) 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/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 @@ test "running gen" do "--uploads-dir", "test/uploads", "--static-dir", - "instance/static/" + "./test/../test/instance/static/" ]) end @@ -83,6 +83,7 @@ test "running gen" 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 From b7fc61e17b995e3aa4e52f85b91d320a1cd1e106 Mon Sep 17 00:00:00 2001 From: eugenijm Date: Sun, 12 Apr 2020 22:54:43 +0300 Subject: [PATCH 133/492] Added the ability to upload background, logo, default user avatar, instance thumbnail, and the NSFW hiding image via AdminFE --- config/description.exs | 17 +++++++++++++++-- lib/pleroma/emails/new_users_digest_email.ex | 6 ++++-- lib/pleroma/helpers/uri_helper.ex | 3 +++ lib/pleroma/user.ex | 9 +++++++-- .../web/mastodon_api/views/instance_view.ex | 7 ++++++- test/user_test.exs | 12 ++++++++++++ .../cron/new_users_digest_worker_test.exs | 1 + 7 files changed, 48 insertions(+), 7 deletions(-) diff --git a/config/description.exs b/config/description.exs index 716bcf4ff..cf7cc297a 100644 --- a/config/description.exs +++ b/config/description.exs @@ -969,6 +969,13 @@ ] } ] + }, + %{ + key: :instance_thumbnail, + type: :string, + description: + "The instance thumbnail image. It will appear in [Pleroma Instances](http://distsn.org/pleroma-instances.html)", + suggestions: ["/instance/thumbnail.jpeg"] } ] }, @@ -1112,7 +1119,7 @@ logoMask: true, minimalScopesMode: false, noAttachmentLinks: false, - nsfwCensorImage: "", + nsfwCensorImage: "/static/img/nsfw.74818f9.png", postContentType: "text/plain", redirectRootLogin: "/main/friends", redirectRootNoLogin: "/main/all", @@ -1226,7 +1233,7 @@ type: :string, description: "URL of the image to use for hiding NSFW media attachments in the timeline.", - suggestions: ["/static/img/nsfw.png"] + suggestions: ["/static/img/nsfw.74818f9.png"] }, %{ key: :postContentType, @@ -1346,6 +1353,12 @@ suggestions: [ :pleroma_fox_tan ] + }, + %{ + key: :default_user_avatar, + type: :string, + description: "URL of the default user avatar.", + suggestions: ["/images/avi.png"] } ] }, 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 @@ def new_users(to, users_and_statuses) 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/helpers/uri_helper.ex b/lib/pleroma/helpers/uri_helper.ex index 256252ddb..69d8c8fe0 100644 --- a/lib/pleroma/helpers/uri_helper.ex +++ b/lib/pleroma/helpers/uri_helper.ex @@ -24,4 +24,7 @@ def append_param_if_present(%{} = params, param_name, param_value) do 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/user.ex b/lib/pleroma/user.ex index e8013bf40..eb9533d78 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -305,8 +305,13 @@ def invisible?(_), do: false 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 diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index 8088306c3..6a630eafa 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 @@ def render("show.json", _) do streaming_api: Pleroma.Web.Endpoint.websocket_url() }, stats: Pleroma.Stats.get_stats(), - thumbnail: Pleroma.Web.base_url() <> "/instance/thumbnail.jpeg", + thumbnail: instance_thumbnail(), languages: ["en"], registrations: Keyword.get(instance, :registrations_open), # Extra (not present in Mastodon): @@ -87,4 +87,9 @@ def federation do end |> Map.put(:enabled, Config.get([:instance, :federating])) end + + defp instance_thumbnail do + Pleroma.Config.get([:instance, :instance_thumbnail]) || + "#{Pleroma.Web.base_url()}/instance/thumbnail.jpeg" + end end diff --git a/test/user_test.exs b/test/user_test.exs index 863e0106c..ea192ad10 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1777,4 +1777,16 @@ test "Notifications are updated", %{user: user} do assert result.email_notifications["digest"] == false end end + + test "avatar fallback" do + user = insert(:user) + assert User.avatar_url(user) =~ "/images/avi.png" + + Pleroma.Config.put([: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/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 @@ test "it sends new users digest emails" 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 From 9bc5e18adeef2c68c5fae2435ed01555f1b29c93 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Thu, 21 May 2020 08:06:57 +0300 Subject: [PATCH 134/492] rename mix task: `pleroma.user unsubscribe` -> `pleroma.user deactivate` --- docs/administration/CLI_tasks/user.md | 19 +++++++++---------- lib/mix/tasks/pleroma/user.ex | 6 +++--- test/tasks/user_test.exs | 8 ++++---- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/docs/administration/CLI_tasks/user.md b/docs/administration/CLI_tasks/user.md index f535dad82..797641898 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 deacitivate_all_from_instance ``` ```sh tab="From Source" -mix pleroma.user unsubscribe_all_from_instance +mix pleroma.user deactivate_all_from_instance ``` @@ -177,4 +177,3 @@ mix pleroma.user untag ```sh tab="From Source" mix pleroma.user toggle_confirmed ``` - diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 93ecb4631..3635c02bc 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -144,7 +144,7 @@ def run(["reset_password", nickname]) do end end - def run(["unsubscribe", nickname]) do + def run(["deactivate", nickname]) do start_pleroma() with %User{} = user <- User.get_cached_by_nickname(nickname) do @@ -163,7 +163,7 @@ def run(["unsubscribe", nickname]) 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}"}) @@ -171,7 +171,7 @@ def run(["unsubscribe_all_from_instance", instance]) 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/test/tasks/user_test.exs b/test/tasks/user_test.exs index 4b3ab5a87..ab7637511 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -169,7 +169,7 @@ test "no user to toggle" 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) @@ -178,7 +178,7 @@ test "user is unsubscribed" do 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" @@ -192,8 +192,8 @@ test "user is unsubscribed" do 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" From 9de9760aa696657400c762d46dced273c3475be4 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Wed, 20 May 2020 18:00:41 +0400 Subject: [PATCH 135/492] Move status actions to AdminAPI.StatusController --- .../{ => controllers}/admin_api_controller.ex | 124 +----------- .../controllers/fallback_controller.ex | 31 +++ .../controllers/status_controller.ex | 112 +++++++++++ lib/pleroma/web/router.ex | 8 +- .../admin_api_controller_test.exs | 157 --------------- .../controllers/status_controller_test.exs | 185 ++++++++++++++++++ 6 files changed, 342 insertions(+), 275 deletions(-) rename lib/pleroma/web/admin_api/{ => controllers}/admin_api_controller.ex (89%) create mode 100644 lib/pleroma/web/admin_api/controllers/fallback_controller.ex create mode 100644 lib/pleroma/web/admin_api/controllers/status_controller.ex rename test/web/admin_api/{ => controllers}/admin_api_controller_test.exs (96%) create mode 100644 test/web/admin_api/controllers/status_controller_test.exs 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 89% 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..6b1d64a2e 100644 --- a/lib/pleroma/web/admin_api/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -98,13 +98,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do 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( @@ -136,7 +130,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do ] ) - action_fallback(:errors) + action_fallback(AdminAPI.FallbackController) def user_delete(conn, %{"nickname" => nickname}) do user_delete(conn, %{"nicknames" => [nickname]}) @@ -597,16 +591,10 @@ def email_invite(%{assigns: %{user: user}} = conn, %{"email" => email} = params) json_response(conn, :no_content, "") else {:registrations_open, _} -> - errors( - conn, - {:error, "To send invites you need to set the `registrations_open` option to false."} - ) + {: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."} - ) + {:error, "To send invites you need to set the `invites_enabled` option to true."} end end @@ -814,71 +802,6 @@ def report_notes_delete(%{assigns: %{user: user}} = conn, %{ 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] - }) - - 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 - }) - - json(conn, %{}) - end - end - def list_log(conn, params) do {page, page_size} = page_params(params) @@ -904,7 +827,7 @@ def config_descriptions(conn, _params) do end def config_show(conn, %{"only_db" => true}) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do configs = Pleroma.Repo.all(ConfigDB) conn @@ -914,7 +837,7 @@ def config_show(conn, %{"only_db" => true}) do end def config_show(conn, _params) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do configs = ConfigDB.get_all_as_keyword() merged = @@ -953,7 +876,7 @@ def config_show(conn, _params) do end def config_update(conn, %{"configs" => configs}) do - with :ok <- configurable_from_database(conn) do + with :ok <- configurable_from_database() do {_errors, results} = configs |> Enum.filter(&whitelisted_config?/1) @@ -997,7 +920,7 @@ def config_update(conn, %{"configs" => configs}) do 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,14 +931,11 @@ def need_reboot(conn, _params) 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 @@ -1159,30 +1079,6 @@ def stats(conn, _) do |> 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")) - end - defp page_params(params) do {get_page(params["page"]), get_page_size(params["page_size"])} 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..9f7bb92ce --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex @@ -0,0 +1,31 @@ +# 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(dgettext("errors", "Not found")) + end + + def call(conn, {:error, reason}) do + conn + |> put_status(:bad_request) + |> json(reason) + 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(dgettext("errors", "Something went wrong")) + 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..1e9763979 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/status_controller.ex @@ -0,0 +1,112 @@ +# 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 + + @users_page_size 50 + + 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) + + def index(%{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" + }) + + render(conn, "index.json", %{activities: activities, as: :activity}) + end + + def 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 + nil -> {:error, :not_found} + end + end + + def 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] + }) + + 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 + + defp page_params(params) do + {get_page(params["page"]), get_page_size(params["page_size"])} + end + + defp get_page(page_string) when is_nil(page_string), do: 1 + + defp get_page(page_string) do + case Integer.parse(page_string) do + {page, _} -> page + :error -> 1 + end + end + + defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size + + defp get_page_size(page_size_string) do + case Integer.parse(page_size_string) do + {page_size, _} -> page_size + :error -> @users_page_size + end + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 4cacf6255..9e99ab218 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -189,10 +189,10 @@ defmodule Pleroma.Web.Router do post("/reports/:id/notes", AdminAPIController, :report_notes_create) delete("/reports/:report_id/notes/:id", AdminAPIController, :report_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) diff --git a/test/web/admin_api/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs similarity index 96% rename from test/web/admin_api/admin_api_controller_test.exs rename to test/web/admin_api/controllers/admin_api_controller_test.exs index 370d876d0..2c317e0fe 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1697,115 +1697,6 @@ test "returns 403 when requested by anonymous" do 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) @@ -2998,54 +2889,6 @@ test "need_reboot flag", %{conn: conn} do 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) 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..8ecc78491 --- /dev/null +++ b/test/web/admin_api/controllers/status_controller_test.exs @@ -0,0 +1,185 @@ +# 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(: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/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 +end From 4ae2f75c3e5d293c24fac978b1ae10fdfa7a3c00 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 10:27:06 +0000 Subject: [PATCH 136/492] Apply suggestion to docs/administration/CLI_tasks/user.md --- docs/administration/CLI_tasks/user.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/administration/CLI_tasks/user.md b/docs/administration/CLI_tasks/user.md index 797641898..afeb8d52f 100644 --- a/docs/administration/CLI_tasks/user.md +++ b/docs/administration/CLI_tasks/user.md @@ -117,7 +117,7 @@ mix pleroma.user deactivate NICKNAME ## Deactivate all accounts from an instance and unsubscribe local users on it ```sh tab="OTP" - ./bin/pleroma_ctl user deacitivate_all_from_instance + ./bin/pleroma_ctl user deactivate_all_from_instance ``` ```sh tab="From Source" From d9d425708e094a428fb05127b97480a122c1c616 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 12:43:09 +0200 Subject: [PATCH 137/492] SideEffects: Builed out Announce effects. --- lib/pleroma/web/activity_pub/side_effects.ex | 8 +++- test/web/activity_pub/side_effects_test.exs | 48 ++++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index bc0d31c45..66aa1f628 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.ActivityPub.Utils def handle(object, meta \\ []) @@ -30,11 +31,16 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do # 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"]) - Utils.add_announce_to_object(object, announced_object) + + if Visibility.is_public?(object) do + Utils.add_announce_to_object(object, announced_object) + end Notification.create_notifications(object) + ActivityPub.stream_out(object) {:ok, object, meta} end diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 5dede3957..db8bf2b05 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -172,7 +172,7 @@ test "when activation is required", %{delete: delete, user: user} 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, announce} = CommonAPI.repeat(post.id, user) {:ok, block} = ActivityPub.block(user, poster) User.block(user, poster) @@ -295,23 +295,63 @@ test "creates a notification", %{like: like, poster: poster} 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_data, _meta} = Builder.announce(user, post.object) {: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} + %{ + announce: announce, + user: user, + poster: poster, + private_announce: private_announce, + relay_announce: relay_announce + } end - test "add the announce to the original object", %{announce: announce, user: user} do + 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 announce is private", %{ + private_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 "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_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], stream_out: fn _ -> nil end do + {:ok, announce, _} = SideEffects.handle(announce) + + assert called(Pleroma.Web.ActivityPub.ActivityPub.stream_out(announce)) + end + end end end From 23e248694df988d50e8a07b704a7ac56b8e9b19c Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 13:16:21 +0200 Subject: [PATCH 138/492] Announcements: Fix all tests. --- lib/pleroma/web/activity_pub/relay.ex | 9 +- lib/pleroma/web/activity_pub/side_effects.ex | 5 +- .../controllers/status_controller.ex | 2 +- test/notification_test.exs | 6 +- test/tasks/user_test.exs | 5 +- test/user_test.exs | 4 +- test/web/activity_pub/activity_pub_test.exs | 85 ++----------------- test/web/activity_pub/relay_test.exs | 15 ++-- test/web/activity_pub/side_effects_test.exs | 8 -- test/web/activity_pub/transmogrifier_test.exs | 2 +- test/web/activity_pub/utils_test.exs | 2 +- .../activity_pub/views/object_view_test.exs | 2 +- .../admin_api/admin_api_controller_test.exs | 4 +- test/web/common_api/common_api_test.exs | 5 ++ .../controllers/account_controller_test.exs | 6 +- .../notification_controller_test.exs | 8 +- .../controllers/status_controller_test.exs | 18 ++-- .../views/notification_view_test.exs | 2 +- .../mastodon_api/views/status_view_test.exs | 4 +- test/web/push/impl_test.exs | 2 +- test/web/streamer/streamer_test.exs | 6 +- 21 files changed, 64 insertions(+), 136 deletions(-) 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 @@ def unfollow(target_instance) 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 66aa1f628..7eae0c52c 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -11,7 +11,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.ActivityPub.Visibility alias Pleroma.Web.ActivityPub.Utils def handle(object, meta \\ []) @@ -35,9 +34,7 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do def handle(%{data: %{"type" => "Announce"}} = object, meta) do announced_object = Object.get_by_ap_id(object.data["object"]) - if Visibility.is_public?(object) do - Utils.add_announce_to_object(object, announced_object) - end + Utils.add_announce_to_object(object, announced_object) Notification.create_notifications(object) ActivityPub.stream_out(object) diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex index 9dbf4f33c..83d997abd 100644 --- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex @@ -210,7 +210,7 @@ def delete(%{assigns: %{user: user}} = conn, %{id: id}) 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 diff --git a/test/notification_test.exs b/test/notification_test.exs index 111ff09f4..3a96721fa 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -648,7 +648,7 @@ test "it does not send notification to mentioned users in announces" 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 +778,7 @@ test "repeating an activity results in 1 notification, then 0 if the activity is 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 +795,7 @@ test "repeating an activity results in 1 notification, then 0 if the activity is 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 diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index 4aa873f0b..7db48439f 100644 --- a/test/tasks/user_test.exs +++ b/test/tasks/user_test.exs @@ -91,6 +91,7 @@ test "user is not created" 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 +109,10 @@ test "user is deleted" 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) diff --git a/test/user_test.exs b/test/user_test.exs index 863e0106c..be58c70e1 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -992,7 +992,7 @@ test "works for announces" 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) @@ -1147,7 +1147,7 @@ test "it deactivates a user, all follow relationships and all activities", %{use {: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) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 77bd07edf..3dcb62873 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -537,7 +537,7 @@ test "doesn't return blocked activities" do 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) @@ -592,7 +592,7 @@ test "doesn't return announce activities concerning blocked users" 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}) @@ -618,7 +618,7 @@ test "doesn't return activities from blocked domains" do 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}) @@ -651,7 +651,7 @@ test "does return activities from followed users on blocked domains" 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}) @@ -699,7 +699,7 @@ test "doesn't return muted activities" 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) @@ -749,7 +749,7 @@ test "does include announces on request" 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)]) @@ -846,7 +846,7 @@ test "doesn't return reblogs for users for whom reblogs have been muted" 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}) @@ -860,7 +860,7 @@ test "returns reblogs for users for whom reblogs have not been muted" 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}) @@ -868,75 +868,6 @@ test "returns reblogs for users for whom reblogs have not been muted" do 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{ diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index 9e16e39c4..dbee8a0f4 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,20 @@ test "returns error when object is unknown" 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 called(Pleroma.Web.Federator.publish(activity)) end @@ -117,13 +115,12 @@ test "returns error when object is unknown" 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 db8bf2b05..a80104ea7 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -325,14 +325,6 @@ test "adds the announce to the original object", %{announce: announce, user: use assert user.ap_id in object.data["announcements"] end - test "does not add the announce to the original object if the announce is private", %{ - private_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 "does not add the announce to the original object if the actor is a service actor", %{ relay_announce: announce } do diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 81f966ad9..356004d48 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -1079,7 +1079,7 @@ test "it inlines private announced objects" 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) diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index 9e0a0f1c4..15f03f193 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -334,7 +334,7 @@ test "fetches existing announce" 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 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 @@ test "renders an announce activity" 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/admin_api/admin_api_controller_test.exs b/test/web/admin_api/admin_api_controller_test.exs index 370d876d0..12cb1afd9 100644 --- a/test/web/admin_api/admin_api_controller_test.exs +++ b/test/web/admin_api/admin_api_controller_test.exs @@ -148,6 +148,7 @@ test "GET /api/pleroma/admin/users/:nickname requires " <> 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 @@ -2944,6 +2945,7 @@ test "proxy tuple ip", %{conn: conn} do 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}, @@ -3096,7 +3098,7 @@ test "returns private statuses with godmode on", %{conn: conn, user: user} do 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) + {: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 diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index e68a6a7d2..d849fd8f0 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -41,6 +41,8 @@ test "it works with pruned objects" do {:ok, post} = CommonAPI.post(user, %{status: "namu amida butsu"}) + clear_config([:instance, :federating], true) + Object.normalize(post, false) |> Object.prune() @@ -59,6 +61,8 @@ test "it allows users to delete their posts" 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) @@ -440,6 +444,7 @@ test "repeating a status privately" do 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 diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 280bd6aca..1ce97378d 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -256,7 +256,7 @@ test "respects blocks", %{user: user_one, conn: conn} 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 @@ -375,7 +375,7 @@ test "gets an users media", %{conn: conn} 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) @@ -678,7 +678,7 @@ test "following without reblogs" 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 diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index 562fc4d8e..e278d61f5 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -280,8 +280,8 @@ test "filters notifications for Announce activities" 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 @@ -301,7 +301,7 @@ test "filters notifications using exclude_types" 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 +339,7 @@ test "filters notifications using include_types" 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/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index 962e64b03..700c82e4f 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 @@ test "reblogged status for another user" 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 @@ test "reblogged status for another user" 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 @@ test "requires authentication for private posts", %{user: user} 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 @@ test "does not return users who have reblogged the status but are blocked", %{ 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 @@ test "does not return users who have reblogged the status but are blocked", %{ 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 @@ test "does not return users who have reblogged the status privately", %{ 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() diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 9839e48fc..f15be1df1 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -78,7 +78,7 @@ test "Reblog notification" 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) diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 43e3bdca1..5cbadf0fc 100644 --- a/test/web/mastodon_api/views/status_view_test.exs +++ b/test/web/mastodon_api/views/status_view_test.exs @@ -442,7 +442,7 @@ test "a reblog" 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 +600,7 @@ test "does not embed a relationship in the account in reposts" 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}) diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 2acd0939f..a826b24c9 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -151,7 +151,7 @@ test "renders title and body for announce activity" 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) == diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 95b7d1420..cb4595bb6 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -106,7 +106,7 @@ test "it streams boosts of the user in the 'user' stream", %{user: user} 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) @@ -427,7 +427,7 @@ test "it filters muted reblogs" 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 +440,7 @@ test "it filters reblog notification for reblog-muted actors" 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) From c76267afb9ba6fa79d949c51d8ff72c75989a4f5 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 13:31:52 +0200 Subject: [PATCH 139/492] Credo fixes. --- lib/pleroma/web/activity_pub/pipeline.ex | 2 +- test/web/activity_pub/transmogrifier/announce_handling_test.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 1d6bc2000..0c54c4b23 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 @@ -11,7 +12,6 @@ defmodule Pleroma.Web.ActivityPub.Pipeline do alias Pleroma.Web.ActivityPub.ObjectValidator alias Pleroma.Web.ActivityPub.SideEffects alias Pleroma.Web.Federator - alias Pleroma.Config @spec common_pipeline(map(), keyword()) :: {:ok, Activity.t() | Object.t(), keyword()} | {:error, any()} diff --git a/test/web/activity_pub/transmogrifier/announce_handling_test.exs b/test/web/activity_pub/transmogrifier/announce_handling_test.exs index 50bcb307f..e895636b5 100644 --- a/test/web/activity_pub/transmogrifier/announce_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/announce_handling_test.exs @@ -7,8 +7,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.AnnounceHandlingTest do alias Pleroma.Activity alias Pleroma.Object - alias Pleroma.Web.CommonAPI alias Pleroma.Web.ActivityPub.Transmogrifier + alias Pleroma.Web.CommonAPI import Pleroma.Factory From cdc6ba8d7bca3660c5c431979eae43231f339d6a Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 13:58:18 +0200 Subject: [PATCH 140/492] AnnounceValidator: Check for announcability --- .../object_validators/announce_validator.ex | 32 +++++++++++++++++++ .../activity_pub/object_validator_test.exs | 29 +++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex index 082fdea4d..40f861f47 100644 --- a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex @@ -5,12 +5,17 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator do use Ecto.Schema + alias Pleroma.Object + alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.Types 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 @@ -52,6 +57,33 @@ def validate_data(data_cng) do |> 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 diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index e24e0f913..84e5edd05 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -342,5 +342,34 @@ test "returns an error if the actor already announced the object", %{ 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 end From bf1b221f94a53c90cda832e9bfb6c5fa0e6524f2 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 14:12:32 +0200 Subject: [PATCH 141/492] Credo fixes for the credo god. --- test/web/activity_pub/object_validator_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 84e5edd05..7953eecf2 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -364,7 +364,7 @@ test "returns an error if the actor can't announce the object", %{ assert {:ok, _, _} = ObjectValidator.validate(announce, []) - # The actor of the object can not announce it publicly + # The actor of the object can not announce it publicly {:ok, announce, []} = Builder.announce(user, object, public: true) {:error, cng} = ObjectValidator.validate(announce, []) From cc0d462e91dd29c834c56b82e02022e1babda369 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 15:08:56 +0200 Subject: [PATCH 142/492] Attachments: Have the mediaType on the root, too. --- lib/pleroma/upload.ex | 1 + .../activity_pub/object_validator_test.exs | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) 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 @@ def store(upload, opts \\ []) do {:ok, %{ "type" => opts.activity_type, + "mediaType" => upload.content_type, "url" => [ %{ "type" => "Link", diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index ed6b84e8e..f9990bd2c 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -25,6 +25,8 @@ test "works with honkerific attachments" do 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 @@ -48,6 +50,27 @@ test "it turns mastodon attachments into our attachments" do 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 From c4a5cead51770f0d54cb77805b7e2bd705f251d9 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 21 May 2020 15:17:39 +0200 Subject: [PATCH 143/492] UploadTest: Fix test. --- test/upload_test.exs | 1 + 1 file changed, 1 insertion(+) 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 @@ test "it returns file" do %{ "name" => "image.jpg", "type" => "Document", + "mediaType" => "image/jpeg", "url" => [ %{ "href" => "http://localhost:4001/media/post-process-file.jpg", From 45d2c4157fc264dacdca0f17268d3a33f364801f Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 21 May 2020 14:03:38 +0400 Subject: [PATCH 144/492] Add OpenAPI spec for AdminAPI.StatusController --- .../controllers/fallback_controller.ex | 6 +- .../controllers/status_controller.ex | 59 ++----- .../operations/admin/status_operation.ex | 165 ++++++++++++++++++ .../api_spec/operations/status_operation.ex | 2 +- .../controllers/admin_api_controller_test.exs | 24 ++- .../controllers/status_controller_test.exs | 37 ++-- 6 files changed, 221 insertions(+), 72 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/admin/status_operation.ex diff --git a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex index 9f7bb92ce..82965936d 100644 --- a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex @@ -8,13 +8,13 @@ defmodule Pleroma.Web.AdminAPI.FallbackController do def call(conn, {:error, :not_found}) do conn |> put_status(:not_found) - |> json(dgettext("errors", "Not found")) + |> json(%{error: dgettext("errors", "Not found")}) end def call(conn, {:error, reason}) do conn |> put_status(:bad_request) - |> json(reason) + |> json(%{error: reason}) end def call(conn, {:param_cast, _}) do @@ -26,6 +26,6 @@ def call(conn, {:param_cast, _}) do def call(conn, _) do conn |> put_status(:internal_server_error) - |> json(dgettext("errors", "Something went wrong")) + |> json(%{error: dgettext("errors", "Something went wrong")}) end end diff --git a/lib/pleroma/web/admin_api/controllers/status_controller.ex b/lib/pleroma/web/admin_api/controllers/status_controller.ex index 1e9763979..08cb9c10b 100644 --- a/lib/pleroma/web/admin_api/controllers/status_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/status_controller.ex @@ -14,8 +14,7 @@ defmodule Pleroma.Web.AdminAPI.StatusController do require Logger - @users_page_size 50 - + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} when action in [:index, :show]) plug( @@ -25,25 +24,22 @@ defmodule Pleroma.Web.AdminAPI.StatusController do action_fallback(Pleroma.Web.AdminAPI.FallbackController) - def index(%{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) + 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" => godmode, - "local_only" => local_only, - "limit" => page_size, - "offset" => (page - 1) * page_size, - "exclude_reblogs" => !with_reblogs && "true" + "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}) + render(conn, "index.json", activities: activities, as: :activity) end - def show(conn, %{"id" => id}) do + def show(conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id(id) do conn |> put_view(MastodonAPI.StatusView) @@ -53,20 +49,13 @@ def show(conn, %{"id" => id}) do end end - def 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) - + def update(%{assigns: %{user: admin}, body_params: params} = conn, %{id: id}) do 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, + sensitive: params[:sensitive], visibility: params[:visibility] }) @@ -76,7 +65,7 @@ def update(%{assigns: %{user: admin}} = conn, %{"id" => id} = params) do end end - def delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do + def delete(%{assigns: %{user: user}} = conn, %{id: id}) do with {:ok, %Activity{}} <- CommonAPI.delete(id, user) do ModerationLog.insert_log(%{ action: "status_delete", @@ -87,26 +76,4 @@ def delete(%{assigns: %{user: user}} = conn, %{"id" => id}) do json(conn, %{}) end end - - defp page_params(params) do - {get_page(params["page"]), get_page_size(params["page_size"])} - end - - defp get_page(page_string) when is_nil(page_string), do: 1 - - defp get_page(page_string) do - case Integer.parse(page_string) do - {page, _} -> page - :error -> 1 - end - end - - defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size - - defp get_page_size(page_size_string) do - case Integer.parse(page_size_string) do - {page_size, _} -> page_size - :error -> @users_page_size - end - 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..0b138dc79 --- /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 + + defp 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/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex index 0682ca6e5..ca9db01e5 100644 --- a/lib/pleroma/web/api_spec/operations/status_operation.ex +++ b/lib/pleroma/web/api_spec/operations/status_operation.ex @@ -487,7 +487,7 @@ defp create_request do } end - defp id_param do + def id_param do Operation.parameter(:id, :path, FlakeID, "Status ID", example: "9umDrYheeY451cQnEe", required: true diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index 2c317e0fe..a0c11a354 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -350,7 +350,7 @@ test "when the user doesn't exist", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}") - assert "Not found" == json_response(conn, 404) + assert %{"error" => "Not found"} == json_response(conn, 404) end end @@ -683,7 +683,10 @@ test "it returns 500 if `invites_enabled` is not enabled", %{conn: conn} do 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." + %{ + "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 @@ -693,7 +696,10 @@ test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do 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." + %{ + "error" => + "To send invites you need to set the `registrations_open` option to false." + } end end @@ -1307,7 +1313,7 @@ test "returns 404 if user not found", %{conn: conn} do |> put("/api/pleroma/admin/users/disable_mfa", %{nickname: "nickname"}) |> json_response(404) - assert response == "Not found" + assert response == %{"error" => "Not found"} end end @@ -1413,7 +1419,7 @@ test "with token", %{conn: conn} do 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" + assert json_response(conn, :not_found) == %{"error" => "Not found"} end end @@ -1440,7 +1446,7 @@ test "returns report by its id", %{conn: conn} do 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" + assert json_response(conn, :not_found) == %{"error" => "Not found"} end end @@ -1705,7 +1711,9 @@ test "when configuration from database is off", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/config") assert json_response(conn, 400) == - "To use this endpoint you need to enable configuration from database." + %{ + "error" => "To use this endpoint you need to enable configuration from database." + } end test "with settings only in db", %{conn: conn} do @@ -1827,7 +1835,7 @@ 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." + %{"error" => "To use this endpoint you need to enable configuration from database."} end describe "POST /api/pleroma/admin/config" do diff --git a/test/web/admin_api/controllers/status_controller_test.exs b/test/web/admin_api/controllers/status_controller_test.exs index 8ecc78491..124d8dc2e 100644 --- a/test/web/admin_api/controllers/status_controller_test.exs +++ b/test/web/admin_api/controllers/status_controller_test.exs @@ -30,7 +30,7 @@ defmodule Pleroma.Web.AdminAPI.StatusControllerTest do test "not found", %{conn: conn} do assert conn |> get("/api/pleroma/admin/statuses/not_found") - |> json_response(:not_found) + |> json_response_and_validate_schema(:not_found) end test "shows activity", %{conn: conn} do @@ -39,7 +39,7 @@ test "shows activity", %{conn: conn} do response = conn |> get("/api/pleroma/admin/statuses/#{activity.id}") - |> json_response(200) + |> json_response_and_validate_schema(200) assert response["id"] == activity.id end @@ -55,8 +55,9 @@ test "shows activity", %{conn: conn} do 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(:ok) + |> json_response_and_validate_schema(:ok) assert response["sensitive"] @@ -67,8 +68,9 @@ 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" => "false"}) - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) refute response["sensitive"] end @@ -76,8 +78,9 @@ test "toggle sensitive flag", %{conn: conn, id: id, admin: admin} do 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(:ok) + |> json_response_and_validate_schema(:ok) assert response["visibility"] == "public" @@ -88,23 +91,29 @@ 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: "private"}) - |> json_response(:ok) + |> 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(:ok) + |> json_response_and_validate_schema(: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"}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> put("/api/pleroma/admin/statuses/#{id}", %{visibility: "test"}) - assert json_response(conn, :bad_request) == "Unsupported visibility" + assert %{"error" => "test - Invalid value for enum."} = + json_response_and_validate_schema(conn, :bad_request) end end @@ -118,7 +127,7 @@ test "returns 400 when visibility is unknown", %{conn: conn, id: id} do test "deletes status", %{conn: conn, id: id, admin: admin} do conn |> delete("/api/pleroma/admin/statuses/#{id}") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) refute Activity.get_by_id(id) @@ -131,7 +140,7 @@ test "deletes status", %{conn: conn, id: id, admin: admin} do 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" + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} end end @@ -151,7 +160,7 @@ test "returns all public and unlisted statuses", %{conn: conn, admin: admin} do response = conn |> get("/api/pleroma/admin/statuses") - |> json_response(200) + |> json_response_and_validate_schema(200) refute "private" in Enum.map(response, & &1["visibility"]) assert length(response) == 3 @@ -166,7 +175,7 @@ test "returns only local statuses with local_only on", %{conn: conn} do response = conn |> get("/api/pleroma/admin/statuses?local_only=true") - |> json_response(200) + |> json_response_and_validate_schema(200) assert length(response) == 1 end @@ -179,7 +188,7 @@ test "returns private and direct statuses with godmode on", %{conn: conn, admin: {: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 + assert json_response_and_validate_schema(conn, 200) |> length() == 3 end end end From bcb549531ff5f90253adc1b8cc2900c348f20175 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 22 May 2020 14:38:28 +0200 Subject: [PATCH 145/492] EmojiReactionController: Return more appropriate error. --- .../web/api_spec/operations/emoji_reaction_operation.ex | 4 +++- .../pleroma_api/controllers/emoji_reaction_controller.ex | 2 ++ .../controllers/emoji_reaction_controller_test.exs | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex index 7c08fbaa7..1a49fece0 100644 --- a/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex +++ b/lib/pleroma/web/api_spec/operations/emoji_reaction_operation.ex @@ -6,6 +6,7 @@ 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 @@ -46,7 +47,8 @@ def create_operation do security: [%{"oAuth" => ["write:statuses"]}], operationId: "EmojiReactionController.create", responses: %{ - 200 => Operation.response("Status", "application/json", Status) + 200 => Operation.response("Status", "application/json", Status), + 400 => Operation.response("Bad Request", "application/json", ApiError) } } end diff --git a/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex index a002912f3..19dcffdf3 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_reaction_controller.ex @@ -22,6 +22,8 @@ defmodule Pleroma.Web.PleromaAPI.EmojiReactionController do 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) <- diff --git a/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs index ee66ebf87..e1bb5ebfe 100644 --- a/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_reaction_controller_test.exs @@ -33,6 +33,13 @@ test "PUT /api/v1/pleroma/statuses/:id/reactions/:emoji", %{conn: conn} do 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 From ca755f9a73649375096850ce7849688f45162de8 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 22 May 2020 16:15:29 +0200 Subject: [PATCH 146/492] ActivityPubController: Add Mastodon compatibility route. --- .../activity_pub/activity_pub_controller.ex | 5 ++-- lib/pleroma/web/ostatus/ostatus_controller.ex | 2 +- lib/pleroma/web/router.ex | 3 ++ .../activity_pub_controller_test.exs | 29 ++++++++++++++++++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 62ad15d85..5a41dac5c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -21,6 +21,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do alias Pleroma.Web.ActivityPub.UserView alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility + alias Pleroma.Web.Endpoint alias Pleroma.Web.FederatingPlug alias Pleroma.Web.Federator @@ -75,8 +76,8 @@ def user(conn, %{"nickname" => nickname}) 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 diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index 6971cd9f8..513e69c6e 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -32,7 +32,7 @@ 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 diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index cbe320746..b437e56fb 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -556,6 +556,9 @@ defmodule Pleroma.Web.Router do get("/notice/:id", OStatus.OStatusController, :notice) get("/notice/:id/embed_player", OStatus.OStatusController, :notice_player) + # Mastodon compat routes + get("/users/:nickname/statuses/:id", OStatus.OStatusController, :object) + get("/users/:nickname/feed", Feed.UserController, :feed, as: :user_feed) get("/users/:nickname", Feed.UserController, :feed_redirect, as: :user_feed) diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index c432c90e3..b247163ec 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 @@ -19,8 +18,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do 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 +172,29 @@ test "it requires authentication if instance is NOT federating", %{ 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 + end + describe "/objects/:uuid" do test "it returns a json representation of the object with accept application/json", %{ conn: conn From ba106aa9c8d4854c2fe0f6bb02091bb3bd6719d7 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 22 May 2020 18:15:36 +0400 Subject: [PATCH 147/492] Fix notifications mark as read API --- .../operations/pleroma_notification_operation.ex | 14 ++++++++++---- .../controllers/notification_controller.ex | 4 ++-- .../controllers/notification_controller_test.exs | 11 ++++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex index 636c39a15..b0c8db863 100644 --- a/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex +++ b/lib/pleroma/web/api_spec/operations/pleroma_notification_operation.ex @@ -8,6 +8,8 @@ defmodule Pleroma.Web.ApiSpec.PleromaNotificationOperation do 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, []) @@ -17,10 +19,14 @@ def mark_as_read_operation do %Operation{ tags: ["Notifications"], summary: "Mark notifications as read. Query parameters are mutually exclusive.", - parameters: [ - Operation.parameter(:id, :query, :string, "A single notification ID to read"), - Operation.parameter(:max_id, :query, :string, "Read all notifications up to this id") - ], + 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: %{ diff --git a/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex b/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex index 0b2f678c5..3ed8bd294 100644 --- a/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/notification_controller.ex @@ -14,7 +14,7 @@ defmodule Pleroma.Web.PleromaAPI.NotificationController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaNotificationOperation - def mark_as_read(%{assigns: %{user: user}} = conn, %{id: notification_id}) do + 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 @@ -25,7 +25,7 @@ def mark_as_read(%{assigns: %{user: user}} = conn, %{id: notification_id}) do end end - def mark_as_read(%{assigns: %{user: user}} = conn, %{max_id: max_id}) do + def mark_as_read(%{assigns: %{user: user}, body_params: %{max_id: max_id}} = conn, _) do notifications = user |> Notification.set_read_up_to(max_id) diff --git a/test/web/pleroma_api/controllers/notification_controller_test.exs b/test/web/pleroma_api/controllers/notification_controller_test.exs index 7c5ace804..bb4fe6c49 100644 --- a/test/web/pleroma_api/controllers/notification_controller_test.exs +++ b/test/web/pleroma_api/controllers/notification_controller_test.exs @@ -23,7 +23,8 @@ test "it marks a single notification as read", %{user: user1, conn: conn} do response = conn - |> post("/api/v1/pleroma/notifications/read?id=#{notification1.id}") + |> 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 @@ -41,7 +42,8 @@ test "it marks multiple notifications as read", %{user: user1, conn: conn} do [response1, response2] = conn - |> post("/api/v1/pleroma/notifications/read?max_id=#{notification2.id}") + |> 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 @@ -54,7 +56,10 @@ test "it marks multiple notifications as read", %{user: user1, conn: conn} do test "it returns error when notification not found", %{conn: conn} do response = conn - |> post("/api/v1/pleroma/notifications/read?id=22222222222222") + |> 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"} From fabc11bf9ace488582c9621117269b9f56c47277 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 22 May 2020 17:33:19 +0300 Subject: [PATCH 148/492] priv/static: Add a warning discouraging admins from modifying the static files directly --- priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE | 1 + 1 file changed, 1 insertion(+) create mode 100644 priv/static/READ_THIS_BEFORE_TOUCHING_FILES_HERE 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 From 8a4bd9e5d17bd1acb5c5a61b85ac125202a4aaa4 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 22 May 2020 16:47:22 +0200 Subject: [PATCH 149/492] OStatusController: Add Mastodon compatibility route for objects. --- lib/pleroma/web/ostatus/ostatus_controller.ex | 4 +-- test/web/ostatus/ostatus_controller_test.exs | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index 513e69c6e..b163bfb14 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -37,8 +37,8 @@ def object(%{assigns: %{format: format}} = conn, _params) 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 diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index bb349cb19..266fe2f45 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,37 @@ 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") + %{conn: conn} + end + + test "redirects to /notice/:id for html format", %{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, _} = + %{ + "type" => "Create", + "object" => object.data["id"], + "actor" => object.data["actor"], + "to" => object.data["to"] + } + |> ActivityPub.persist(local: true) + + conn = get(conn, "/users/raymoo/statuses/999999999") + 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 From 355aa3bdc78465a42a9e0b20baaefd4fba04f596 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 22 May 2020 17:06:12 +0200 Subject: [PATCH 150/492] ActivityPubController: Add Mastodon activity compat route. --- .../activity_pub/activity_pub_controller.ex | 4 +-- lib/pleroma/web/common_api/utils.ex | 4 +++ lib/pleroma/web/ostatus/ostatus_controller.ex | 2 +- lib/pleroma/web/router.ex | 3 +- .../activity_pub_controller_test.exs | 32 +++++++++++++++++++ test/web/ostatus/ostatus_controller_test.exs | 1 + 6 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 5a41dac5c..28727d619 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -102,8 +102,8 @@ def track_object_fetch(conn, object_id) 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 diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index b9fa21648..bf9ca7740 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -468,6 +468,8 @@ def maybe_notify_subscribers( |> Enum.map(& &1.ap_id) recipients ++ subscriber_ids + else + _e -> recipients end end @@ -479,6 +481,8 @@ def maybe_notify_followers(recipients, %Activity{data: %{"type" => "Move"}} = ac |> User.get_followers() |> Enum.map(& &1.ap_id) |> Enum.concat(recipients) + else + _e -> recipients end end diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index b163bfb14..04a4bdeb4 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -54,7 +54,7 @@ def object(%{assigns: %{format: format}} = conn, _params) 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 diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index b437e56fb..08ab3c8bb 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -556,8 +556,9 @@ defmodule Pleroma.Web.Router do get("/notice/:id", OStatus.OStatusController, :notice) get("/notice/:id/embed_player", OStatus.OStatusController, :notice_player) - # Mastodon compat routes + # 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) diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index b247163ec..dd2a48a61 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -13,6 +13,7 @@ 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 @@ -193,6 +194,37 @@ test "it returns a json representation of the object with accept application/jso 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 diff --git a/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index 266fe2f45..0f973d5b6 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -42,6 +42,7 @@ test "redirects to /notice/:id for html format", %{conn: conn} do {:ok, activity, _} = %{ + "id" => object.data["id"] <> "/activity", "type" => "Create", "object" => object.data["id"], "actor" => object.data["actor"], From 91c8467582d1b4b5ad12256292e86dc1c54f0234 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 22 May 2020 17:11:59 +0200 Subject: [PATCH 151/492] OStatusController: Add Mastodon activity compat route. --- lib/pleroma/web/ostatus/ostatus_controller.ex | 4 ++-- test/web/ostatus/ostatus_controller_test.exs | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/ostatus/ostatus_controller.ex b/lib/pleroma/web/ostatus/ostatus_controller.ex index 04a4bdeb4..de1b0b3f0 100644 --- a/lib/pleroma/web/ostatus/ostatus_controller.ex +++ b/lib/pleroma/web/ostatus/ostatus_controller.ex @@ -59,8 +59,8 @@ def activity(%{assigns: %{format: format}} = conn, _params) 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/test/web/ostatus/ostatus_controller_test.exs b/test/web/ostatus/ostatus_controller_test.exs index 0f973d5b6..ee498f4b5 100644 --- a/test/web/ostatus/ostatus_controller_test.exs +++ b/test/web/ostatus/ostatus_controller_test.exs @@ -26,10 +26,7 @@ defmodule Pleroma.Web.OStatus.OStatusControllerTest do describe "Mastodon compatibility routes" do setup %{conn: conn} do conn = put_req_header(conn, "accept", "text/html") - %{conn: conn} - end - test "redirects to /notice/:id for html format", %{conn: conn} do {:ok, object} = %{ "type" => "Note", @@ -50,9 +47,21 @@ test "redirects to /notice/:id for html format", %{conn: conn} do } |> 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 From 3506e95499133654658c2d653bf636803b61f45f Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 22 May 2020 17:13:09 +0200 Subject: [PATCH 152/492] Add Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c672275e..76277a90e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **Breaking:** removed `with_move` parameter from notifications timeline. ### Added +- 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. From cc82229ba70e054acfdea07a195c1b11961ea1bc Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Fri, 22 May 2020 18:19:25 +0300 Subject: [PATCH 153/492] Add filename_display_max_length config --- config/config.exs | 3 +- lib/pleroma/web/common_api/utils.ex | 8 ++-- test/web/common_api/common_api_utils_test.exs | 41 +++++++++++++++---- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/config/config.exs b/config/config.exs index 1b11b4fa9..7385fb6c3 100644 --- a/config/config.exs +++ b/config/config.exs @@ -71,7 +71,8 @@ follow_redirect: true, pool: :upload ] - ] + ], + filename_display_max_length: 30 config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads" diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index b9fa21648..7be9d8caa 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -396,10 +396,12 @@ def to_masto_date(date) when is_binary(date) do def to_masto_date(_), do: "" defp shortname(name) do - if String.length(name) < 30 do - name + with max_length when max_length > 0 <- + Pleroma.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 diff --git a/test/web/common_api/common_api_utils_test.exs b/test/web/common_api/common_api_utils_test.exs index d7d2d10d5..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 - assert res == - "
Sakura Mana – Turned on by a Se…" + 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 Utils.add_attachments("", [attachment]) == expected + end end describe "it confirms the password given is the current users password" do From 8eb1dfadca61c68e3470060481b139969708f0ef Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Fri, 22 May 2020 18:30:13 +0300 Subject: [PATCH 154/492] Update CHANGELOG and docs --- CHANGELOG.md | 3 ++- config/description.exs | 5 +++++ docs/configuration/cheatsheet.md | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c672275e..8692dfef2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - 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. - Notifications: Added `follow_request` notification type. @@ -47,7 +48,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### 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 diff --git a/config/description.exs b/config/description.exs index cf7cc297a..807c945e0 100644 --- a/config/description.exs +++ b/config/description.exs @@ -119,6 +119,11 @@ ] } ] + }, + %{ + key: :filename_display_max_length, + type: :integer, + description: "Set max length of a filename to display. 0 = no limit. Default: 30" } ] }, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index e8def466e..505acb293 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -498,6 +498,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`. From 5d60b25e690eb21ad2539a10036ba39489f62f97 Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Fri, 22 May 2020 15:44:10 +0000 Subject: [PATCH 155/492] Apply suggestion to lib/pleroma/web/common_api/utils.ex --- lib/pleroma/web/common_api/utils.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/common_api/utils.ex b/lib/pleroma/web/common_api/utils.ex index 7be9d8caa..1c0d90a2b 100644 --- a/lib/pleroma/web/common_api/utils.ex +++ b/lib/pleroma/web/common_api/utils.ex @@ -397,7 +397,7 @@ def to_masto_date(_), do: "" defp shortname(name) do with max_length when max_length > 0 <- - Pleroma.Config.get([Pleroma.Upload, :filename_display_max_length], 30), + Config.get([Pleroma.Upload, :filename_display_max_length], 30), true <- String.length(name) > max_length do String.slice(name, 0..max_length) <> "…" else From d0c26956da160b2fbfd4855ca7fe31eeebe6528d Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 12:46:14 +0200 Subject: [PATCH 156/492] User: Don't error out if we want to refresh a user but can't --- lib/pleroma/user.ex | 17 +++++++---- .../activity_pub_controller_test.exs | 30 +++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index d2eeeb479..842b28c06 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1618,12 +1618,19 @@ def html_filter_policy(_), do: Pleroma.Config.get([:markup, :scrub_policy]) 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 diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index dd2a48a61..24edab41a 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -451,6 +451,36 @@ test "it inserts an incoming activity into the database", %{conn: conn} 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!() From 0c970a9d44fc0ceddbb52483f6f2fab11243e0ca Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 12:49:38 +0200 Subject: [PATCH 157/492] UserTest: Add test for user refreshing. --- test/user_test.exs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/user_test.exs b/test/user_test.exs index 45125f704..3556ef1b4 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -586,6 +586,26 @@ test "updates an existing user, if stale" do refute user.last_refreshed_at == orig_user.last_refreshed_at 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 From 3bec0d2e50a0c468508ae884a3e5dc371106501e Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 12:59:42 +0200 Subject: [PATCH 158/492] Factory: Set users to be ap_enabled by default. --- test/support/factory.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/support/factory.ex b/test/support/factory.ex index d4284831c..6e3676aca 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -34,7 +34,8 @@ def user_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 } %{ From aeb0875025cf37ad8cefe43c637f56a5a16f8628 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 13:48:47 +0200 Subject: [PATCH 159/492] StealEmojiPolicyTest: Fix flaky test. --- test/web/activity_pub/mrf/steal_emoji_policy_test.exs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs index 8882c8c13..0e7e57c77 100644 --- a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs +++ b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs @@ -14,8 +14,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do end setup do - clear_config(:mrf_steal_emoji) - emoji_path = Path.join(Config.get([:instance, :static_dir]), "emoji/stolen") File.rm_rf!(emoji_path) File.mkdir!(emoji_path) @@ -53,8 +51,8 @@ test "Steals emoji on unknown shortcode from allowed remote host" do } } - Config.put([:mrf_steal_emoji, :hosts], ["example.org"]) - Config.put([:mrf_steal_emoji, :size_limit], 284_468) + clear_config([:mrf_steal_emoji, :hosts], ["example.org"]) + clear_config([:mrf_steal_emoji, :size_limit], 284_468) assert {:ok, message} == StealEmojiPolicy.filter(message) From 2dff37604192b086ede4a00d68b886dbec93f3c9 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 13:48:47 +0200 Subject: [PATCH 160/492] StealEmojiPolicyTest: Fix flaky test. --- test/web/activity_pub/mrf/steal_emoji_policy_test.exs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs index 8882c8c13..0e7e57c77 100644 --- a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs +++ b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs @@ -14,8 +14,6 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do end setup do - clear_config(:mrf_steal_emoji) - emoji_path = Path.join(Config.get([:instance, :static_dir]), "emoji/stolen") File.rm_rf!(emoji_path) File.mkdir!(emoji_path) @@ -53,8 +51,8 @@ test "Steals emoji on unknown shortcode from allowed remote host" do } } - Config.put([:mrf_steal_emoji, :hosts], ["example.org"]) - Config.put([:mrf_steal_emoji, :size_limit], 284_468) + clear_config([:mrf_steal_emoji, :hosts], ["example.org"]) + clear_config([:mrf_steal_emoji, :size_limit], 284_468) assert {:ok, message} == StealEmojiPolicy.filter(message) From 5d5db7e5b7f722f7735798f9b9ed8069091726de Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 14:00:18 +0200 Subject: [PATCH 161/492] StealEmojiPolicyTest: Clean up. --- test/web/activity_pub/mrf/steal_emoji_policy_test.exs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs index 0e7e57c77..3f8222736 100644 --- a/test/web/activity_pub/mrf/steal_emoji_policy_test.exs +++ b/test/web/activity_pub/mrf/steal_emoji_policy_test.exs @@ -19,6 +19,12 @@ defmodule Pleroma.Web.ActivityPub.MRF.StealEmojiPolicyTest do File.mkdir!(emoji_path) Pleroma.Emoji.reload() + + on_exit(fn -> + File.rm_rf!(emoji_path) + end) + + :ok end test "does nothing by default" do From cbcd592300673582e38d0bf539dcdb9a2c1985a1 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 22 May 2020 17:52:26 +0400 Subject: [PATCH 162/492] Add OpenAPI spec for AdminAPI.RelayController --- .../controllers/admin_api_controller.ex | 48 +--------- .../admin_api/controllers/relay_controller.ex | 67 ++++++++++++++ .../operations/admin/relay_operation.ex | 83 +++++++++++++++++ lib/pleroma/web/router.ex | 6 +- .../controllers/admin_api_controller_test.exs | 51 ---------- .../controllers/relay_controller_test.exs | 92 +++++++++++++++++++ 6 files changed, 246 insertions(+), 101 deletions(-) create mode 100644 lib/pleroma/web/admin_api/controllers/relay_controller.ex create mode 100644 lib/pleroma/web/api_spec/operations/admin/relay_operation.ex create mode 100644 test/web/admin_api/controllers/relay_controller_test.exs diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 6b1d64a2e..b73701f5e 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -20,7 +20,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do 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 @@ -80,7 +79,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do plug( OAuthScopesPlug, %{scopes: ["write:follows"], admin: true} - when action in [:user_follow, :user_unfollow, :relay_follow, :relay_unfollow] + when action in [:user_follow, :user_unfollow] ) plug( @@ -108,7 +107,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do :config_show, :list_log, :stats, - :relay_list, :config_descriptions, :need_reboot ] @@ -531,50 +529,6 @@ def right_delete(%{assigns: %{user: %{nickname: nickname}}} = conn, %{"nickname" 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])}, 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/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/router.ex b/lib/pleroma/web/router.ex index e493a4153..269bbabde 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -160,9 +160,9 @@ 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) diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index 321840a8c..82825473c 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -3254,57 +3254,6 @@ test "sets password_reset_pending to true", %{conn: conn} do 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") 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 From 5fef40520819bea1effab5ed4937613d8896a453 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 15:06:35 +0200 Subject: [PATCH 163/492] User: Change signature of get_users_from_set --- lib/pleroma/conversation.ex | 2 +- lib/pleroma/notification.ex | 3 ++- lib/pleroma/user.ex | 5 +++-- 3 files changed, 6 insertions(+), 4 deletions(-) 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 @@ def create_or_bump_for(activity, opts \\ []) 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/notification.ex b/lib/pleroma/notification.ex index 8aa9ed2d4..557961e94 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -370,7 +370,8 @@ def get_notified_from_activity(%Activity{data: %{"type" => type}} = activity, lo 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 diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index d2eeeb479..f57cd3e74 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1208,8 +1208,9 @@ def increment_unread_conversation_count(conversation, %User{local: true} = user) 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 From 6bd7070b00a8d0ac64292f4c7152b71bee5f6b69 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 15:08:43 +0200 Subject: [PATCH 164/492] Transmogrifier: Use a simpler way to get mentions. --- .../web/activity_pub/transmogrifier.ex | 10 ++++-- test/web/activity_pub/transmogrifier_test.exs | 33 +++++++++++-------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index d594c64f4..8443c284c 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -1045,10 +1045,14 @@ def add_hashtags(object) 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) diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 356004d48..94d8552e8 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -1094,23 +1094,28 @@ test "it turns mentions into tags" 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 From 6a85fe1f9d0bfe7aee042671a86c9e58ae2d102b Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 15:53:14 +0200 Subject: [PATCH 165/492] Docs: Document reasonable Postgres settings. --- docs/configuration/postgresql.md | 31 +++++++++++++++++++++++++++++++ docs/installation/otp_en.md | 2 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 docs/configuration/postgresql.md diff --git a/docs/configuration/postgresql.md b/docs/configuration/postgresql.md new file mode 100644 index 000000000..068f133a9 --- /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/installation/otp_en.md b/docs/installation/otp_en.md index fb99af699..b627bbb7a 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 +Check out our Postgresql document for a guide on optimizing Postgresql performance settings. ```sh tab="Alpine" rc-service postgresql restart From dbd07d29a358a446d87078d60b993a59b757ad1d Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 17:27:45 +0200 Subject: [PATCH 166/492] Streamer: Don't crash on streaming chat notifications --- lib/pleroma/web/common_api/common_api.ex | 9 +++++---- test/web/streamer/streamer_test.exs | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index c08edbc5f..764fa4f4f 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -467,12 +467,13 @@ def remove_mute(user, activity) 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/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index cb4595bb6..115ba4703 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -126,6 +126,21 @@ test "it sends notify to in the 'user:notification' stream", %{user: user, notif refute Streamer.filtered_by_user?(user, notify) 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 From f7cb3f4cfc7eaf6ff67e27a7d6449e23e09a501e Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 17:11:35 +0000 Subject: [PATCH 167/492] Apply suggestion to docs/installation/otp_en.md --- docs/installation/otp_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index b627bbb7a..6f9749ef1 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 -Check out our Postgresql document for a guide on optimizing Postgresql performance settings. +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 From af3568a6d99cbd73d1e685d7d2f57292ef951f43 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 25 May 2020 19:26:07 +0200 Subject: [PATCH 168/492] Docs: sql -> SQL --- docs/configuration/postgresql.md | 6 +++--- docs/installation/otp_en.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/configuration/postgresql.md b/docs/configuration/postgresql.md index 068f133a9..6983fb459 100644 --- a/docs/configuration/postgresql.md +++ b/docs/configuration/postgresql.md @@ -1,6 +1,6 @@ -# Optimizing your Postgresql performance +# 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. +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. @@ -8,7 +8,7 @@ We also recommend not using the "Network Storage" option. ## Example configurations -Here are some configuration suggestions for Postgresql 10+. +Here are some configuration suggestions for PostgreSQL 10+. ### 1GB RAM, 1 CPU ``` diff --git a/docs/installation/otp_en.md b/docs/installation/otp_en.md index 6f9749ef1..86135cd20 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 -It is encouraged to check [Optimizing your Postgresql performance](../configuration/postgresql.md) document, for tips on PostgreSQL tuning. +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 From 0ba1f2631a09cc0a40f8a0bc2f81ff2c83beedfb Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Mon, 25 May 2020 22:02:22 +0400 Subject: [PATCH 169/492] Add OpenAPI spec for AdminAPI.OAuthAppContoller --- .../controllers/admin_api_controller.ex | 83 ------- .../controllers/oauth_app_controller.ex | 87 +++++++ .../operations/admin/oauth_app_operation.ex | 215 +++++++++++++++++ lib/pleroma/web/oauth/app.ex | 29 +-- lib/pleroma/web/router.ex | 8 +- .../controllers/admin_api_controller_test.exs | 185 --------------- .../controllers/oauth_app_controller_test.exs | 220 ++++++++++++++++++ 7 files changed, 541 insertions(+), 286 deletions(-) create mode 100644 lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex create mode 100644 lib/pleroma/web/api_spec/operations/admin/oauth_app_operation.ex create mode 100644 test/web/admin_api/controllers/oauth_app_controller_test.exs diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 6b1d64a2e..4f10bd947 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -32,8 +32,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do 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 @@ -122,10 +120,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do :config_update, :resend_confirmation_email, :confirm_email, - :oauth_app_create, - :oauth_app_list, - :oauth_app_update, - :oauth_app_delete, :reload_emoji ] ) @@ -995,83 +989,6 @@ def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" = 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 - 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 - } - - 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() 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..04e629fc1 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex @@ -0,0 +1,87 @@ +# 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 = + if params[:name] do + Map.put(params, :client_name, params[:name]) + else + params + end + + 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 = + if params[:name] do + Map.put(params, :client_name, params.name) + else + params + end + + 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/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/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 @@ def register_changeset(struct, params \\ %{}) 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 @@ def update(params) 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 @@ defp update_scopes(%__MODULE__{} = app, scopes) 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 @@ def search(params) 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/router.ex b/lib/pleroma/web/router.ex index e493a4153..46f03cdfd 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -205,10 +205,10 @@ 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) end scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index 321840a8c..f704cdd3a 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -3522,191 +3522,6 @@ test "status visibility count", %{conn: conn} do 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 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 From e32b7ae044be284c4b0d596d2effd1c7801873b3 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Mon, 25 May 2020 23:01:37 +0400 Subject: [PATCH 170/492] Skip failing `:crypt` test on mac --- test/plugs/authentication_plug_test.exs | 1 + 1 file changed, 1 insertion(+) 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 @@ test "with a bcrypt hash, it updates to a pkbdf2 hash", %{conn: conn} 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, From d7a57004ef975e2cf02facb9d80cff287a5d6d3b Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Mon, 25 May 2020 23:27:47 +0300 Subject: [PATCH 171/492] [#1501] Made user feed contain public and unlisted activities. --- lib/pleroma/web/activity_pub/activity_pub.ex | 25 ++++++++++++++----- lib/pleroma/web/feed/user_controller.ex | 2 +- test/web/feed/user_controller_test.exs | 26 +++++++++++++++++++- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 2cea55285..0fe71694a 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -538,14 +538,27 @@ def fetch_latest_activity_id_for_context(context, opts \\ %{}) do |> Repo.one() end - @spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()] - def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do + @spec fetch_public_or_unlisted_activities(map(), Pagination.type()) :: [Activity.t()] + def fetch_public_or_unlisted_activities(opts \\ %{}, pagination \\ :keyset) do opts = Map.drop(opts, ["user"]) - [Constants.as_public()] - |> fetch_activities_query(opts) - |> restrict_unlisted() - |> Pagination.fetch_paginated(opts, pagination) + query = fetch_activities_query([Constants.as_public()], opts) + + query = + if opts["restrict_unlisted"] do + restrict_unlisted(query) + else + query + end + + Pagination.fetch_paginated(query, 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] diff --git a/lib/pleroma/web/feed/user_controller.ex b/lib/pleroma/web/feed/user_controller.ex index 1b72e23dc..5a6fc9de0 100644 --- a/lib/pleroma/web/feed/user_controller.ex +++ b/lib/pleroma/web/feed/user_controller.ex @@ -56,7 +56,7 @@ def feed(conn, %{"nickname" => nickname} = params) do "actor_id" => user.ap_id } |> put_if_exist("max_id", params["max_id"]) - |> ActivityPub.fetch_public_activities() + |> ActivityPub.fetch_public_or_unlisted_activities() conn |> put_resp_content_type("application/#{format}+xml") 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 @@ test "returns 404 for a missing feed", %{conn: conn} 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 From 8f08384d8058f61753c28d37c90b47a2886f348c Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 18 May 2020 10:09:21 +0300 Subject: [PATCH 172/492] another view for account in admin-fe status_show --- .../web/admin_api/controllers/status_controller.ex | 2 +- test/web/admin_api/controllers/status_controller_test.exs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/admin_api/controllers/status_controller.ex b/lib/pleroma/web/admin_api/controllers/status_controller.ex index 08cb9c10b..c91fbc771 100644 --- a/lib/pleroma/web/admin_api/controllers/status_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/status_controller.ex @@ -42,7 +42,7 @@ def index(%{assigns: %{user: _admin}} = conn, params) do def show(conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id(id) do conn - |> put_view(MastodonAPI.StatusView) + |> put_view(Pleroma.Web.AdminAPI.StatusView) |> render("show.json", %{activity: activity}) else nil -> {:error, :not_found} diff --git a/test/web/admin_api/controllers/status_controller_test.exs b/test/web/admin_api/controllers/status_controller_test.exs index 124d8dc2e..eff78fb0a 100644 --- a/test/web/admin_api/controllers/status_controller_test.exs +++ b/test/web/admin_api/controllers/status_controller_test.exs @@ -42,6 +42,14 @@ test "shows activity", %{conn: conn} do |> 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 From 95ebfb9190e6e7d446213ca57e8c99aa3116ed0a Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 26 May 2020 13:13:39 +0400 Subject: [PATCH 173/492] Move invite actions to AdminAPI.InviteTokenController --- .../controllers/admin_api_controller.ex | 72 ----- .../controllers/invite_token_controller.ex | 88 +++++++ .../admin/invite_token_operation.ex | 165 ++++++++++++ lib/pleroma/web/router.ex | 8 +- .../controllers/admin_api_controller_test.exs | 223 ---------------- .../invite_token_controller_test.exs | 247 ++++++++++++++++++ 6 files changed, 504 insertions(+), 299 deletions(-) create mode 100644 lib/pleroma/web/admin_api/controllers/invite_token_controller.ex create mode 100644 lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex create mode 100644 test/web/admin_api/controllers/invite_token_controller_test.exs diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 6b1d64a2e..95582b008 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -16,7 +16,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do 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 @@ -69,14 +68,6 @@ 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} @@ -575,69 +566,6 @@ def relay_unfollow(%{assigns: %{user: admin}} = conn, %{"relay_url" => 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, _} -> - {: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."} - 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) diff --git a/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex b/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex new file mode 100644 index 000000000..a0291e9c3 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex @@ -0,0 +1,88 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InviteTokenController do + use Pleroma.Web, :controller + + import Pleroma.Web.ControllerHelper, only: [json_response: 3] + + alias Pleroma.Config + alias Pleroma.Plugs.OAuthScopesPlug + alias Pleroma.UserInviteToken + alias Pleroma.Web.AdminAPI.AccountView + + require Logger + + 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) + + @doc "Get list of created invites" + def index(conn, _params) do + invites = UserInviteToken.list_invites() + + conn + |> put_view(AccountView) + |> render("invites.json", %{invites: invites}) + end + + @doc "Create an account registration invite token" + def create(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 "Revokes invite by token" + def revoke(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 "Sends registration invite via email" + def email(%{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, _} -> + {: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."} + end + end +end diff --git a/lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex b/lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex new file mode 100644 index 000000000..09a7735d1 --- /dev/null +++ b/lib/pleroma/web/api_spec/operations/admin/invite_token_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.InviteTokenOperation 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 + + defp 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/router.ex b/lib/pleroma/web/router.ex index e493a4153..fe36f0189 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -164,10 +164,10 @@ defmodule Pleroma.Web.Router do post("/relay", AdminAPIController, :relay_follow) delete("/relay", AdminAPIController, :relay_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", InviteTokenController, :create) + get("/users/invites", InviteTokenController, :index) + post("/users/revoke_invite", InviteTokenController, :revoke) + post("/users/email_invite", InviteTokenController, :email) get("/users/:nickname/password_reset", AdminAPIController, :get_password_reset) patch("/users/force_password_reset", AdminAPIController, :force_password_reset) diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index 321840a8c..f7e163f57 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -20,7 +20,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do 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 @@ -588,122 +587,6 @@ test "/:right DELETE, can remove from a permission group (multiple)", %{ 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) == - %{ - "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 = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") - - assert json_response(conn, :bad_request) == - %{ - "error" => - "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) @@ -1318,112 +1201,6 @@ test "returns 404 if user not found", %{conn: conn} do 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) == %{"error" => "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) diff --git a/test/web/admin_api/controllers/invite_token_controller_test.exs b/test/web/admin_api/controllers/invite_token_controller_test.exs new file mode 100644 index 000000000..eb57b4d44 --- /dev/null +++ b/test/web/admin_api/controllers/invite_token_controller_test.exs @@ -0,0 +1,247 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.AdminAPI.InviteTokenControllerTest 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 = + 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) == + %{ + "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 = post(conn, "/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") + + assert json_response(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 = 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) == %{"error" => "Not found"} + end + end +end From 2a4f965191af6ec6ab953569898acff55bd1502b Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 26 May 2020 15:02:51 +0400 Subject: [PATCH 174/492] Add OpenAPI spec for AdminAPI.InviteTokenController --- .../controllers/invite_token_controller.ex | 25 +- .../admin/invite_token_operation.ex | 241 ++++++++---------- .../invite_token_controller_test.exs | 84 ++++-- 3 files changed, 179 insertions(+), 171 deletions(-) diff --git a/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex b/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex index a0291e9c3..a09966e5c 100644 --- a/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex @@ -14,6 +14,7 @@ defmodule Pleroma.Web.AdminAPI.InviteTokenController do require Logger + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["read:invites"], admin: true} when action == :index) plug( @@ -23,6 +24,8 @@ defmodule Pleroma.Web.AdminAPI.InviteTokenController do action_fallback(Pleroma.Web.AdminAPI.FallbackController) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.InviteTokenOperation + @doc "Get list of created invites" def index(conn, _params) do invites = UserInviteToken.list_invites() @@ -33,26 +36,14 @@ def index(conn, _params) do end @doc "Create an account registration invite token" - def create(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) + def create(%{body_params: params} = conn, _) do + {:ok, invite} = UserInviteToken.create_invite(params) json(conn, AccountView.render("invite.json", %{invite: invite})) end @doc "Revokes invite by token" - def revoke(conn, %{"token" => token}) do + 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 conn @@ -64,7 +55,7 @@ def revoke(conn, %{"token" => token}) do end @doc "Sends registration invite via email" - def email(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do + 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(), @@ -73,7 +64,7 @@ def email(%{assigns: %{user: user}} = conn, %{"email" => email} = params) do user, invite_token, email, - params["name"] + params[:name] ), {:ok, _} <- Pleroma.Emails.Mailer.deliver(email) do json_response(conn, :no_content, "") diff --git a/lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex b/lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex index 09a7735d1..0f7403f26 100644 --- a/lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex @@ -5,14 +5,9 @@ defmodule Pleroma.Web.ApiSpec.Admin.InviteTokenOperation 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") @@ -21,144 +16,132 @@ def open_api_operation(action) do 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" - ) - ], + tags: ["Admin", "Invites"], + summary: "Get a list of generated invites", + operationId: "AdminAPI.InviteTokenController.index", + security: [%{"oAuth" => ["read:invites"]}], responses: %{ 200 => - Operation.response("Array of statuses", "application/json", %Schema{ - type: :array, - items: status() + Operation.response("Intites", "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 show_operation do + def create_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{ + tags: ["Admin", "Invites"], + summary: "Create an account registration invite token", + operationId: "AdminAPI.InviteTokenController.create", + security: [%{"oAuth" => ["write:invites"]}], + requestBody: + request_body("Parameters", %Schema{ type: :object, properties: %{ - account: %Schema{allOf: [Account, admin_account()]} + 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.InviteTokenController.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.InviteTokenController.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"] } - ] - } - end - - defp 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" + "id" => 123, + "token" => "kSQtDj_GNy2NZsL9AQDFIsHN5qdbguB6qRg3WHw6K1U=", + "used" => true, + "expires_at" => nil, + "uses" => 0, + "max_use" => nil, + "invite_type" => "one_time" } } end diff --git a/test/web/admin_api/controllers/invite_token_controller_test.exs b/test/web/admin_api/controllers/invite_token_controller_test.exs index eb57b4d44..cb486f4d1 100644 --- a/test/web/admin_api/controllers/invite_token_controller_test.exs +++ b/test/web/admin_api/controllers/invite_token_controller_test.exs @@ -32,12 +32,14 @@ test "sends invitation and returns 204", %{admin: admin, conn: conn} do recipient_name = "J. D." conn = - post( - conn, - "/api/pleroma/admin/users/email_invite?email=#{recipient_email}&name=#{recipient_name}" - ) + 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(conn, :no_content) + assert json_response_and_validate_schema(conn, :no_content) token_record = List.last(Repo.all(Pleroma.UserInviteToken)) assert token_record @@ -69,7 +71,11 @@ test "it returns 403 if requested by a non-admin" do build_conn() |> assign(:user, non_admin_user) |> assign(:token, token) - |> post("/api/pleroma/admin/users/email_invite?email=foo@bar.com&name=JD") + |> 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 @@ -80,7 +86,7 @@ test "email with +", %{conn: conn, admin: admin} do 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) + |> json_response_and_validate_schema(:no_content) token_record = Pleroma.UserInviteToken @@ -116,9 +122,15 @@ 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") + 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(conn, :bad_request) == + assert json_response_and_validate_schema(conn, :bad_request) == %{ "error" => "To send invites you need to set the `invites_enabled` option to true." @@ -129,9 +141,15 @@ 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") + 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(conn, :bad_request) == + assert json_response_and_validate_schema(conn, :bad_request) == %{ "error" => "To send invites you need to set the `registrations_open` option to false." @@ -141,9 +159,12 @@ test "it returns 500 if `registrations_open` is enabled", %{conn: conn} do describe "POST /api/pleroma/admin/users/invite_token" do test "without options", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/users/invite_token") + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/invite_token") - invite_json = json_response(conn, 200) + invite_json = json_response_and_validate_schema(conn, 200) invite = UserInviteToken.find_by_token!(invite_json["token"]) refute invite.used refute invite.expires_at @@ -153,11 +174,13 @@ test "without options", %{conn: conn} do test "with expires_at", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/users/invite_token", %{ + 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(conn, 200) + invite_json = json_response_and_validate_schema(conn, 200) invite = UserInviteToken.find_by_token!(invite_json["token"]) refute invite.used @@ -167,9 +190,12 @@ test "with expires_at", %{conn: conn} do end test "with max_use", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/users/invite_token", %{"max_use" => 150}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/invite_token", %{"max_use" => 150}) - invite_json = json_response(conn, 200) + invite_json = json_response_and_validate_schema(conn, 200) invite = UserInviteToken.find_by_token!(invite_json["token"]) refute invite.used refute invite.expires_at @@ -179,12 +205,14 @@ test "with max_use", %{conn: conn} do test "with max use and expires_at", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/users/invite_token", %{ + 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(conn, 200) + 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() @@ -197,7 +225,7 @@ test "with max use and expires_at", %{conn: conn} do test "no invites", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/users/invites") - assert json_response(conn, 200) == %{"invites" => []} + assert json_response_and_validate_schema(conn, 200) == %{"invites" => []} end test "with invite", %{conn: conn} do @@ -205,7 +233,7 @@ test "with invite", %{conn: conn} do conn = get(conn, "/api/pleroma/admin/users/invites") - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "invites" => [ %{ "expires_at" => nil, @@ -225,9 +253,12 @@ test "with invite", %{conn: conn} do test "with token", %{conn: conn} do {:ok, invite} = UserInviteToken.create_invite() - conn = post(conn, "/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => invite.token}) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "expires_at" => nil, "id" => invite.id, "invite_type" => "one_time", @@ -239,9 +270,12 @@ test "with token", %{conn: conn} do end test "with invalid token", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/users/revoke_invite", %{"token" => "foo"}) - assert json_response(conn, :not_found) == %{"error" => "Not found"} + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} end end end From fca48154a23c0b38d514b2bc4d49a74274e02a8f Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 26 May 2020 15:21:33 +0400 Subject: [PATCH 175/492] Add AdminAPI.InviteView --- ...ken_controller.ex => invite_controller.ex} | 29 +++++++++---------- .../web/admin_api/views/account_view.ex | 18 ------------ .../web/admin_api/views/invite_view.ex | 25 ++++++++++++++++ ...token_operation.ex => invite_operation.ex} | 10 +++---- lib/pleroma/web/router.ex | 8 ++--- ...er_test.exs => invite_controller_test.exs} | 2 +- 6 files changed, 49 insertions(+), 43 deletions(-) rename lib/pleroma/web/admin_api/controllers/{invite_token_controller.ex => invite_controller.ex} (79%) create mode 100644 lib/pleroma/web/admin_api/views/invite_view.ex rename lib/pleroma/web/api_spec/operations/admin/{invite_token_operation.ex => invite_operation.ex} (93%) rename test/web/admin_api/controllers/{invite_token_controller_test.exs => invite_controller_test.exs} (99%) diff --git a/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex b/lib/pleroma/web/admin_api/controllers/invite_controller.ex similarity index 79% rename from lib/pleroma/web/admin_api/controllers/invite_token_controller.ex rename to lib/pleroma/web/admin_api/controllers/invite_controller.ex index a09966e5c..7d169b8d2 100644 --- a/lib/pleroma/web/admin_api/controllers/invite_token_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/invite_controller.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.AdminAPI.InviteTokenController do +defmodule Pleroma.Web.AdminAPI.InviteController do use Pleroma.Web, :controller import Pleroma.Web.ControllerHelper, only: [json_response: 3] @@ -10,7 +10,6 @@ defmodule Pleroma.Web.AdminAPI.InviteTokenController do alias Pleroma.Config alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.UserInviteToken - alias Pleroma.Web.AdminAPI.AccountView require Logger @@ -24,33 +23,30 @@ defmodule Pleroma.Web.AdminAPI.InviteTokenController do action_fallback(Pleroma.Web.AdminAPI.FallbackController) - defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.InviteTokenOperation + 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() - conn - |> put_view(AccountView) - |> render("invites.json", %{invites: 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) - json(conn, AccountView.render("invite.json", %{invite: invite})) + 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 - conn - |> put_view(AccountView) - |> render("invite.json", %{invite: updated_invite}) + render(conn, "show.json", invite: updated_invite) else nil -> {:error, :not_found} + error -> error end end @@ -59,14 +55,14 @@ def email(%{assigns: %{user: user}, body_params: %{email: email} = params} = con 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, + {:ok, _} <- + user + |> Pleroma.Emails.UserEmail.user_invitation_email( invite_token, email, params[:name] - ), - {:ok, _} <- Pleroma.Emails.Mailer.deliver(email) do + ) + |> Pleroma.Emails.Mailer.deliver() do json_response(conn, :no_content, "") else {:registrations_open, _} -> @@ -74,6 +70,9 @@ def email(%{assigns: %{user: user}, body_params: %{email: email} = params} = con {: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/views/account_view.ex b/lib/pleroma/web/admin_api/views/account_view.ex index 46dadb5ee..120159527 100644 --- a/lib/pleroma/web/admin_api/views/account_view.ex +++ b/lib/pleroma/web/admin_api/views/account_view.ex @@ -80,24 +80,6 @@ def render("show.json", %{user: user}) do } 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) - } - end - def render("created.json", %{user: user}) do %{ type: "success", 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/api_spec/operations/admin/invite_token_operation.ex b/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex similarity index 93% rename from lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex rename to lib/pleroma/web/api_spec/operations/admin/invite_operation.ex index 0f7403f26..4ae44fff6 100644 --- a/lib/pleroma/web/api_spec/operations/admin/invite_token_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ApiSpec.Admin.InviteTokenOperation do +defmodule Pleroma.Web.ApiSpec.Admin.InviteOperation do alias OpenApiSpex.Operation alias OpenApiSpex.Schema alias Pleroma.Web.ApiSpec.Schemas.ApiError @@ -18,7 +18,7 @@ def index_operation do %Operation{ tags: ["Admin", "Invites"], summary: "Get a list of generated invites", - operationId: "AdminAPI.InviteTokenController.index", + operationId: "AdminAPI.InviteController.index", security: [%{"oAuth" => ["read:invites"]}], responses: %{ 200 => @@ -49,7 +49,7 @@ def create_operation do %Operation{ tags: ["Admin", "Invites"], summary: "Create an account registration invite token", - operationId: "AdminAPI.InviteTokenController.create", + operationId: "AdminAPI.InviteController.create", security: [%{"oAuth" => ["write:invites"]}], requestBody: request_body("Parameters", %Schema{ @@ -69,7 +69,7 @@ def revoke_operation do %Operation{ tags: ["Admin", "Invites"], summary: "Revoke invite by token", - operationId: "AdminAPI.InviteTokenController.revoke", + operationId: "AdminAPI.InviteController.revoke", security: [%{"oAuth" => ["write:invites"]}], requestBody: request_body( @@ -95,7 +95,7 @@ def email_operation do %Operation{ tags: ["Admin", "Invites"], summary: "Sends registration invite via email", - operationId: "AdminAPI.InviteTokenController.email", + operationId: "AdminAPI.InviteController.email", security: [%{"oAuth" => ["write:invites"]}], requestBody: request_body( diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index fe36f0189..9b7c7ee3d 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -164,10 +164,10 @@ defmodule Pleroma.Web.Router do post("/relay", AdminAPIController, :relay_follow) delete("/relay", AdminAPIController, :relay_unfollow) - post("/users/invite_token", InviteTokenController, :create) - get("/users/invites", InviteTokenController, :index) - post("/users/revoke_invite", InviteTokenController, :revoke) - post("/users/email_invite", InviteTokenController, :email) + 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) diff --git a/test/web/admin_api/controllers/invite_token_controller_test.exs b/test/web/admin_api/controllers/invite_controller_test.exs similarity index 99% rename from test/web/admin_api/controllers/invite_token_controller_test.exs rename to test/web/admin_api/controllers/invite_controller_test.exs index cb486f4d1..ab186c5e7 100644 --- a/test/web/admin_api/controllers/invite_token_controller_test.exs +++ b/test/web/admin_api/controllers/invite_controller_test.exs @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.AdminAPI.InviteTokenControllerTest do +defmodule Pleroma.Web.AdminAPI.InviteControllerTest do use Pleroma.Web.ConnCase, async: true import Pleroma.Factory From 51bc6674f6a9b6794ba981052a1e432915beaef7 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 26 May 2020 13:45:54 +0200 Subject: [PATCH 176/492] Mastodon API Controllers: Use the correct params for rate limiting. --- .../web/mastodon_api/controllers/account_controller.ex | 2 +- lib/pleroma/web/mastodon_api/controllers/status_controller.ex | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 75512442d..47649d41d 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -81,7 +81,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) diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex index 83d997abd..f20157a5f 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 ) From 2069ec5006b9142b784dc6ab8b190838481dfe5b Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 26 May 2020 16:11:42 +0400 Subject: [PATCH 177/492] Fix Oban warnings --- lib/pleroma/workers/cron/clear_oauth_token_worker.ex | 2 ++ lib/pleroma/workers/cron/digest_emails_worker.ex | 2 ++ lib/pleroma/workers/cron/new_users_digest_worker.ex | 4 ++++ lib/pleroma/workers/cron/purge_expired_activities_worker.ex | 2 ++ 4 files changed, 10 insertions(+) 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 @@ def perform(_opts, _job) 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 @@ def perform(_args, _job) 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 From 337ca33e5e4a84885eee3abd2de529663c27f1f1 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 26 May 2020 16:00:56 +0200 Subject: [PATCH 178/492] Config: Restore old new background image Became lost in a settings restructure --- config/config.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.exs b/config/config.exs index 7385fb6c3..d15998715 100644 --- a/config/config.exs +++ b/config/config.exs @@ -274,7 +274,7 @@ config :pleroma, :frontend_configurations, pleroma_fe: %{ alwaysShowSubjectInput: true, - background: "/static/aurora_borealis.jpg", + background: "/images/city.jpg", collapseMessageWithSubject: false, disableChat: false, greentext: false, From acba7043be4256976b4026e1b331c38842ec0e86 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 26 May 2020 16:46:57 +0200 Subject: [PATCH 179/492] Migrations: Add index on client_id and client_secret for apps. Greatly speeds up app lookup. --- priv/repo/migrations/20200526144426_add_apps_indexes.exs | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 priv/repo/migrations/20200526144426_add_apps_indexes.exs 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 From d8d99fd4cf56b4e3adb17c75062a08ec3fdebb89 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 26 May 2020 17:46:16 +0200 Subject: [PATCH 180/492] Activity.Queries: Use correct actor restriction. --- lib/pleroma/activity/queries.ex | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 @@ def by_ap_id(query \\ Activity, ap_id) 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 From 3249141588c8f73f1958f782041798fbde05e69f Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Wed, 27 May 2020 09:42:28 +0300 Subject: [PATCH 181/492] validate actor type --- docs/API/admin_api.md | 18 +++++++++- lib/pleroma/user.ex | 5 +-- .../controllers/admin_api_controller.ex | 13 ++++--- .../controllers/admin_api_controller_test.exs | 35 ++++++++++++++++--- 4 files changed, 60 insertions(+), 11 deletions(-) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index c455047cc..639c3224d 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -511,7 +511,23 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret - `discoverable` - `actor_type` -- Response: none (code `200`) +- Response: + +```json +{"status": "success"} +``` + +```json +{"errors": + {"actor_type": "is invalid"}, + {"email": "has invalid format"}, + ... + } +``` + +```json +{"error": "Unable to update user."} +``` ## `GET /api/pleroma/admin/reports` diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 842b28c06..2684e1139 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -538,9 +538,10 @@ def update_as_admin_changeset(struct, params) 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) @@ -561,7 +562,7 @@ def password_update_changeset(struct, params) 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 diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 6b1d64a2e..6aedccec6 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -693,7 +693,7 @@ def update_user_credentials( %{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(%{ @@ -715,11 +715,16 @@ def update_user_credentials( json(conn, %{status: "success"}) else {:error, changeset} -> - {_, {error, _}} = Enum.at(changeset.errors, 0) - json(conn, %{error: "New password #{error}."}) + errors = + Enum.reduce(changeset.errors, %{}, fn + {key, {error, _}}, acc -> + Map.put(acc, key, error) + end) + + json(conn, %{errors: errors}) _ -> - json(conn, %{error: "Unable to change password."}) + json(conn, %{error: "Unable to update user."}) end 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 index 321840a8c..ead840186 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -3191,8 +3191,12 @@ test "returns 403 if requested by a non-admin" do end describe "PATCH /users/:nickname/credentials" do - test "changes password and email", %{conn: conn, admin: admin} 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 = @@ -3222,9 +3226,7 @@ test "changes password and email", %{conn: conn, admin: admin} do "@#{admin.nickname} forced password reset for users: @#{user.nickname}" end - test "returns 403 if requested by a non-admin" do - user = insert(:user) - + test "returns 403 if requested by a non-admin", %{user: user} do conn = build_conn() |> assign(:user, user) @@ -3236,6 +3238,31 @@ test "returns 403 if requested by a non-admin" do 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(200) == %{"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(200) == %{"error" => "Unable to update user."} + end end describe "PATCH /users/:nickname/force_password_reset" do From 7e13200869a41647f25bdcf416ecd36ff09219bc Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 27 May 2020 09:46:12 +0200 Subject: [PATCH 182/492] ActivityPub: Change ordering to `nulls last` in favorites query This makes it use our existing index and speeds up the query. --- lib/pleroma/web/activity_pub/activity_pub.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 0fe71694a..b8a2873d8 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1158,7 +1158,7 @@ def fetch_favourites(user, params \\ %{}, pagination \\ :keyset) do |> Activity.with_joined_object() |> Object.with_joined_activity() |> select([_like, object, activity], %{activity | object: object}) - |> order_by([like, _, _], desc: like.id) + |> order_by([like, _, _], desc_nulls_last: like.id) |> Pagination.fetch_paginated( Map.merge(params, %{"skip_order" => true}), pagination, From b8e029b5ea33c9267ac26ab7ba598f1cd7be46c2 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 27 May 2020 12:41:06 +0200 Subject: [PATCH 183/492] Notification: Actually preload objects. --- lib/pleroma/notification.ex | 15 +++------------ test/notification_test.exs | 11 +++++++---- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 8aa9ed2d4..fb16ec896 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -92,8 +92,9 @@ def for_user_query(user, opts \\ %{}) 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 ) ) @@ -224,18 +225,8 @@ def set_read_up_to(%{id: user_id} = user, id) 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 diff --git a/test/notification_test.exs b/test/notification_test.exs index 3a96721fa..37c255fee 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -454,8 +454,7 @@ test "it sets all notifications as read up to a specified notification ID" 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 +463,9 @@ test "it sets all notifications as read up to a specified notification ID" 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) @@ -972,7 +973,9 @@ test "it returns notifications for muted user without notifications" 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 From c6290be682bd12b1772153d421f36e5ddb9d664b Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Wed, 27 May 2020 14:42:21 +0400 Subject: [PATCH 184/492] Fix typo --- lib/pleroma/web/api_spec/operations/admin/invite_operation.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex b/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex index 4ae44fff6..d3af9db49 100644 --- a/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/invite_operation.ex @@ -22,7 +22,7 @@ def index_operation do security: [%{"oAuth" => ["read:invites"]}], responses: %{ 200 => - Operation.response("Intites", "application/json", %Schema{ + Operation.response("Invites", "application/json", %Schema{ type: :object, properties: %{ invites: %Schema{type: :array, items: invite()} From 047a11c48f2bc88b6b278b6a5acd94807c7e5138 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Wed, 27 May 2020 10:55:42 +0000 Subject: [PATCH 185/492] Apply suggestion to lib/pleroma/web/admin_api/controllers/admin_api_controller.ex --- .../web/admin_api/controllers/admin_api_controller.ex | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 6aedccec6..783203c07 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -715,11 +715,7 @@ def update_user_credentials( json(conn, %{status: "success"}) else {:error, changeset} -> - errors = - Enum.reduce(changeset.errors, %{}, fn - {key, {error, _}}, acc -> - Map.put(acc, key, error) - end) + errors = Map.new(changeset.errors, fn {key, {error, _}} -> {key, error} end) json(conn, %{errors: errors}) From 73f222d76a03e7bfad1aae80e0dc9d2777a94f3e Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 27 May 2020 12:56:15 +0200 Subject: [PATCH 186/492] Migrations: Make user_id index on notifications better for query. --- .../20200527104138_change_notification_user_index.exs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 priv/repo/migrations/20200527104138_change_notification_user_index.exs 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 From 48fd9be65ae2c25e170e494720a07c126e80e2f6 Mon Sep 17 00:00:00 2001 From: kPherox Date: Tue, 26 May 2020 09:47:03 +0000 Subject: [PATCH 187/492] Exclude post actor from to of relay announce --- lib/pleroma/web/activity_pub/builder.ex | 16 +++++++++++----- test/web/activity_pub/relay_test.exs | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 7ece764f5..51b74414a 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.Builder do alias Pleroma.Object alias Pleroma.User + alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility @@ -85,15 +86,20 @@ def like(actor, object) do end end + @spec announce(User.t(), Object.t(), keyword()) :: {:ok, map(), keyword()} def announce(actor, object, options \\ []) do public? = Keyword.get(options, :public, false) - to = [actor.follower_address, object.data["actor"]] to = - if public? do - [Pleroma.Constants.as_public() | to] - else - 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, diff --git a/test/web/activity_pub/relay_test.exs b/test/web/activity_pub/relay_test.exs index dbee8a0f4..b3b573c9b 100644 --- a/test/web/activity_pub/relay_test.exs +++ b/test/web/activity_pub/relay_test.exs @@ -108,6 +108,7 @@ test "returns error when object is unknown" do assert {:ok, %Activity{} = activity} = Relay.publish(note) assert activity.data["type"] == "Announce" assert activity.data["actor"] == service_actor.ap_id + assert activity.data["to"] == [service_actor.follower_address] assert called(Pleroma.Web.Federator.publish(activity)) end From 78c46fb7ba2aa9e9842d3c7d8331488fd10a3b9d Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 27 May 2020 19:34:56 +0300 Subject: [PATCH 188/492] MediaProxy test: use config macros instead of directly putting values They were not properly cleaned later and caused trouble for another tests --- test/web/media_proxy/media_proxy_test.exs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/test/web/media_proxy/media_proxy_test.exs b/test/web/media_proxy/media_proxy_test.exs index 69c2d5dae..69d2a71a6 100644 --- a/test/web/media_proxy/media_proxy_test.exs +++ b/test/web/media_proxy/media_proxy_test.exs @@ -124,15 +124,7 @@ test "encoded url are tried to match for proxy as `conn.request_path` encodes th end test "uses the configured base_url" do - base_url = Pleroma.Config.get([:media_proxy, :base_url]) - - if base_url do - on_exit(fn -> - Pleroma.Config.put([:media_proxy, :base_url], base_url) - end) - end - - Pleroma.Config.put([:media_proxy, :base_url], "https://cache.pleroma.social") + clear_config([:media_proxy, :base_url], "https://cache.pleroma.social") url = "https://pleroma.soykaf.com/static/logo.png" encoded = url(url) @@ -213,8 +205,8 @@ test "mediaproxy whitelist" do end test "does not change whitelisted urls" do - Pleroma.Config.put([:media_proxy, :whitelist], ["mycdn.akamai.com"]) - Pleroma.Config.put([:media_proxy, :base_url], "https://cache.pleroma.social") + clear_config([:media_proxy, :whitelist], ["mycdn.akamai.com"]) + clear_config([:media_proxy, :base_url], "https://cache.pleroma.social") media_url = "https://mycdn.akamai.com" From 8f6d428880721d4b0151991e7943706b70ab8005 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 27 May 2020 19:35:35 +0300 Subject: [PATCH 189/492] AccountView: Use mediaproxy URLs for emojis Also use atom keys in emoji maps instead of binaries Closes #1810 --- .../web/mastodon_api/views/account_view.ex | 12 ++++--- .../mastodon_api/views/account_view_test.exs | 35 ++++++++++++++++--- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 45fffaad2..04c419d2f 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -182,12 +182,14 @@ defp do_render("show.json", %{user: user} = opts) do bot = user.actor_type in ["Application", "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) diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index 487ec26c2..f91333e5c 100644 --- a/test/web/mastodon_api/views/account_view_test.exs +++ b/test/web/mastodon_api/views/account_view_test.exs @@ -54,10 +54,10 @@ test "Represent a user account" 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: [], @@ -491,4 +491,31 @@ test "shows non-zero when historical unapproved requests are present" 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 From 455a402c8a967b3a234c836b0574c4f011860d43 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 27 May 2020 20:27:30 +0300 Subject: [PATCH 190/492] HTTP Security plug: rewrite &csp_string/0 - Directives are now separated with ";" instead of " ;", according to https://www.w3.org/TR/CSP2/#policy-parsing the space is optional - Use an IO list, which at the end gets converted to a binary as opposed to ++ing a bunch of arrays with binaries together and joining them to a string. I doubt it gives any significant real world advantage, but the code is cleaner and now I can sleep at night. - The static part of csp is pre-joined to a single binary at compile time. Same reasoning as the last point. --- lib/pleroma/plugs/http_security_plug.ex | 52 ++++++++++++++----------- test/plugs/http_security_plug_test.exs | 2 +- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 6462797b6..f9aff2fab 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -31,7 +31,7 @@ defp headers 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,35 @@ defp headers do ] } - headers ++ [{"reply-to", Jason.encode!(report_group)}] + [{"reply-to", Jason.encode!(report_group)} | headers] else headers end end + @csp_start [ + "default-src 'none'", + "base-uri 'self'", + "frame-ancestors 'none'", + "style-src 'self' 'unsafe-inline'", + "font-src 'self'", + "manifest-src 'self'" + ] + |> Enum.join(";") + |> Kernel.<>(";") + |> List.wrap() + 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}" + connect_src = ["connect-src 'self' ", 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,27 +83,23 @@ defp csp_string 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" - report = if report_uri, do: ["report-uri #{report_uri}; report-to csp-endpoint"], else: [] - - insecure = if scheme == "https", do: ["upgrade-insecure-requests"], else: [] - - (main_part ++ report ++ insecure) - |> Enum.join("; ") + @csp_start + |> add_csp_param("img-src 'self' data: blob: https:") + |> add_csp_param("media-src 'self' https:") + |> add_csp_param(connect_src) + |> add_csp_param(script_src) + |> add_csp_param(insecure) + |> add_csp_param(report) + |> :erlang.iolist_to_binary() 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 Logger.warn(" 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 @@ test "it sends `report-to` & `report-uri` CSP response headers" 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") From 29ff6d414ba096e74e04264af895abcabcf580b4 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 27 May 2020 21:01:36 +0300 Subject: [PATCH 191/492] HTTP security plug: Harden img-src and media-src when MediaProxy is enabled --- lib/pleroma/plugs/http_security_plug.ex | 41 +++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index f9aff2fab..df38d5022 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -67,11 +67,23 @@ defp csp_string do websocket_url = Pleroma.Web.Endpoint.websocket_url() report_uri = Config.get([:http_security, :report_uri]) + 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, media_src} + end + connect_src = ["connect-src 'self' ", 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 @@ -87,8 +99,8 @@ defp csp_string do insecure = if scheme == "https", do: "upgrade-insecure-requests" @csp_start - |> add_csp_param("img-src 'self' data: blob: https:") - |> add_csp_param("media-src 'self' https:") + |> add_csp_param(img_src) + |> add_csp_param(media_src) |> add_csp_param(connect_src) |> add_csp_param(script_src) |> add_csp_param(insecure) @@ -96,6 +108,29 @@ defp csp_string do |> :erlang.iolist_to_binary() end + 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) + + 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(upload_base_url) + |> add_source(s3_endpoint) + |> add_source(media_proxy_whitelist) + end + + defp add_source(iodata, nil), do: iodata + defp add_source(iodata, source), do: [[?\s, source] | iodata] + defp add_csp_param(csp_iodata, nil), do: csp_iodata defp add_csp_param(csp_iodata, param), do: [[param, ?;] | csp_iodata] From d28b9708d2713984a8852152deec5fa467be4862 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 27 May 2020 13:50:24 -0500 Subject: [PATCH 192/492] Update AdminFE build, re-enables emoji packs --- priv/static/adminfe/chunk-3384.2278f87c.css | 1 - priv/static/adminfe/chunk-3384.d50ed383.css | 1 + .../{chunk-4011.c4799067.css => chunk-7e30.f2b9674a.css} | 2 +- priv/static/adminfe/chunk-e458.6c0703cb.css | 1 + priv/static/adminfe/chunk-e458.f88bafea.css | 1 - priv/static/adminfe/index.html | 2 +- priv/static/adminfe/static/js/app.0146039c.js | 2 ++ priv/static/adminfe/static/js/app.0146039c.js.map | 1 + priv/static/adminfe/static/js/app.203f69f8.js | 2 -- priv/static/adminfe/static/js/app.203f69f8.js.map | 1 - priv/static/adminfe/static/js/chunk-3384.458ffaf1.js | 2 -- priv/static/adminfe/static/js/chunk-3384.458ffaf1.js.map | 1 - priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js | 2 ++ priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map | 1 + priv/static/adminfe/static/js/chunk-4011.67fb1692.js | 2 -- priv/static/adminfe/static/js/chunk-4011.67fb1692.js.map | 1 - priv/static/adminfe/static/js/chunk-7e30.ec42e302.js | 2 ++ priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map | 1 + priv/static/adminfe/static/js/chunk-e458.4e5aad44.js | 2 -- priv/static/adminfe/static/js/chunk-e458.4e5aad44.js.map | 1 - priv/static/adminfe/static/js/chunk-e458.bb460d81.js | 2 ++ priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map | 1 + .../static/js/{runtime.1b4f6ce0.js => runtime.b08eb412.js} | 4 ++-- .../js/{runtime.1b4f6ce0.js.map => runtime.b08eb412.js.map} | 2 +- 24 files changed, 19 insertions(+), 19 deletions(-) delete mode 100644 priv/static/adminfe/chunk-3384.2278f87c.css create mode 100644 priv/static/adminfe/chunk-3384.d50ed383.css rename priv/static/adminfe/{chunk-4011.c4799067.css => chunk-7e30.f2b9674a.css} (58%) create mode 100644 priv/static/adminfe/chunk-e458.6c0703cb.css delete mode 100644 priv/static/adminfe/chunk-e458.f88bafea.css create mode 100644 priv/static/adminfe/static/js/app.0146039c.js create mode 100644 priv/static/adminfe/static/js/app.0146039c.js.map delete mode 100644 priv/static/adminfe/static/js/app.203f69f8.js delete mode 100644 priv/static/adminfe/static/js/app.203f69f8.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-3384.458ffaf1.js delete mode 100644 priv/static/adminfe/static/js/chunk-3384.458ffaf1.js.map create mode 100644 priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js create mode 100644 priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-4011.67fb1692.js delete mode 100644 priv/static/adminfe/static/js/chunk-4011.67fb1692.js.map create mode 100644 priv/static/adminfe/static/js/chunk-7e30.ec42e302.js create mode 100644 priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-e458.4e5aad44.js delete mode 100644 priv/static/adminfe/static/js/chunk-e458.4e5aad44.js.map create mode 100644 priv/static/adminfe/static/js/chunk-e458.bb460d81.js create mode 100644 priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map rename priv/static/adminfe/static/js/{runtime.1b4f6ce0.js => runtime.b08eb412.js} (83%) rename priv/static/adminfe/static/js/{runtime.1b4f6ce0.js.map => runtime.b08eb412.js.map} (94%) 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-3384.d50ed383.css b/priv/static/adminfe/chunk-3384.d50ed383.css new file mode 100644 index 000000000..70ae2a26b --- /dev/null +++ b/priv/static/adminfe/chunk-3384.d50ed383.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}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-7e30.f2b9674a.css similarity index 58% rename from priv/static/adminfe/chunk-4011.c4799067.css rename to priv/static/adminfe/chunk-7e30.f2b9674a.css index 1fb099c0c..a4a56712e 100644 --- a/priv/static/adminfe/chunk-4011.c4799067.css +++ b/priv/static/adminfe/chunk-7e30.f2b9674a.css @@ -1 +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>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 +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: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}.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-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>p[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}.description>p code[data-v-2b61d370]{display:inline;padding:2px 3px;font-size:14px}.description-container[data-v-2b61d370]{overflow-wrap:break-word;margin-bottom:0}.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}.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}.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%}.setting-label[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.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-e458.6c0703cb.css b/priv/static/adminfe/chunk-e458.6c0703cb.css new file mode 100644 index 000000000..6d2a5d996 --- /dev/null +++ b/priv/static/adminfe/chunk-e458.6c0703cb.css @@ -0,0 +1 @@ +.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}.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-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..73e680115 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.0146039c.js b/priv/static/adminfe/static/js/app.0146039c.js new file mode 100644 index 000000000..ab08475ad --- /dev/null +++ b/priv/static/adminfe/static/js/app.0146039c.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 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 E(e,t){return k.apply(this,arguments)}function k(){return(k=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,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)}}},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 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: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 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_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 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)}}()}},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}},Ee=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);Ee.options.__file="SidebarItem.vue";var ke=Ee.exports,Se=n("zx4i"),_e=n.n(Se),Oe={components:{SidebarItem:ke},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,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 ze=Pe.exports,Me=document.body,Be={name:"Layout",components:{Navbar:ce,Sidebar:Ae,AppMain:ze,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 Ne=[""]||!1,Fe=Ne.includes("settings"),Ge={path:"/settings",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-7f9e"),n.e("chunk-7e30")]).then(n.bind(null,"YcIK"))},name:"Settings",meta:{title:"Settings",icon:"settings",noCache:!0}}]},Ye=Ne.includes("statuses"),$e={path:"/statuses",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-df62"),n.e("ZhIB"),n.e("chunk-6b68"),n.e("chunk-e458")]).then(n.bind(null,"FtQ1"))},name:"Statuses",meta:{title:"Statuses",icon:"form",noCache:!0}}]},qe=Ne.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=Ne.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=Ne.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=Ne.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()(Fe?[]:[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),Et=n("QILm"),kt=n.n(Et);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 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]],kt()(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]?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.h)(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 zt(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 Nt.apply(this,arguments)}function Nt(){return(Nt=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 Ft(e,t,n){return Gt.apply(this,arguments)}function Gt(){return(Gt=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:qt(a)});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,zt(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)}}(),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,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,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,Ft(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,Ut({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,Yt({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 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 En(e,t,n){return kn.apply(this,arguments)}function kn(){return(kn=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 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)(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 zn(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)())}:{}},Nn={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,jn(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)}}()}},Fn={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,zn(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,En(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=Fn,$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:{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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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 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:Nn,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,"c",function(){return g}),n.d(t,"a",function(){return w}),n.d(t,"d",function(){return y}),n.d(t,"e",function(){return x}),n.d(t,"f",function(){return S}),n.d(t,"g",function(){return O}),n.d(t,"h",function(){return L}),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(!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},{})},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},x=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]]=T(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},{})},T=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}},k=function(e,t){return!(":auto_linker"===e&&":opts"===t)},S=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},L=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:A(t[a],n[e][a])}})},A=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"},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!",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 x}),n.d(t,"h",function(){return E}),n.d(t,"i",function(){return S}),n.d(t,"j",function(){return O}),n.d(t,"k",function(){return A}),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 x(e,t){return T.apply(this,arguments)}function T(){return(T=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 k.apply(this,arguments)}function k(){return(k=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 S(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 L.apply(this,arguments)}function L(){return(L=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 A(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.0146039c.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/app.0146039c.js.map b/priv/static/adminfe/static/js/app.0146039c.js.map new file mode 100644 index 000000000..178715dc6 --- /dev/null +++ b/priv/static/adminfe/static/js/app.0146039c.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","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","instance","fetchStatusesByInstance","_fetchStatusesByInstance","_callee5","_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","ClearState","DeleteStatus","_DeleteStatus","FetchStatusesCount","_FetchStatusesCount","status_visibility","FetchStatusesByInstance","_FetchStatusesByInstance","FetchStatusesPageByInstance","_FetchStatusesPageByInstance","HandleGodmodeCheckboxChange","HandleLocalCheckboxChange","_ref11","HandleFilterChange","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","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","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","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.0146039c.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(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, 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 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 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 }\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 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 },\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 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/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/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-3384.b2ebeeca.js b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js new file mode 100644 index 000000000..6a161a0c6 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js @@ -0,0 +1,2 @@ +(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},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:n.b}},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",{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);m.options.__file="SingleEmojiEditor.vue";var p=m.exports,u={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)}}()}},d=(a("IVv3"),Object(r.a)(u,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));d.options.__file="NewEmojiUploader.vue";var h={components:{SingleEmojiEditor:p,NewEmojiUploader:d.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})}}},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,shortcode: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)},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")})}}},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,shortcode: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: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));b.options.__file="RemoteEmojiPack.vue";var j=b.exports,_=a("mSNy"),$={components:{LocalEmojiPack:f,RebootButton:a("rIUS").a,RemoteEmojiPack:j},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")})},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)}}},y=(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));y.options.__file="index.vue";t.default=y.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.b2ebeeca.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map new file mode 100644 index 000000000..b08db9d6e --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/views/emojiPacks/index.vue?fe9e","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?575e","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?1029","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","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","keys","files","length","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","$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__","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.b2ebeeca.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=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=55568dc6&\"\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,shortcode){return _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=127f1724&\"\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,shortcode){return _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=250c3227&\"\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-7e30.ec42e302.js b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js new file mode 100644 index 000000000..0a0e1ca34 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-7e30"],{"+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"),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",":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"]}},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+")),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),j=i("J4zp"),M=i.n(j),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 M()(e,1)[0][":url"]},getMimeType:function(t){var e=Object.values(t);return M()(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,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})}}},I=(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));I.options.__file="ProxyUrlInput.vue";var E=I.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 N=z.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}))}}},B=(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));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:""},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:E,PruneInput:K,RateLimitInput:N,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")||":args"===this.setting.key)},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)})}}},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(" "),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: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(" "),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: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)}}()}},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: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(" "),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: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(" "),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: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)(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,jt={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"])||{}},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)}}()}},Mt=(i("KFE3"),Object(m.a)(jt,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));Mt.options.__file="Http.vue";var Tt=Mt.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(" "),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: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)}}()}},It=(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));It.options.__file="JobQueue.vue";var Et=It.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(" "),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: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)}}()}},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 Nt=zt.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(" "),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: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(" "),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:"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}},[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: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,fe={components:{ActivityPub:dt,Authentication:mt,AutoLinker:vt,Captcha:kt,Esshd:wt,Frontend:$t,Gopher:Ut,Http:Tt,Instance:Wt,JobQueue:Et,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}}))},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){},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){},y7KD:function(t,e,i){"use strict";var s=i("YKHE");i.n(s).a}}]); +//# sourceMappingURL=chunk-7e30.ec42e302.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map new file mode 100644 index 000000000..bc47158ea --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.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?2907","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?7bc9","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?4f2a","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?82b9","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/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/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","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__","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_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-7e30.ec42e302.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=411d006e&\"\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\":\"\"},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=73a4e7f2&\"\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=641b2402&\"\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=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=03c3fd9d&\"\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:\"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&\"","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!./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-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/chunk-e458.bb460d81.js b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js new file mode 100644 index 000000000..a08717166 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js @@ -0,0 +1,2 @@ +(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=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(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")},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(t){void 0===this.selectedUsers.find(function(s){return t.id===s.id})&&(this.selectedUsers=[].concat(n()(this.selectedUsers),[t]))},normalizedCount:function(t){return u()(t).format("0a")}}},d=(e("QOJ7"),e("KHd+")),h=Object(d.a)(l,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",{staticClass:"direct-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.direct"))+": "+t._s(t.normalizedCount(t.statusVisibility.direct))+"\n ")]),t._v(" "),e("el-button",{staticClass:"private-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.private"))+": "+t._s(t.normalizedCount(t.statusVisibility.private))+"\n ")]),t._v(" "),e("el-button",{staticClass:"public-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.public"))+": "+t._s(t.normalizedCount(t.statusVisibility.public))+"\n ")]),t._v(" "),e("el-button",{staticClass:"unlisted-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.unlisted"))+": "+t._s(t.normalizedCount(t.statusVisibility.unlisted))+"\n ")])],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);h.options.__file="index.vue";s.default=h.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.bb460d81.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map new file mode 100644 index 000000000..89f05fb99 --- /dev/null +++ b/priv/static/adminfe/static/js/chunk-e458.bb460d81.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/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","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","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","$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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A,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,UAA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","file":"static/js/chunk-e458.bb460d81.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&\"","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.b08eb412.js similarity index 83% rename from priv/static/adminfe/static/js/runtime.1b4f6ce0.js rename to priv/static/adminfe/static/js/runtime.b08eb412.js index 6558531ba..2a9a4e0db 100644 --- a/priv/static/adminfe/static/js/runtime.1b4f6ce0.js +++ b/priv/static/adminfe/static/js/runtime.b08eb412.js @@ -1,2 +1,2 @@ -!function(e){function n(n){for(var r,c,a=n[0],f=n[1],h=n[2],i=0,l=[];i Date: Wed, 27 May 2020 14:34:37 -0500 Subject: [PATCH 193/492] Fix minor spelling error --- lib/pleroma/emoji/pack.ex | 2 +- .../web/pleroma_api/controllers/emoji_pack_controller.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index eb7d598c6..14a5185be 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -499,7 +499,7 @@ defp download_archive(url, sha) 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/web/pleroma_api/controllers/emoji_pack_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex index 2c53dcde1..d1efdeb5d 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -106,7 +106,7 @@ def download(%{body_params: %{url: url, name: name} = params} = conn, _) 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"}) From a2f57bd82b1b495a754516231b56e53ae41c6b69 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 27 May 2020 16:27:07 -0500 Subject: [PATCH 194/492] Permit easy access to vaccum full and analyze via a mix task --- lib/mix/tasks/pleroma/database.ex | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 778de162f..c4f343f04 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -135,4 +135,30 @@ def run(["fix_likes_collections"]) do end) |> Stream.run() end + + def run(["vacuum", args]) do + start_pleroma() + + case args do + "analyze" -> + Logger.info("Runnning VACUUM ANALYZE.") + Repo.query!( + "vacuum analyze;", + [], + timeout: :infinity + ) + + "full" -> + Logger.info("Runnning VACUUM FULL. This could take a while.") + + Repo.query!( + "vacuum full;", + [], + timeout: :infinity + ) + + _ -> + Logger.error("Error: invalid vacuum argument.") + end + end end From 73ca57e4f1620ddaf167c368f48a0096b2096a96 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 27 May 2020 16:27:29 -0500 Subject: [PATCH 195/492] Make it obvious a full vacuum can take a while --- lib/mix/tasks/pleroma/database.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index c4f343f04..1fdafcc88 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -34,7 +34,7 @@ def run(["remove_embedded_objects" | args]) do ) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL") + Logger.info("Runnning VACUUM FULL. This could take a while.") Repo.query!( "vacuum full;", @@ -94,7 +94,7 @@ def run(["prune_objects" | args]) do |> Repo.delete_all(timeout: :infinity) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL") + Logger.info("Runnning VACUUM FULL. This could take a while.") Repo.query!( "vacuum full;", From 0d57e066260234fb582a63870cbae7517e7b6246 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 27 May 2020 16:31:37 -0500 Subject: [PATCH 196/492] Make clearer that this is time and resource consuming --- lib/mix/tasks/pleroma/database.ex | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 1fdafcc88..2f1f33469 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -34,7 +34,11 @@ def run(["remove_embedded_objects" | args]) do ) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL. This could take a while.") + 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;", @@ -94,7 +98,11 @@ def run(["prune_objects" | args]) do |> Repo.delete_all(timeout: :infinity) if Keyword.get(options, :vacuum) do - Logger.info("Runnning VACUUM FULL. This could take a while.") + 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;", @@ -142,6 +150,7 @@ def run(["vacuum", args]) do case args do "analyze" -> Logger.info("Runnning VACUUM ANALYZE.") + Repo.query!( "vacuum analyze;", [], @@ -149,7 +158,11 @@ def run(["vacuum", args]) do ) "full" -> - Logger.info("Runnning VACUUM FULL. This could take a while.") + 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;", From 30f96b19c1850d0dd534edbe66ce19a1c8198729 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 27 May 2020 16:40:51 -0500 Subject: [PATCH 197/492] Abstract out the database maintenance. I'd like to use this from AdminFE too. --- lib/mix/tasks/pleroma/database.ex | 52 +++---------------------------- lib/pleroma/maintenance.ex | 37 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 48 deletions(-) create mode 100644 lib/pleroma/maintenance.ex diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 2f1f33469..7049293d9 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -5,6 +5,7 @@ defmodule Mix.Tasks.Pleroma.Database do alias Pleroma.Conversation alias Pleroma.Object + alias Pleroma.Maintenance alias Pleroma.Repo alias Pleroma.User require Logger @@ -34,17 +35,7 @@ def run(["remove_embedded_objects" | args]) do ) if Keyword.get(options, :vacuum) do - 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 - ) + Maintenance.vacuum("full") end end @@ -98,17 +89,7 @@ def run(["prune_objects" | args]) do |> Repo.delete_all(timeout: :infinity) if Keyword.get(options, :vacuum) do - 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 - ) + Maintenance.vacuum("full") end end @@ -147,31 +128,6 @@ def run(["fix_likes_collections"]) do def run(["vacuum", args]) do start_pleroma() - 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 + Maintenance.vacuum(args) 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 From 92fba24c743a5d2d9ed78df7499fd3123a6ad6ac Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 27 May 2020 17:17:06 -0500 Subject: [PATCH 198/492] Alpha sort --- lib/mix/tasks/pleroma/database.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mix/tasks/pleroma/database.ex b/lib/mix/tasks/pleroma/database.ex index 7049293d9..82e2abdcb 100644 --- a/lib/mix/tasks/pleroma/database.ex +++ b/lib/mix/tasks/pleroma/database.ex @@ -4,8 +4,8 @@ defmodule Mix.Tasks.Pleroma.Database do alias Pleroma.Conversation - alias Pleroma.Object alias Pleroma.Maintenance + alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User require Logger From 800e62405855af673328278ce08e9b1c5cb0602f Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 28 May 2020 19:32:56 +0400 Subject: [PATCH 199/492] Update installation guides --- docs/installation/debian_based_en.md | 4 ++-- docs/installation/debian_based_jp.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/installation/debian_based_en.md b/docs/installation/debian_based_en.md index 62d8733f7..2c20d521a 100644 --- a/docs/installation/debian_based_en.md +++ b/docs/installation/debian_based_en.md @@ -38,8 +38,8 @@ sudo apt install git build-essential postgresql postgresql-contrib * Download and add the Erlang repository: ```shell -wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb -sudo dpkg -i /tmp/erlang-solutions_1.0_all.deb +wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb +sudo dpkg -i /tmp/erlang-solutions_2.0_all.deb ``` * Install Elixir and Erlang: diff --git a/docs/installation/debian_based_jp.md b/docs/installation/debian_based_jp.md index a3c4621d8..1e5a9be91 100644 --- a/docs/installation/debian_based_jp.md +++ b/docs/installation/debian_based_jp.md @@ -40,8 +40,8 @@ sudo apt install git build-essential postgresql postgresql-contrib * Erlangのリポジトリをダウンロードおよびインストールします。 ``` -wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb -sudo dpkg -i /tmp/erlang-solutions_1.0_all.deb +wget -P /tmp/ https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb +sudo dpkg -i /tmp/erlang-solutions_2.0_all.deb ``` * ElixirとErlangをインストールします、 From ae05792d2a825dbb7d53a7f5a079548ae8310c63 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Thu, 28 May 2020 19:41:34 +0300 Subject: [PATCH 200/492] get-packs for local generated pack --- lib/mix/tasks/pleroma/emoji.ex | 38 ++++++++++--------- test/instance_static/local_pack/files.json | 3 ++ test/instance_static/local_pack/manifest.json | 10 +++++ test/tasks/emoji_test.exs | 13 +++++++ 4 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 test/instance_static/local_pack/files.json create mode 100644 test/instance_static/local_pack/manifest.json diff --git a/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index cdffa88b2..29a5fa99c 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -15,7 +15,7 @@ def run(["ls-packs" | args]) 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 @@ def run(["get-packs" | args]) 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 @@ def run(["get-packs" | args]) 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 @@ def run(["get-packs" | args]) 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 @@ def run(["get-packs" | args]) 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,20 @@ def run(["gen-pack" | args]) 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 - ) + 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/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/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 @@ test "download pack from default manifest" 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 %{ From d4a18d44feb4ae67f6476b30fac96c0e6aa511dd Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 28 May 2020 00:49:49 -0500 Subject: [PATCH 201/492] Update default instance description --- config/config.exs | 2 +- lib/pleroma/web/api_spec/operations/instance_operation.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.exs b/config/config.exs index d15998715..3729526ea 100644 --- a/config/config.exs +++ b/config/config.exs @@ -183,7 +183,7 @@ 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", limit: 5_000, chat_limit: 5_000, 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 @@ defp instance 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, From d1ee3527ef8062c34e222a1c7084c207b80fe4db Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 28 May 2020 22:23:15 +0400 Subject: [PATCH 202/492] Move config actions to AdminAPI.ConfigController --- .../controllers/admin_api_controller.ex | 127 -- .../controllers/config_controller.ex | 150 ++ lib/pleroma/web/router.ex | 6 +- .../controllers/admin_api_controller_test.exs | 1220 ---------------- .../controllers/config_controller_test.exs | 1244 +++++++++++++++++ 5 files changed, 1397 insertions(+), 1350 deletions(-) create mode 100644 lib/pleroma/web/admin_api/controllers/config_controller.ex create mode 100644 test/web/admin_api/controllers/config_controller_test.exs diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 783203c07..52900026f 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -9,7 +9,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.Activity alias Pleroma.Config - alias Pleroma.ConfigDB alias Pleroma.MFA alias Pleroma.ModerationLog alias Pleroma.Plugs.OAuthScopesPlug @@ -24,7 +23,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do 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 @@ -38,7 +36,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do require Logger - @descriptions Pleroma.Docs.JSON.compile() @users_page_size 50 plug( @@ -105,11 +102,9 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do OAuthScopesPlug, %{scopes: ["read"], admin: true} when action in [ - :config_show, :list_log, :stats, :relay_list, - :config_descriptions, :need_reboot ] ) @@ -119,7 +114,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do %{scopes: ["write"], admin: true} when action in [ :restart, - :config_update, :resend_confirmation_email, :confirm_email, :oauth_app_create, @@ -821,105 +815,6 @@ def list_log(conn, params) 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() 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() 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() 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() do Restarter.Pleroma.restart(Config.get(:env), 50) @@ -940,28 +835,6 @@ defp configurable_from_database do 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() 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..742980976 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/config_controller.ex @@ -0,0 +1,150 @@ +# 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( + OAuthScopesPlug, + %{scopes: ["read"], admin: true} + when action in [:show, :descriptions] + ) + + plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :update) + + action_fallback(Pleroma.Web.AdminAPI.FallbackController) + + 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}) + 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 + + 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 update(conn, %{"configs" => configs}) 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, 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 not 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 + + 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/router.ex b/lib/pleroma/web/router.ex index e493a4153..b683a4ff3 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -194,9 +194,9 @@ defmodule Pleroma.Web.Router do 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) diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index ead840186..bd44ffed3 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -12,7 +12,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do alias Pleroma.Activity alias Pleroma.Config - alias Pleroma.ConfigDB alias Pleroma.HTML alias Pleroma.MFA alias Pleroma.ModerationLog @@ -1704,1175 +1703,6 @@ test "returns 403 when requested by anonymous" do 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) == - %{ - "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(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) == - %{"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 = - 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 - - @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} - ]) - - 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) @@ -3481,56 +2311,6 @@ test "it deletes the note", %{conn: conn, report_id: report_id} do 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) 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..9bc6fd91c --- /dev/null +++ b/test/web/admin_api/controllers/config_controller_test.exs @@ -0,0 +1,1244 @@ +# 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(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(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) == + %{"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 = + 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 + + @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} + ]) + + 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/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 +end From 06f20e918129b1f434783b64d59b5ae6b4b4ed51 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 28 May 2020 23:11:12 +0400 Subject: [PATCH 203/492] Add OpenApi spec to AdminAPI.ConfigController --- .../controllers/config_controller.ex | 21 ++- .../operations/admin/config_operation.ex | 142 +++++++++++++++ .../controllers/config_controller_test.exs | 164 +++++++++++------- 3 files changed, 259 insertions(+), 68 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/admin/config_operation.ex diff --git a/lib/pleroma/web/admin_api/controllers/config_controller.ex b/lib/pleroma/web/admin_api/controllers/config_controller.ex index 742980976..e221d9418 100644 --- a/lib/pleroma/web/admin_api/controllers/config_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/config_controller.ex @@ -11,23 +11,26 @@ defmodule Pleroma.Web.AdminAPI.ConfigController do @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] ) - plug(OAuthScopesPlug, %{scopes: ["write"], admin: true} when action == :update) - 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 + def show(conn, %{only_db: true}) do with :ok <- configurable_from_database() do configs = Pleroma.Repo.all(ConfigDB) render(conn, "index.json", %{configs: configs}) @@ -73,16 +76,16 @@ def show(conn, _params) do end end - def update(conn, %{"configs" => configs}) do + 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, delete: true} = params -> + ConfigDB.delete(%{group: group, key: key, subkeys: params[:subkeys]}) - %{"group" => group, "key" => key, "value" => value} -> + %{group: group, key: key, value: value} -> ConfigDB.update_or_create(%{group: group, key: key, value: value}) end) |> Enum.reject(fn {result, _} -> result == :error end) @@ -140,11 +143,11 @@ defp whitelisted_config?(group, key) do end end - defp whitelisted_config?(%{"group" => group, "key" => key}) do + defp whitelisted_config?(%{group: group, key: key}) do whitelisted_config?(group, key) end - defp whitelisted_config?(%{:group => group} = config) do + defp whitelisted_config?(%{group: group} = config) do whitelisted_config?(group, config[:key]) end end 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/test/web/admin_api/controllers/config_controller_test.exs b/test/web/admin_api/controllers/config_controller_test.exs index 9bc6fd91c..780de8d18 100644 --- a/test/web/admin_api/controllers/config_controller_test.exs +++ b/test/web/admin_api/controllers/config_controller_test.exs @@ -30,7 +30,7 @@ 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) == + assert json_response_and_validate_schema(conn, 400) == %{ "error" => "To use this endpoint you need to enable configuration from database." } @@ -40,7 +40,7 @@ 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}) + conn = get(conn, "/api/pleroma/admin/config?only_db=true") %{ "configs" => [ @@ -55,7 +55,7 @@ test "with settings only in db", %{conn: conn} do "value" => _ } ] - } = json_response(conn, 200) + } = json_response_and_validate_schema(conn, 200) assert key1 == config1.key assert key2 == config2.key @@ -67,7 +67,7 @@ test "db is added to settings that are in db", %{conn: conn} do %{"configs" => configs} = conn |> get("/api/pleroma/admin/config") - |> json_response(200) + |> json_response_and_validate_schema(200) [instance_config] = Enum.filter(configs, fn %{"group" => group, "key" => key} -> @@ -89,7 +89,7 @@ test "merged default setting with db settings", %{conn: conn} do %{"configs" => configs} = conn |> get("/api/pleroma/admin/config") - |> json_response(200) + |> json_response_and_validate_schema(200) assert length(configs) > 3 @@ -133,7 +133,7 @@ test "subkeys with full update right merge", %{conn: conn} do %{"configs" => configs} = conn |> get("/api/pleroma/admin/config") - |> json_response(200) + |> json_response_and_validate_schema(200) vals = Enum.filter(configs, fn %{"group" => group, "key" => key} -> @@ -152,9 +152,12 @@ test "subkeys with full update right merge", %{conn: conn} do end test "POST /api/pleroma/admin/config error", %{conn: conn} do - conn = post(conn, "/api/pleroma/admin/config", %{"configs" => []}) + conn = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{"configs" => []}) - assert json_response(conn, 400) == + assert json_response_and_validate_schema(conn, 400) == %{"error" => "To use this endpoint you need to enable configuration from database."} end @@ -185,7 +188,9 @@ test "create new config setting in db", %{conn: conn} do on_exit(fn -> Application.put_env(:ueberauth, Ueberauth, ueberauth) end) conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{group: ":pleroma", key: ":key1", value: "value1"}, %{ @@ -225,7 +230,7 @@ test "create new config setting in db", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -310,7 +315,9 @@ test "save configs setting without explicit key", %{conn: conn} do end) conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ group: ":quack", @@ -330,7 +337,7 @@ test "save configs setting without explicit key", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":quack", @@ -362,13 +369,15 @@ 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", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{group: config.group, key: config.key, value: [%{"tuple" => [":key3", 3]}]} ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -388,8 +397,9 @@ 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, + assert conn + |> put_req_header("content-type", "application/json") + |> post( "/api/pleroma/admin/config", %{ configs: [ @@ -397,7 +407,7 @@ test "saving config which need pleroma reboot", %{conn: conn} do ] } ) - |> json_response(200) == %{ + |> json_response_and_validate_schema(200) == %{ "configs" => [ %{ "db" => [":enabled"], @@ -412,18 +422,19 @@ test "saving config which need pleroma reboot", %{conn: conn} do configs = conn |> get("/api/pleroma/admin/config") - |> json_response(200) + |> json_response_and_validate_schema(200) assert configs["need_reboot"] capture_log(fn -> - assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} + assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == + %{} end) =~ "pleroma restarted" configs = conn |> get("/api/pleroma/admin/config") - |> json_response(200) + |> json_response_and_validate_schema(200) assert configs["need_reboot"] == false end @@ -432,8 +443,9 @@ test "update setting which need reboot, don't change reboot flag until reboot", chat = Config.get(:chat) on_exit(fn -> Config.put(:chat, chat) end) - assert post( - conn, + assert conn + |> put_req_header("content-type", "application/json") + |> post( "/api/pleroma/admin/config", %{ configs: [ @@ -441,7 +453,7 @@ test "update setting which need reboot, don't change reboot flag until reboot", ] } ) - |> json_response(200) == %{ + |> json_response_and_validate_schema(200) == %{ "configs" => [ %{ "db" => [":enabled"], @@ -453,12 +465,14 @@ test "update setting which need reboot, don't change reboot flag until reboot", "need_reboot" => true } - assert post(conn, "/api/pleroma/admin/config", %{ + 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(200) == %{ + |> json_response_and_validate_schema(200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -473,13 +487,14 @@ test "update setting which need reboot, don't change reboot flag until reboot", } capture_log(fn -> - assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == %{} + assert conn |> get("/api/pleroma/admin/restart") |> json_response(200) == + %{} end) =~ "pleroma restarted" configs = conn |> get("/api/pleroma/admin/config") - |> json_response(200) + |> json_response_and_validate_schema(200) assert configs["need_reboot"] == false end @@ -489,7 +504,9 @@ test "saving config with nested merge", %{conn: conn} do insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: [k1: 1, k2: 2])) conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ group: config.group, @@ -510,7 +527,7 @@ test "saving config with nested merge", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -537,7 +554,9 @@ test "saving config with nested merge", %{conn: conn} do test "saving special atoms", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ "configs" => [ %{ "group" => ":pleroma", @@ -554,7 +573,7 @@ test "saving special atoms", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -593,7 +612,9 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do assert Application.get_env(:logger, :backends) == [] conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ group: config.group, @@ -603,7 +624,7 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":logger", @@ -630,13 +651,15 @@ test "saving full setting if value is not keyword", %{conn: conn} do ) conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{group: config.group, key: config.key, value: "Tesla.Adapter.Httpc"} ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":tesla", @@ -664,14 +687,16 @@ test "update config setting & delete with fallback to default value", %{ ) conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/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) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -696,6 +721,7 @@ test "update config setting & delete with fallback to default value", %{ build_conn() |> assign(:user, admin) |> assign(:token, token) + |> put_req_header("content-type", "application/json") |> post("/api/pleroma/admin/config", %{ configs: [ %{group: config2.group, key: config2.key, delete: true}, @@ -707,7 +733,7 @@ test "update config setting & delete with fallback to default value", %{ ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [] } @@ -717,7 +743,9 @@ test "update config setting & delete with fallback to default value", %{ test "common config example", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ "group" => ":pleroma", @@ -741,7 +769,7 @@ test "common config example", %{conn: conn} do assert Config.get([Pleroma.Captcha.NotReal, :name]) == "Pleroma" - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -779,7 +807,9 @@ test "common config example", %{conn: conn} do test "tuples with more than two values", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ "group" => ":pleroma", @@ -843,7 +873,7 @@ test "tuples with more than two values", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -911,7 +941,9 @@ test "tuples with more than two values", %{conn: conn} do test "settings with nesting map", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ "group" => ":pleroma", @@ -940,7 +972,7 @@ test "settings with nesting map", %{conn: conn} do ] }) - assert json_response(conn, 200) == + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ @@ -974,7 +1006,9 @@ test "settings with nesting map", %{conn: conn} do test "value as map", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ "group" => ":pleroma", @@ -984,7 +1018,7 @@ test "value as map", %{conn: conn} do ] }) - assert json_response(conn, 200) == + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ @@ -999,7 +1033,9 @@ test "value as map", %{conn: conn} do test "queues key as atom", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ "group" => ":oban", @@ -1017,7 +1053,7 @@ test "queues key as atom", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":oban", @@ -1053,7 +1089,9 @@ test "delete part of settings by atom subkeys", %{conn: conn} do ) conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ group: config.group, @@ -1064,7 +1102,7 @@ test "delete part of settings by atom subkeys", %{conn: conn} do ] }) - assert json_response(conn, 200) == %{ + assert json_response_and_validate_schema(conn, 200) == %{ "configs" => [ %{ "group" => ":pleroma", @@ -1078,7 +1116,9 @@ test "delete part of settings by atom subkeys", %{conn: conn} do test "proxy tuple localhost", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ group: ":pleroma", @@ -1099,7 +1139,7 @@ test "proxy tuple localhost", %{conn: conn} do "db" => db } ] - } = json_response(conn, 200) + } = json_response_and_validate_schema(conn, 200) assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "localhost", 1234]}]} in value assert ":proxy_url" in db @@ -1107,7 +1147,9 @@ test "proxy tuple localhost", %{conn: conn} do test "proxy tuple domain", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ group: ":pleroma", @@ -1128,7 +1170,7 @@ test "proxy tuple domain", %{conn: conn} do "db" => db } ] - } = json_response(conn, 200) + } = json_response_and_validate_schema(conn, 200) assert %{"tuple" => [":proxy_url", %{"tuple" => [":socks5", "domain.com", 1234]}]} in value assert ":proxy_url" in db @@ -1136,7 +1178,9 @@ test "proxy tuple domain", %{conn: conn} do test "proxy tuple ip", %{conn: conn} do conn = - post(conn, "/api/pleroma/admin/config", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/config", %{ configs: [ %{ group: ":pleroma", @@ -1157,7 +1201,7 @@ test "proxy tuple ip", %{conn: conn} do "db" => db } ] - } = json_response(conn, 200) + } = 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 @@ -1172,7 +1216,9 @@ test "doesn't set keys not in the whitelist", %{conn: conn} do {:not_real} ]) - post(conn, "/api/pleroma/admin/config", %{ + 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"}, @@ -1200,7 +1246,7 @@ test "structure", %{conn: conn} do assign(conn, :user, admin) |> get("/api/pleroma/admin/config/descriptions") - assert [child | _others] = json_response(conn, 200) + assert [child | _others] = json_response_and_validate_schema(conn, 200) assert child["children"] assert child["key"] @@ -1222,7 +1268,7 @@ test "filters by database configuration whitelist", %{conn: conn} do assign(conn, :user, admin) |> get("/api/pleroma/admin/config/descriptions") - children = json_response(conn, 200) + children = json_response_and_validate_schema(conn, 200) assert length(children) == 4 From 394258d548d20d1bea50166bc31f8e48462080dd Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 28 May 2020 16:10:06 -0500 Subject: [PATCH 204/492] Docs: Attachement limitations in MastoAPI differences --- docs/API/differences_in_mastoapi_responses.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index e65fd5da4..434ade9a4 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. @@ -32,12 +28,20 @@ Has these additional fields under the `pleroma` object: - `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. -## 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. From 27180611dfffd064e65793f90c67dc16fff8ecc2 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 29 May 2020 12:32:48 +0300 Subject: [PATCH 205/492] HTTP Security plug: make starting csp string generation more readable --- lib/pleroma/plugs/http_security_plug.ex | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index df38d5022..2208d1d6c 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -49,17 +49,16 @@ defp headers do end end - @csp_start [ - "default-src 'none'", - "base-uri 'self'", - "frame-ancestors 'none'", - "style-src 'self' 'unsafe-inline'", - "font-src 'self'", - "manifest-src 'self'" - ] - |> Enum.join(";") - |> Kernel.<>(";") - |> List.wrap() + 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] From 9df5b1e6ae8357942ef85563eebaf583f1dbc19a Mon Sep 17 00:00:00 2001 From: kPherox Date: Tue, 26 May 2020 11:32:05 +0000 Subject: [PATCH 206/492] Don't make relay announce notification --- lib/pleroma/web/activity_pub/side_effects.ex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 7eae0c52c..60ab8733d 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -11,6 +11,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Utils def handle(object, meta \\ []) @@ -36,8 +37,10 @@ def handle(%{data: %{"type" => "Announce"}} = object, meta) do Utils.add_announce_to_object(object, announced_object) - Notification.create_notifications(object) - ActivityPub.stream_out(object) + if object.data["actor"] != Relay.relay_ap_id() do + Notification.create_notifications(object) + ActivityPub.stream_out(object) + end {:ok, object, meta} end From 228ff3760efb62d4452b3025fa9e78fed164655e Mon Sep 17 00:00:00 2001 From: kPherox Date: Wed, 27 May 2020 05:24:36 +0000 Subject: [PATCH 207/492] Use `User.is_internal_user?` instead --- lib/pleroma/web/activity_pub/side_effects.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 60ab8733d..fb6275450 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -11,7 +11,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.ActivityPub.Relay alias Pleroma.Web.ActivityPub.Utils def handle(object, meta \\ []) @@ -34,10 +33,11 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do # - 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 object.data["actor"] != Relay.relay_ap_id() do + if !User.is_internal_user?(user) do Notification.create_notifications(object) ActivityPub.stream_out(object) end From c86a88edec75223f650faa2bb442c09aa95ad694 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 29 May 2020 15:24:41 +0200 Subject: [PATCH 208/492] Streamer: Add a chat message stream. --- lib/pleroma/web/streamer/streamer.ex | 23 ++++++++++++++++++++++- lib/pleroma/web/views/streamer_view.ex | 19 +++++++++++++++++++ test/web/streamer/streamer_test.exs | 24 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index 49a400df7..331490a78 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.Streamer do alias Pleroma.Conversation.Participation alias Pleroma.Notification alias Pleroma.Object + alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Visibility @@ -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) :: @@ -200,6 +201,26 @@ defp do_stream(topic, %Notification{} = item) end) end + defp do_stream(topic, %{data: %{"type" => "ChatMessage"}} = object) + when topic in ["user", "user:pleroma_chat"] do + recipients = [object.data["actor"] | object.data["to"]] + + topics = + %{ap_id: recipients, local: true} + |> Pleroma.User.Query.build() + |> Repo.all() + |> Enum.map(fn %{id: id} = user -> {user, "#{topic}:#{id}"} end) + + Enum.each(topics, fn {user, topic} -> + Registry.dispatch(@registry, topic, fn list -> + Enum.each(list, fn {pid, _auth} -> + text = StreamerView.render("chat_update.json", object, user, recipients) + send(pid, {:text, text}) + end) + end) + end) + end + defp do_stream("user", item) do Logger.debug("Trying to push to users") diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index 237b29ded..949e2ed37 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -6,11 +6,30 @@ defmodule Pleroma.Web.StreamerView do use Pleroma.Web, :view alias Pleroma.Activity + alias Pleroma.Chat alias Pleroma.Conversation.Participation alias Pleroma.Notification alias Pleroma.User alias Pleroma.Web.MastodonAPI.NotificationView + def render("chat_update.json", object, user, recipients) do + chat = Chat.get(user.id, hd(recipients -- [user.ap_id])) + + representation = + Pleroma.Web.PleromaAPI.ChatMessageView.render( + "show.json", + %{object: object, chat: chat} + ) + + %{ + event: "pleroma:chat_update", + payload: + representation + |> Jason.encode!() + } + |> Jason.encode!() + end + def render("update.json", %Activity{} = activity, %User{} = user) do %{ event: "update", diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 115ba4703..ffbff35ca 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -9,9 +9,11 @@ defmodule Pleroma.Web.StreamerTest do 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 @@ -126,6 +128,28 @@ test "it sends notify to in the 'user:notification' stream", %{user: user, notif 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") + object = Object.normalize(create_activity, false) + Streamer.get_topic_and_add_socket("user:pleroma_chat", user) + Streamer.stream("user:pleroma_chat", object) + text = StreamerView.render("chat_update.json", object, user, [user.ap_id, other_user.ap_id]) + 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") + object = Object.normalize(create_activity, false) + Streamer.get_topic_and_add_socket("user", user) + Streamer.stream("user", object) + text = StreamerView.render("chat_update.json", object, user, [user.ap_id, other_user.ap_id]) + assert_receive {:text, ^text} + end + test "it sends chat message notifications to the 'user:notification' stream", %{user: user} do other_user = insert(:user) From 863c02b25d1c6128fab88c33d2c4c3565a6c378f Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 29 May 2020 15:44:03 +0200 Subject: [PATCH 209/492] SideEffects: Stream out chat messages. --- lib/pleroma/web/activity_pub/side_effects.ex | 2 ++ test/web/activity_pub/side_effects_test.exs | 21 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index f0f0659c2..a4de8691e 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -14,6 +14,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils + alias Pleroma.Web.Streamer def handle(object, meta \\ []) @@ -126,6 +127,7 @@ def handle(object, meta) do def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do + Streamer.stream(["user", "user:pleroma_chat"], object) actor = User.get_cached_by_ap_id(object.data["actor"]) recipient = User.get_cached_by_ap_id(hd(object.data["to"])) diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index fb4411c07..210ba6ef0 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -309,6 +309,27 @@ test "notifies the recipient" do 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) + + with_mock Pleroma.Web.Streamer, [], stream: fn _, _ -> nil end do + {:ok, _create_activity, _meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) + + object = Object.normalize(create_activity, false) + + assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], object)) + end + end + test "it creates a Chat for the local users and bumps the unread count, except for the author" do author = insert(:user, local: true) recipient = insert(:user, local: true) From 767ce8b8030562935ccd9f7c3d9ed83af0735db0 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 29 May 2020 16:02:45 +0200 Subject: [PATCH 210/492] StreamerView: Actually send Chats, not ChatMessages. --- lib/pleroma/web/pleroma_api/views/chat_view.ex | 2 +- lib/pleroma/web/views/streamer_view.ex | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index 08d5110c3..223b64987 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -14,7 +14,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do def render("show.json", %{chat: %Chat{} = chat} = opts) do recipient = User.get_cached_by_ap_id(chat.recipient) - last_message = Chat.last_message_for_chat(chat) + last_message = opts[:message] || Chat.last_message_for_chat(chat) %{ id: chat.id |> to_string(), diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index 949e2ed37..5e953d770 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -16,9 +16,9 @@ def render("chat_update.json", object, user, recipients) do chat = Chat.get(user.id, hd(recipients -- [user.ap_id])) representation = - Pleroma.Web.PleromaAPI.ChatMessageView.render( + Pleroma.Web.PleromaAPI.ChatView.render( "show.json", - %{object: object, chat: chat} + %{message: object, chat: chat} ) %{ From b08baf905b09ac49ed908eff8b43593d890612dd Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 29 May 2020 16:03:55 +0200 Subject: [PATCH 211/492] Docs: Document streaming differences --- docs/API/differences_in_mastoapi_responses.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index e65fd5da4..a9d1f2f38 100644 --- a/docs/API/differences_in_mastoapi_responses.md +++ b/docs/API/differences_in_mastoapi_responses.md @@ -226,3 +226,7 @@ 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. From 3898dd69a69d3af9793f2e1d442b409c84b319a8 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 29 May 2020 16:05:02 +0200 Subject: [PATCH 212/492] SideEffects: Ensure a chat is present before streaming something out. --- lib/pleroma/web/activity_pub/side_effects.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index a4de8691e..02296b210 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -127,7 +127,6 @@ def handle(object, meta) do def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do with {:ok, object, meta} <- Pipeline.common_pipeline(object, meta) do - Streamer.stream(["user", "user:pleroma_chat"], object) actor = User.get_cached_by_ap_id(object.data["actor"]) recipient = User.get_cached_by_ap_id(hd(object.data["to"])) @@ -142,6 +141,7 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do end end) + Streamer.stream(["user", "user:pleroma_chat"], object) {:ok, object, meta} end end From 32431ad1ee88d260b720fab05fce76eb75bfe107 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 29 May 2020 16:07:40 +0200 Subject: [PATCH 213/492] Docs: Also add the streaming docs to the Chat api doc. --- docs/API/chats.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/API/chats.md b/docs/API/chats.md index 2e415e4da..2eca5adf6 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -220,3 +220,7 @@ There's a new `pleroma:chat_mention` notification, which has this form: "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. From b3b367b894d1605202625310e7d8b1ed6ed5eb13 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 7 May 2020 21:52:45 +0200 Subject: [PATCH 214/492] Bugfix: Reuse Controller.Helper pagination for APC2S --- .../activity_pub/activity_pub_controller.ex | 3 ++ .../web/activity_pub/views/user_view.ex | 34 +++++-------- lib/pleroma/web/controller_helper.ex | 48 +++++++++++------- .../controllers/timeline_controller.ex | 4 +- .../activity_pub_controller_test.exs | 50 ++++++++++++++++++- .../web/activity_pub/views/user_view_test.exs | 31 ------------ 6 files changed, 94 insertions(+), 76 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 28727d619..b624d4255 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -21,6 +21,7 @@ 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 @@ -251,6 +252,7 @@ def outbox( |> put_view(UserView) |> render("activity_collection_page.json", %{ activities: activities, + pagination: ControllerHelper.get_pagination_fields(conn, activities, %{"limit" => "10"}), iri: "#{user.ap_id}/outbox" }) end @@ -368,6 +370,7 @@ def read_inbox( |> put_view(UserView) |> render("activity_collection_page.json", %{ activities: activities, + pagination: ControllerHelper.get_pagination_fields(conn, activities, %{"limit" => "10"}), iri: "#{user.ap_id}/inbox" }) 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 @@ def render("activity_collection.json", %{iri: iri}) 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/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 5a1316a5f..2d35bb56c 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,6 +48,16 @@ def add_link_headers(%{assigns: %{skip_link_headers: true}} = conn, _activities, 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 + + def get_pagination_fields(conn, activities, extra_params \\ %{}) do case List.last(activities) do %{id: max_id} -> params = @@ -54,29 +66,29 @@ def add_link_headers(conn, activities, extra_params) do |> 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 + activities + |> List.first() + |> Map.get(:id) - next_url = current_url(conn, Map.merge(params, %{max_id: max_id})) - prev_url = current_url(conn, Map.merge(params, %{min_id: min_id})) + fields = %{ + "next" => current_url(conn, Map.put(params, :max_id, max_id)), + "prev" => current_url(conn, Map.put(params, :min_id, min_id)) + } - put_resp_header(conn, "link", "<#{next_url}>; rel=\"next\", <#{prev_url}>; rel=\"prev\"") + # Generating an `id` without already present pagination keys would + # need a query-restriction with an `q.id >= ^id` or `q.id <= ^id` + # instead of the `q.id > ^min_id` and `q.id < ^max_id`. + # This is because we only have ids present inside of the page, while + # `min_id`, `since_id` and `max_id` requires to know one outside of it. + if Map.take(conn.params, Pagination.page_keys() -- ["limit", "order"]) != [] do + Map.put(fields, "id", current_url(conn, conn.params)) + else + fields + end _ -> - conn + %{} end end diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 958567510..c852082a5 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -51,10 +51,8 @@ def home(%{assigns: %{user: user}} = conn, params) do |> Map.put("reply_filtering_user", user) |> Map.put("user", user) - recipients = [user.ap_id | User.following(user)] - activities = - recipients + [user.ap_id | User.following(user)] |> ActivityPub.fetch_activities(params) |> Enum.reverse() diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 24edab41a..3f48553c9 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -804,17 +804,63 @@ test "it requires authentication", %{conn: conn} 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..15 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"]) == 10 + assert length(result_ids) == 10 + 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/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 @@ test "sets correct totalItems when follows are hidden but the follow counter is 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 From 2c18830d0dbd7f63cd20dcf5167254fede538930 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 8 May 2020 03:08:11 +0200 Subject: [PATCH 215/492] Bugfix: router: allow basic_auth for outbox --- lib/pleroma/web/router.ex | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index e493a4153..d65af23d9 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -571,13 +571,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 +595,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) From a43b435c0ad8a1198241fbd18e1a5f1be830f4b5 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 8 May 2020 03:05:56 +0200 Subject: [PATCH 216/492] AP C2S: allow limit & order on outbox & read_inbox --- .../activity_pub/activity_pub_controller.ex | 45 +++++++++---------- lib/pleroma/web/controller_helper.ex | 2 +- .../activity_pub_controller_test.exs | 6 +-- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index b624d4255..5b8441384 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -231,28 +231,22 @@ def outbox( 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) + + 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, %{"limit" => "10"}), + pagination: ControllerHelper.get_pagination_fields(conn, activities), iri: "#{user.ap_id}/outbox" }) end @@ -355,22 +349,23 @@ def read_inbox( %{"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) + 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, %{"limit" => "10"}), + pagination: ControllerHelper.get_pagination_fields(conn, activities), iri: "#{user.ap_id}/inbox" }) end diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 2d35bb56c..9e5444817 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -63,8 +63,8 @@ def get_pagination_fields(conn, activities, extra_params \\ %{}) do params = conn.params |> Map.drop(Map.keys(conn.path_params)) - |> Map.drop(["since_id", "max_id", "min_id"]) |> Map.merge(extra_params) + |> Map.drop(Pagination.page_keys() -- ["limit", "order"]) min_id = activities diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 3f48553c9..e490a5744 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -810,7 +810,7 @@ test "it paginates correctly", %{conn: conn} do outbox_endpoint = user.ap_id <> "/outbox" _posts = - for i <- 0..15 do + for i <- 0..25 do {:ok, activity} = CommonAPI.post(user, %{status: "post #{i}"}) activity end @@ -822,8 +822,8 @@ test "it paginates correctly", %{conn: conn} do |> json_response(200) result_ids = Enum.map(result["orderedItems"], fn x -> x["id"] end) - assert length(result["orderedItems"]) == 10 - assert length(result_ids) == 10 + assert length(result["orderedItems"]) == 20 + assert length(result_ids) == 20 assert result["next"] assert String.starts_with?(result["next"], outbox_endpoint) From 1b586ff3aece21d277e40f95cc5c60fc15818a87 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 29 May 2020 10:17:06 -0500 Subject: [PATCH 217/492] Document new database vacuum tasks --- docs/administration/CLI_tasks/database.md | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) 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 From da1e31fae3f7a7e0063c3a6fb4315e1578d72daa Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 29 May 2020 17:17:02 +0200 Subject: [PATCH 218/492] http_security_plug.ex: Fix non-proxied media --- lib/pleroma/plugs/http_security_plug.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 2208d1d6c..4b926e867 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -75,7 +75,7 @@ defp csp_string do sources = get_proxy_and_attachment_sources() {[img_src, sources], [media_src, sources]} else - {img_src, media_src} + {img_src <> " https:", media_src <> " https:"} end connect_src = ["connect-src 'self' ", static_url, ?\s, websocket_url] From de0e2628391ca039ac0d029c251136d53b6f8e63 Mon Sep 17 00:00:00 2001 From: kPherox Date: Mon, 25 May 2020 23:21:43 +0900 Subject: [PATCH 219/492] Fix argument error in streamer `Repo.exists` can't use `nil` as it is unsafe. Use parent object instead of activity because currently Announce activity's context is null. --- lib/pleroma/web/streamer/streamer.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index 49a400df7..0cf41189b 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -136,7 +136,7 @@ def filtered_by_user?(%User{} = user, %Activity{} = item) 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 From 9ca978494fee4be96ec9b6b93e74afe08dd05fcc Mon Sep 17 00:00:00 2001 From: kPherox Date: Fri, 29 May 2020 21:08:09 +0900 Subject: [PATCH 220/492] Add test for stream boosts of mastodon user --- test/web/streamer/streamer_test.exs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index cb4595bb6..4cf640ce8 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -112,6 +112,25 @@ test "it streams boosts of the user in the 'user' stream", %{user: user} do refute 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) + end + test "it sends notify to in the 'user' stream", %{user: user, notify: notify} do Streamer.get_topic_and_add_socket("user", user) Streamer.stream("user", notify) From d38f28870e7ba1c8c1b315d52e68a83fb1a68b6d Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 29 May 2020 10:33:31 -0500 Subject: [PATCH 221/492] Add blob: to connect-src CSP --- CHANGELOG.md | 1 + lib/pleroma/plugs/http_security_plug.ex | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dabc2a85a..839bf90ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ 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 ## [Unreleased (patch)] diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 2208d1d6c..41e3a31f4 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -78,7 +78,7 @@ defp csp_string do {img_src, media_src} end - connect_src = ["connect-src 'self' ", static_url, ?\s, websocket_url] + connect_src = ["connect-src 'self' blob: ", static_url, ?\s, websocket_url] connect_src = if Pleroma.Config.get(:env) == :dev do From d67b302810c53d92ace7c347c77eecc10be6bcd6 Mon Sep 17 00:00:00 2001 From: stwf Date: Tue, 12 May 2020 11:08:00 -0400 Subject: [PATCH 222/492] preload data into index.html --- config/config.exs | 25 ++-- .../web/fallback_redirect_controller.ex | 82 +++++++---- lib/pleroma/web/nodeinfo/nodeinfo.ex | 130 ++++++++++++++++++ .../web/nodeinfo/nodeinfo_controller.ex | 112 ++------------- lib/pleroma/web/preload.ex | 30 ++++ lib/pleroma/web/preload/instance.ex | 49 +++++++ lib/pleroma/web/preload/provider.ex | 7 + lib/pleroma/web/preload/timelines.ex | 42 ++++++ lib/pleroma/web/preload/user.ex | 25 ++++ lib/pleroma/web/router.ex | 2 +- test/plugs/instance_static_test.exs | 2 +- test/web/fallback_test.exs | 38 +++-- test/web/preload/instance_test.exs | 37 +++++ test/web/preload/timeline_test.exs | 74 ++++++++++ test/web/preload/user_test.exs | 33 +++++ 15 files changed, 532 insertions(+), 156 deletions(-) create mode 100644 lib/pleroma/web/nodeinfo/nodeinfo.ex create mode 100644 lib/pleroma/web/preload.ex create mode 100644 lib/pleroma/web/preload/instance.ex create mode 100644 lib/pleroma/web/preload/provider.ex create mode 100644 lib/pleroma/web/preload/timelines.ex create mode 100644 lib/pleroma/web/preload/user.ex create mode 100644 test/web/preload/instance_test.exs create mode 100644 test/web/preload/timeline_test.exs create mode 100644 test/web/preload/user_test.exs diff --git a/config/config.exs b/config/config.exs index d15998715..1539b15c6 100644 --- a/config/config.exs +++ b/config/config.exs @@ -240,18 +240,7 @@ account_field_value_length: 2048, external_user_synchronization: true, extended_nickname_format: true, - cleanup_attachments: false, - multi_factor_authentication: [ - totp: [ - # digits 6 or 8 - digits: 6, - period: 30 - ], - backup_codes: [ - number: 5, - length: 16 - ] - ] + cleanup_attachments: false config :pleroma, :feed, post_title: %{ @@ -360,8 +349,7 @@ reject: [], accept: [], avatar_removal: [], - banner_removal: [], - reject_deletes: [] + banner_removal: [] config :pleroma, :mrf_keyword, reject: [], @@ -427,6 +415,13 @@ ], unfurl_nsfw: false +config :pleroma, Pleroma.Web.Preload, + providers: [ + Pleroma.Web.Preload.Providers.Instance, + Pleroma.Web.Preload.Providers.User, + Pleroma.Web.Preload.Providers.Timelines + ] + config :pleroma, :http_security, enabled: true, sts: false, @@ -681,8 +676,6 @@ profiles: %{local: false, remote: false}, activities: %{local: false, remote: false} -config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false - # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex index 0d9d578fc..932fb8d7e 100644 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ b/lib/pleroma/web/fallback_redirect_controller.ex @@ -4,11 +4,10 @@ defmodule Fallback.RedirectController do use Pleroma.Web, :controller - require Logger - alias Pleroma.User alias Pleroma.Web.Metadata + alias Pleroma.Web.Preload def api_not_implemented(conn, _params) do conn @@ -16,16 +15,7 @@ def api_not_implemented(conn, _params) 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 +33,34 @@ def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} 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__) - ) + tags = build_tags(conn, params) + preloads = preload_data(conn, params) - "" - end - - response = String.replace(index_content, "", tags) + response = + index_content + |> String.replace("", tags) + |> String.replace("", 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 +72,36 @@ def empty(conn, _params) 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/nodeinfo/nodeinfo.ex b/lib/pleroma/web/nodeinfo/nodeinfo.ex new file mode 100644 index 000000000..d26b7c938 --- /dev/null +++ b/lib/pleroma/web/nodeinfo/nodeinfo.ex @@ -0,0 +1,130 @@ +# 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.ActivityPub.MRF + alias Pleroma.Web.Federator.Publisher + + # 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() + + quarantined = Config.get([:instance, :quarantined_instances], []) + + staff_accounts = + User.all_superusers() + |> Enum.map(fn u -> u.ap_id end) + + federation_response = + if Config.get([:instance, :mrf_transparency]) do + {:ok, data} = MRF.describe() + + data + |> Map.merge(%{quarantined_instances: quarantined}) + else + %{} + end + |> Map.put(:enabled, Config.get([:instance, :federating])) + + features = + [ + "pleroma_api", + "mastodon_api", + "mastodon_api_streaming", + "polls", + "pleroma_explicit_addressing", + "shareable_emoji_packs", + "multifetch", + "pleroma:api/v1/notifications:include_types_filter", + if Config.get([:media_proxy, :enabled]) do + "media_proxy" + end, + if Config.get([:gopher, :enabled]) do + "gopher" + end, + if Config.get([:chat, :enabled]) do + "chat" + end, + if Config.get([:instance, :allow_relay]) do + "relay" + end, + if Config.get([:instance, :safe_dm_mentions]) do + "safe_dm_mentions" + end, + "pleroma_emoji_reactions" + ] + |> Enum.filter(& &1) + + %{ + 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_response, + 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 @@ def schemas(conn, _params) 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" => version}) do + case Nodeinfo.get_nodeinfo(version) do + {:error, :missing} -> + render_error(conn, :not_found, "Nodeinfo schema version not handled") - 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") + 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/preload.ex b/lib/pleroma/web/preload.ex new file mode 100644 index 000000000..c2211c597 --- /dev/null +++ b/lib/pleroma/web/preload.ex @@ -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.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 -> + Map.merge(acc, parser.generate_terms(params)) + 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..0b6fd3313 --- /dev/null +++ b/lib/pleroma/web/preload/instance.ex @@ -0,0 +1,49 @@ +# 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.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" + + @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 = Path.join(:code.priv_dir(:pleroma), "static/instance/panel.html") + + 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/timelines.ex b/lib/pleroma/web/preload/timelines.ex new file mode 100644 index 000000000..dbd7db407 --- /dev/null +++ b/lib/pleroma/web/preload/timelines.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.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(%{}) + end + + def build_public_tag(acc) do + if Pleroma.Config.get([:restrict_unauthenticated, :timelines, :federated], true) do + acc + else + Map.put(acc, @public_url, public_timeline(nil)) + end + end + + defp public_timeline(user) do + activities = + create_timeline_params(user) + |> Map.put("local_only", false) + |> ActivityPub.fetch_public_activities() + + StatusView.render("index.json", activities: activities, for: user, as: :activity) + end + + defp create_timeline_params(user) do + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + end +end diff --git a/lib/pleroma/web/preload/user.ex b/lib/pleroma/web/preload/user.ex new file mode 100644 index 000000000..3a244845b --- /dev/null +++ b/lib/pleroma/web/preload/user.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.User do + alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.Preload.Providers.Provider + + @behaviour Provider + @account_url :"/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, nil), do: acc + + def build_accounts_tag(acc, user) do + account_data = AccountView.render("show.json", %{user: user, for: user}) + Map.put(acc, @account_url, account_data) + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index e493a4153..a1ef2633d 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -716,7 +716,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/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/web/fallback_test.exs b/test/web/fallback_test.exs index 3919ef93a..3b7a51d5e 100644 --- a/test/web/fallback_test.exs +++ b/test/web/fallback_test.exs @@ -6,22 +6,36 @@ 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) =~ "" + assert html_response(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) =~ "" - refute conn - |> get("/" <> user.nickname) - |> html_response(200) =~ "" + assert html_response(user_missing, 200) =~ "" + refute html_response(user_present, 200) =~ "" + end + end + + describe "preloaded data only attached to" do + test "GET /*path", %{conn: conn} do + public_page = get(conn, "/main/public") + + assert html_response(public_page, 200) =~ "" + refute html_response(public_page, 200) =~ "" + end end test "GET /api*path", %{conn: conn} do diff --git a/test/web/preload/instance_test.exs b/test/web/preload/instance_test.exs new file mode 100644 index 000000000..52f9bab3b --- /dev/null +++ b/test/web/preload/instance_test.exs @@ -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.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, "A Pleroma instance, an alternative fediverse server") + end + + test "it renders the panel", %{"/instance/panel.html": panel} do + assert String.contains?( + panel, + "

Welcome to Pleroma!

" + ) + end + + test "it renders the node_info", %{"/nodeinfo/2.0": 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/timeline_test.exs b/test/web/preload/timeline_test.exs new file mode 100644 index 000000000..00b10d0ab --- /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..99232cdfa --- /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 + refute User.generate_terms(%{user: nil}) + |> Map.has_key?("/api/v1/accounts") + end + + test "missing user specified" do + refute User.generate_terms(%{user: :not_a_user}) + |> Map.has_key?("/api/v1/accounts") + end + end + + describe "specified user exists" do + setup do + user = insert(:user) + + {:ok, User.generate_terms(%{user: user})} + end + + test "account is rendered", %{"/api/v1/accounts": accounts} do + assert %{acct: user, username: user} = accounts + end + end +end From c181e555db4a90f770418af67b1073ec958adb4d Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Fri, 29 May 2020 22:03:14 +0300 Subject: [PATCH 223/492] [#1794] Improvements to hashtags extraction from search query. --- .../controllers/search_controller.ex | 40 ++++++++++++++----- .../controllers/search_controller_test.exs | 36 ++++++++++++++++- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 77e2224e4..23fe378a6 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -113,22 +113,44 @@ defp resource_search(:v2, "hashtags", query, _options) do query |> prepare_tags() |> 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) + prepare_tags(query) end - defp prepare_tags(query) do - query - |> String.split() - |> Enum.uniq() - |> Enum.filter(fn tag -> String.starts_with?(tag, "#") end) + defp prepare_tags(query, add_joined_tag \\ true) do + tags = + query + |> String.split(~r/[^#\w]+/, 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) + + if Enum.empty?(explicit_tags) && add_joined_tag do + tags + |> Kernel.++([joined_tag(tags)]) + |> Enum.uniq_by(&String.downcase/1) + else + tags + 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/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 7d0cafccc..498290377 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -75,6 +75,40 @@ test "search", %{conn: conn} do 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"} + ] + 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 +213,7 @@ test "search", %{conn: conn} 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) From 0a83af330b7f33601848bca79bd1651b45eaea87 Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Fri, 29 May 2020 23:05:03 +0300 Subject: [PATCH 224/492] fix unused var warning --- test/web/streamer/streamer_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 4cf640ce8..3f012259a 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -124,7 +124,7 @@ test "it streams boosts of mastodon user in the 'user' stream", %{user: user} do |> Map.put("object", activity.data["object"]) |> Map.put("actor", user.ap_id) - {:ok, %Pleroma.Activity{data: data, local: false} = announce} = + {: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} From 109af93227f65d308641e345c68c3884addb0181 Mon Sep 17 00:00:00 2001 From: rinpatch Date: Fri, 29 May 2020 21:15:07 +0000 Subject: [PATCH 225/492] Apply suggestion to lib/pleroma/plugs/http_security_plug.ex --- lib/pleroma/plugs/http_security_plug.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 4b926e867..589072535 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -75,7 +75,7 @@ defp csp_string do sources = get_proxy_and_attachment_sources() {[img_src, sources], [media_src, sources]} else - {img_src <> " https:", media_src <> " https:"} + {[img_src, " https:"], [media_src, " https:"]} end connect_src = ["connect-src 'self' ", static_url, ?\s, websocket_url] From d2a1975e565e2e83859a607af29320226877cc4d Mon Sep 17 00:00:00 2001 From: rinpatch Date: Sat, 30 May 2020 00:18:17 +0300 Subject: [PATCH 226/492] mix.lock: update hackney to 1.16.0 Closes #1612 --- mix.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mix.lock b/mix.lock index 470b401a3..5383c2c6e 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"}, @@ -50,12 +50,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"}, @@ -102,7 +102,7 @@ "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"}, "syslog": {:hex, :syslog, "1.1.0", "6419a232bea84f07b56dc575225007ffe34d9fdc91abe6f1b2f254fd71d8efc2", [:rebar3], [], "hexpm", "4c6a41373c7e20587be33ef841d3de6f3beba08519809329ecc4d27b15b659e1"}, @@ -112,7 +112,7 @@ "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"}, "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", []}, From 24f40b8a26f95ee7f50b6023176d361660ceb35c Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Sat, 30 May 2020 10:29:08 +0300 Subject: [PATCH 227/492] [#1794] Fixed search query splitting regex to deal with Unicode. Adjusted a test. --- lib/pleroma/web/mastodon_api/controllers/search_controller.ex | 2 +- test/web/mastodon_api/controllers/search_controller_test.exs | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 23fe378a6..8840fc19c 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -124,7 +124,7 @@ defp resource_search(:v1, "hashtags", query, _options) do defp prepare_tags(query, add_joined_tag \\ true) do tags = query - |> String.split(~r/[^#\w]+/, trim: true) + |> 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) diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 498290377..84d46895e 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -71,6 +71,10 @@ test "search", %{conn: conn} 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 From 6d4b80822b15f5958518f4c6006862fb1f92354a Mon Sep 17 00:00:00 2001 From: Steven Fuchs Date: Sat, 30 May 2020 10:02:37 +0000 Subject: [PATCH 228/492] Conversation pagination --- .../controllers/conversation_controller.ex | 17 ++ .../conversation_controller_test.exs | 165 +++++++++--------- 2 files changed, 100 insertions(+), 82 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex b/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex index f35ec3596..69f0e3846 100644 --- a/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex @@ -21,6 +21,7 @@ defmodule Pleroma.Web.MastodonAPI.ConversationController do @doc "GET /api/v1/conversations" def index(%{assigns: %{user: user}} = conn, params) do + params = stringify_pagination_params(params) participations = Participation.for_user_with_last_activity_id(user, params) conn @@ -36,4 +37,20 @@ def mark_as_read(%{assigns: %{user: user}} = conn, %{id: participation_id}) do render(conn, "participation.json", participation: participation, for: user) end end + + defp stringify_pagination_params(params) do + atom_keys = + Pleroma.Pagination.page_keys() + |> Enum.map(&String.to_atom(&1)) + + str_keys = + params + |> Map.take(atom_keys) + |> Enum.map(fn {key, value} -> {to_string(key), value} end) + |> Enum.into(%{}) + + params + |> Map.delete(atom_keys) + |> Map.merge(str_keys) + end end 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) + 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_two} = User.follow(user_two, user_one) - assert User.get_cached_by_id(user_two.id).unread_conversation_count == 0 + {:ok, %{user: user_one, user_two: user_two, user_three: user_three, conn: conn}} + end - {:ok, direct} = - CommonAPI.post(user_one, %{ - status: "Hi @#{user_two.nickname}, @#{user_three.nickname}!", - visibility: "direct" - }) + 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 + 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" - }) + {:ok, _follower_only} = + CommonAPI.post(user_one, %{ + status: "Hi @#{user_two.nickname}!", + visibility: "private" + }) - res_conn = get(conn, "/api/v1/conversations") + res_conn = get(conn, "/api/v1/conversations") - assert response = json_response_and_validate_schema(res_conn, 200) + 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 + 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 + 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 @@ test "filters conversations by recipients", %{user: user_one, conn: conn} 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 @@ test "updates the last_status on reply", %{user: user_one, conn: conn} 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 @@ test "the user marks a conversation as read", %{user: user_one, conn: conn} 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 From 2c9465cc51160546ae054d1a1912fbb8e9add8e8 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 30 May 2020 12:17:18 +0200 Subject: [PATCH 229/492] SafeText: Let through basic html. --- .../object_validators/types/safe_text.ex | 2 +- test/web/activity_pub/object_validator_test.exs | 14 ++++++++++++++ .../object_validators/types/safe_text_test.exs | 7 +++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex b/lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex index 822e8d2c1..95c948123 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex +++ b/lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex @@ -10,7 +10,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.SafeText do def type, do: :string def cast(str) when is_binary(str) do - {:ok, HTML.strip_tags(str)} + {:ok, HTML.filter_tags(str)} end def cast(_), do: :error diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 929fdbc9b..31224abe0 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -113,6 +113,20 @@ test "it is invalid if the object data has a different `to` or `actor` field" do %{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, []) 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 index 59ed0a1fe..d4a574554 100644 --- a/test/web/activity_pub/object_validators/types/safe_text_test.exs +++ b/test/web/activity_pub/object_validators/types/safe_text_test.exs @@ -17,6 +17,13 @@ test "it removes html tags from text" do 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 From 8bdf18d7c10f0e740b2f5e0fa5063c522b8b3872 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 30 May 2020 12:30:31 +0200 Subject: [PATCH 230/492] CommonAPI: Linkify chat messages. --- lib/pleroma/web/common_api/common_api.ex | 7 ++++++- test/web/common_api/common_api_test.exs | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 764fa4f4f..173353aa5 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -50,7 +50,12 @@ def post_chat_message(%User{} = user, %User{} = recipient, content, opts \\ []) defp format_chat_content(nil), do: nil defp format_chat_content(content) do - content |> Formatter.html_escape("text/plain") + {text, _, _} = + content + |> Formatter.html_escape("text/plain") + |> Formatter.linkify() + + text end defp validate_chat_content_length(_, true), do: :ok diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 9e129e5a7..41c6909de 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -50,6 +50,29 @@ test "it posts a chat message without content but with an attachment" do assert activity 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) From 0cb7b0ea8477bdd7af2e5e9071843be5b8623dff Mon Sep 17 00:00:00 2001 From: rinpatch Date: Sat, 30 May 2020 13:59:04 +0300 Subject: [PATCH 231/492] hackney adapter helper: support tlsv1.3 and remove custom opts - partitial_chain is no longer exported, but it seems to be the default anyway. - The bug that caused sni to not be sent automatically seems to be fixed - https://github.com/benoitc/hackney/issues/612 --- lib/pleroma/http/adapter_helper/hackney.ex | 17 +---------------- test/http/adapter_helper/hackney_test.exs | 12 ------------ 2 files changed, 1 insertion(+), 28 deletions(-) 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 @@ def options(connection_opts \\ [], %URI{} = uri) 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/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 @@ test "respect connection opts and no proxy", %{uri: uri} 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 From b973d0b2f0809e7a96c39f6eef1d86050c9d421b Mon Sep 17 00:00:00 2001 From: Roman Chvanikov Date: Sat, 30 May 2020 16:47:09 +0300 Subject: [PATCH 232/492] Fix config setting to not affect other tests --- test/user_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/user_test.exs b/test/user_test.exs index 3556ef1b4..6b344158d 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1802,7 +1802,7 @@ test "avatar fallback" do user = insert(:user) assert User.avatar_url(user) =~ "/images/avi.png" - Pleroma.Config.put([:assets, :default_user_avatar], "avatar.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" From 9460983032257022ff29c063901f6b714e4fbf59 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 1 Jun 2020 13:03:22 +0200 Subject: [PATCH 233/492] AccountController: Federate user account changes. Hotfixy commit, will be moved to the pipeline. --- .../controllers/account_controller.ex | 23 +++++++++-- .../update_credentials_test.exs | 38 +++++++++++-------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 47649d41d..97295a52f 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -139,9 +139,7 @@ def verify_credentials(%{assigns: %{user: user}} = conn, _) 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) @@ -183,12 +181,31 @@ def update_credentials(%{assigns: %{user: original_user}, body_params: params} = changeset = User.update_changeset(user, user_params) with {:ok, user} <- User.update_and_set_cache(changeset) do + user + |> build_update_activity_params() + |> ActivityPub.update() + render(conn, "show.json", user: user, for: user, with_pleroma_settings: true) else _e -> render_error(conn, :forbidden, "Invalid request") end end + # Hotfix, handling will be redone with the pipeline + defp build_update_activity_params(user) do + object = + Pleroma.Web.ActivityPub.UserView.render("user.json", user: user) + |> Map.delete("@context") + + %{ + local: true, + to: [user.follower_address], + cc: [], + object: object, + actor: user.ap_id + } + 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), 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..7c420985d 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,24 +53,31 @@ test "sets user settings in a generic way", %{conn: conn} 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 From d4d4b92f758979fbc22cd56a9f30435df5c40ab6 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 1 Jun 2020 13:17:56 +0200 Subject: [PATCH 234/492] TimelineController: Only return `Create` in public timelines. --- .../mastodon_api/controllers/timeline_controller.ex | 2 +- .../controllers/timeline_controller_test.exs | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 958567510..f67f75430 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -111,7 +111,7 @@ def public(%{assigns: %{user: user}} = conn, params) do else activities = params - |> Map.put("type", ["Create", "Announce"]) + |> Map.put("type", ["Create"]) |> Map.put("local_only", local_only) |> Map.put("blocking_user", user) |> Map.put("muting_user", user) diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 2375ac8e8..65b4079fe 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 @@ test "the home timeline when the direct messages are excluded", %{user: user, co 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 @@ test "the public timeline", %{conn: conn} 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 From ac31f687c0fbe06251257acb72b67146b472d22f Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 1 Jun 2020 13:35:39 +0200 Subject: [PATCH 235/492] Config: Default to Hackney again Gun needs some server setting changes (files) and has problems with OTP 23 (wildcards), so use Hackney as a default again for now. --- config/config.exs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/config.exs b/config/config.exs index d15998715..9a9fbb436 100644 --- a/config/config.exs +++ b/config/config.exs @@ -171,7 +171,8 @@ "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, From af9090238e1f71e6b081fbd09c09a5975d2ed99e Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 1 Jun 2020 15:14:22 +0200 Subject: [PATCH 236/492] CommonAPI: Newlines -> br for chat messages. --- lib/pleroma/web/common_api/common_api.ex | 3 +++ test/web/common_api/common_api_test.exs | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 173353aa5..e0987b1a7 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -54,6 +54,9 @@ defp format_chat_content(content) do content |> Formatter.html_escape("text/plain") |> Formatter.linkify() + |> (fn {text, mentions, tags} -> + {String.replace(text, ~r/\r?\n/, "
"), mentions, tags} + end).() text end diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 41c6909de..611a9ae66 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -50,6 +50,26 @@ test "it posts a chat message without content but with an attachment" do assert activity 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) From 7e6ec778d965419ed4083428d4d39b2a689f7619 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Wed, 20 May 2020 17:45:06 +0300 Subject: [PATCH 237/492] exclude replies on blocked domains --- benchmarks/load_testing/activities.ex | 365 ++++++++++-------- benchmarks/load_testing/fetcher.ex | 71 ++++ benchmarks/load_testing/users.ex | 22 +- .../mix/tasks/pleroma/benchmarks/tags.ex | 38 +- lib/pleroma/web/activity_pub/activity_pub.ex | 27 ++ .../api_spec/operations/timeline_operation.ex | 7 + .../controllers/timeline_controller.ex | 13 +- ...ients_contain_blocked_domains_function.exs | 33 ++ .../controllers/timeline_controller_test.exs | 68 ++++ 9 files changed, 469 insertions(+), 175 deletions(-) create mode 100644 priv/repo/migrations/20200520155351_add_recipients_contain_blocked_domains_function.exs 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 @@ def generate(user, opts \\ []) 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 @@ def generate(user, opts \\ []) 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 @@ def generate_tagged_activities(opts \\ []) 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 @@ defp generate_long_thread(visibility, user, friends, non_friends, _opts) 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 @@ defp generate_activities(user, friends, non_friends, task_data, opts) 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 - - {:ok, _activity} = - group - |> get_actor(user, friends, non_friends) - |> CommonAPI.post(%{ - status: Enum.join(user_mentions, ", ") <> " simple status with mentions", - visibility: visibility - }) + if Enum.random([true, false]), + do: ["@" <> users[:user].nickname | user_mentions], + else: user_mentions 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 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 - - {:ok, _activity} = - group - |> get_actor(user, friends, non_friends) - |> CommonAPI.post(%{ - status: mentions <> " hell thread status", - visibility: visibility - }) + Cachex.put(:user_cache, "hell_thread_mentions", cached) + cached + else + {:ok, cached} -> cached + end end - defp insert_activity("attachment", visibility, group, user, friends, non_friends, _opts) do - actor = get_actor(group, user, friends, non_friends) + defp insert_activity(:simple, visibility, group, users, _opts) + when group in @remote_groups do + insert_remote_activity(visibility, group, users, "Remote status") + end + + defp insert_activity(:simple, visibility, group, users, _opts) do + insert_local_activity(visibility, group, users, "Simple status") + end + + 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, users, _opts) do + actor = get_actor(group, users) obj_data = %{ "actor" => actor.ap_id, @@ -268,67 +306,54 @@ defp insert_activity("attachment", visibility, group, user, friends, non_friends }) 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 @@ defp insert_activity("simple_thread", "direct", group, user, friends, non_friend 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(:simple_thread, visibility, group, users, _opts) do + actor = get_actor(group, users) + tasks = get_reply_tasks(visibility, group) - 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) + {:ok, activity} = + CommonAPI.post(users[:user], %{status: "Simple status", visibility: visibility}) - 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) - - {act_data, obj_data} = prepare_activity_data(actor, visibility, user) - {activity_data, object_data} = other_data(actor) - - 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 @@ defp other_data(actor) do "attributedTo" => actor.ap_id, "bcc" => [], "bto" => [], - "content" => "Remote post", + "content" => content, "context" => context_id, "conversation" => context_id, "emoji" => %{}, @@ -475,51 +490,65 @@ defp prepare_activity_data(_actor, "direct", mention) 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(visibility, "user") when visibility in ["unlisted", "private"], - do: ~w(friend user friend) + 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, "friends") when visibility in ["unlisted", "private"], - do: ~w(user friend user) + 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, "non_friends") when visibility in ["unlisted", "private"], - do: [] + 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("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 @friends_groups do + [:user, :friends_remote, :friends_local, :user] + end - defp insert_replies(tasks, visibility, user, friends, non_friends, acc) do + defp get_reply_tasks(visibility, group) + when visibility in ["unlisted", "private"] and + group in @non_friends_groups, + do: [] + + defp get_reply_tasks("direct", :user), do: [:friends_local, :user, :friends_remote] + + defp get_reply_tasks("direct", group) when group in @friends_groups, + do: [:user, group, :user] + + 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 - "friend", {id, data} -> - friend = Enum.random(friends) - insert_reply(friend, data, id, visibility) + :user, {id, data} -> + insert_reply(users[:user], data, id, visibility) - "non_friend", {id, data} -> - non_friend = Enum.random(non_friends) - insert_reply(non_friend, data, id, visibility) - - "user", {id, data} -> - insert_reply(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..b278faf9f 100644 --- a/benchmarks/load_testing/fetcher.ex +++ b/benchmarks/load_testing/fetcher.ex @@ -36,6 +36,7 @@ defp fetch_timelines(user) 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) @@ -227,6 +228,76 @@ defp fetch_public_timeline(user, :only_media) do fetch_public_timeline(opts, "public timeline only media") end + # TODO: remove using `:method` after benchmarks + 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 opts -> + ActivityPub.fetch_public_activities(opts) + end + }, + inputs: %{ + "old filtering" => Map.delete(opts, :method), + "with psql fun" => Map.put(opts, :method, :fun), + "with unnest" => Map.put(opts, :method, :unnest) + } + ) + + 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 opts -> + ActivityPub.fetch_public_activities(opts) + end + }, + inputs: %{ + "old filtering" => Map.delete(opts, :method), + "with psql fun" => Map.put(opts, :method, :fun), + "with unnest" => Map.put(opts, :method, :unnest) + } + ) + + 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 opts -> + ActivityPub.fetch_public_activities(opts) + end + }, + inputs: %{ + "old filtering" => Map.delete(opts, :method), + "with psql fun" => Map.put(opts, :method, :fun), + "with unnest" => Map.put(opts, :method, :unnest) + } + ) + end + defp fetch_public_timeline(opts, title) when is_binary(title) do first_page_last = ActivityPub.fetch_public_activities(opts) |> List.last() 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 @@ def generate(opts \\ []) 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 @@ defp run_stream(users, main_user) 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..1162b2e06 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 @@ def run(_args) do Benchee.run( %{ "Hashtag fetching, any" => fn tags -> - TimelineController.hashtag_fetching( + hashtag_fetching( %{ "any" => tags }, @@ -47,7 +46,7 @@ def run(_args) 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 @@ def run(_args) do Benchee.run( %{ "Hashtag fetching" => fn tag -> - TimelineController.hashtag_fetching( + hashtag_fetching( %{ "tag" => tag }, @@ -80,4 +79,35 @@ def run(_args) 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/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index b8a2873d8..e7958f7a8 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -932,6 +932,33 @@ defp restrict_blocked(query, %{"blocking_user" => %User{} = user} = opts) do query = if has_named_binding?(query, :object), do: query, else: Activity.with_joined_object(query) + # TODO: update after benchmarks + query = + case opts[:method] do + :fun -> + from(a in query, + where: + fragment( + "recipients_contain_blocked_domains(?, ?) = false", + a.recipients, + ^domain_blocks + ) + ) + + :unnest -> + from(a in query, + where: + fragment( + "NOT ? && (SELECT ARRAY(SELECT split_part(UNNEST(?), '/', 3)))", + ^domain_blocks, + a.recipients + ) + ) + + _ -> + query + end + from( [activity, object: o] in query, where: fragment("not (? = ANY(?))", activity.actor, ^blocked_ap_ids), diff --git a/lib/pleroma/web/api_spec/operations/timeline_operation.ex b/lib/pleroma/web/api_spec/operations/timeline_operation.ex index 8e19bace7..375b441a1 100644 --- a/lib/pleroma/web/api_spec/operations/timeline_operation.ex +++ b/lib/pleroma/web/api_spec/operations/timeline_operation.ex @@ -62,6 +62,13 @@ def public_operation do only_media_param(), with_muted_param(), exclude_visibilities_param(), + # TODO: remove after benchmarks + Operation.parameter( + :method, + :query, + %Schema{type: :string}, + "Temp parameter" + ), reply_visibility_param() | pagination_params() ], operationId: "TimelineController.public", diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 958567510..1734df4b5 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -109,14 +109,23 @@ def public(%{assigns: %{user: user}} = conn, params) do if restrict? and is_nil(user) do render_error(conn, :unauthorized, "authorization required for timeline view") else - activities = + # TODO: return back after benchmarks + params = 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) - |> ActivityPub.fetch_public_activities() + + params = + if params["method"] do + Map.put(params, :method, String.to_existing_atom(params["method"])) + else + params + end + + activities = ActivityPub.fetch_public_activities(params) conn |> add_link_headers(activities, %{"local" => local_only}) 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/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 2375ac8e8..3474c0cf9 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -90,6 +90,74 @@ test "the public timeline includes only public statuses for an authenticated use 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 + + # TODO: update after benchmarks + 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?method=fun") + + activities = json_response_and_validate_schema(res_conn, 200) + [%{"id" => ^activity_id}] = activities + end + + # TODO: update after benchmarks + test "doesn't return replies if follow is posting with users from blocked domain with unnest param" 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?method=unnest") + + activities = json_response_and_validate_schema(res_conn, 200) + [%{"id" => ^activity_id}] = activities + end end defp local_and_remote_activities do From 19f468c5bc230d6790b00aa87e509a07e709aaa7 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Tue, 2 Jun 2020 08:50:24 +0300 Subject: [PATCH 238/492] replies filtering for blocked domains --- benchmarks/load_testing/fetcher.ex | 30 ++++------------- lib/pleroma/web/activity_pub/activity_pub.ex | 33 ++++--------------- .../api_spec/operations/timeline_operation.ex | 7 ---- .../controllers/timeline_controller.ex | 13 ++------ .../controllers/timeline_controller_test.exs | 27 +-------------- 5 files changed, 15 insertions(+), 95 deletions(-) diff --git a/benchmarks/load_testing/fetcher.ex b/benchmarks/load_testing/fetcher.ex index b278faf9f..22a06e472 100644 --- a/benchmarks/load_testing/fetcher.ex +++ b/benchmarks/load_testing/fetcher.ex @@ -228,24 +228,16 @@ defp fetch_public_timeline(user, :only_media) do fetch_public_timeline(opts, "public timeline only media") end - # TODO: remove using `:method` after benchmarks 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 opts -> - ActivityPub.fetch_public_activities(opts) - end - }, - inputs: %{ - "old filtering" => Map.delete(opts, :method), - "with psql fun" => Map.put(opts, :method, :fun), - "with unnest" => Map.put(opts, :method, :unnest) - } - ) + 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) @@ -257,15 +249,10 @@ defp fetch_public_timeline(user, :with_blocks) do Benchee.run( %{ - "public timeline with user block" => fn opts -> + "public timeline with user block" => fn -> ActivityPub.fetch_public_activities(opts) end }, - inputs: %{ - "old filtering" => Map.delete(opts, :method), - "with psql fun" => Map.put(opts, :method, :fun), - "with unnest" => Map.put(opts, :method, :unnest) - } ) domains = @@ -289,11 +276,6 @@ defp fetch_public_timeline(user, :with_blocks) do "public timeline with domain block" => fn opts -> ActivityPub.fetch_public_activities(opts) end - }, - inputs: %{ - "old filtering" => Map.delete(opts, :method), - "with psql fun" => Map.put(opts, :method, :fun), - "with unnest" => Map.put(opts, :method, :unnest) } ) end diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index e7958f7a8..673b10b22 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -932,37 +932,16 @@ defp restrict_blocked(query, %{"blocking_user" => %User{} = user} = opts) do query = if has_named_binding?(query, :object), do: query, else: Activity.with_joined_object(query) - # TODO: update after benchmarks - query = - case opts[:method] do - :fun -> - from(a in query, - where: - fragment( - "recipients_contain_blocked_domains(?, ?) = false", - a.recipients, - ^domain_blocks - ) - ) - - :unnest -> - from(a in query, - where: - fragment( - "NOT ? && (SELECT ARRAY(SELECT split_part(UNNEST(?), '/', 3)))", - ^domain_blocks, - a.recipients - ) - ) - - _ -> - query - end - from( [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' \\?| ?)", diff --git a/lib/pleroma/web/api_spec/operations/timeline_operation.ex b/lib/pleroma/web/api_spec/operations/timeline_operation.ex index 375b441a1..8e19bace7 100644 --- a/lib/pleroma/web/api_spec/operations/timeline_operation.ex +++ b/lib/pleroma/web/api_spec/operations/timeline_operation.ex @@ -62,13 +62,6 @@ def public_operation do only_media_param(), with_muted_param(), exclude_visibilities_param(), - # TODO: remove after benchmarks - Operation.parameter( - :method, - :query, - %Schema{type: :string}, - "Temp parameter" - ), reply_visibility_param() | pagination_params() ], operationId: "TimelineController.public", diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 1734df4b5..958567510 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -109,23 +109,14 @@ def public(%{assigns: %{user: user}} = conn, params) do if restrict? and is_nil(user) do render_error(conn, :unauthorized, "authorization required for timeline view") else - # TODO: return back after benchmarks - params = + 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) - - params = - if params["method"] do - Map.put(params, :method, String.to_existing_atom(params["method"])) - else - params - end - - activities = ActivityPub.fetch_public_activities(params) + |> ActivityPub.fetch_public_activities() conn |> add_link_headers(activities, %{"local" => local_only}) diff --git a/test/web/mastodon_api/controllers/timeline_controller_test.exs b/test/web/mastodon_api/controllers/timeline_controller_test.exs index 3474c0cf9..2ad6828ad 100644 --- a/test/web/mastodon_api/controllers/timeline_controller_test.exs +++ b/test/web/mastodon_api/controllers/timeline_controller_test.exs @@ -111,7 +111,6 @@ test "doesn't return replies if follower is posting with blocked user" do [%{"id" => ^activity_id}] = json_response_and_validate_schema(res_conn, 200) end - # TODO: update after benchmarks 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) @@ -129,31 +128,7 @@ test "doesn't return replies if follow is posting with users from blocked domain {: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?method=fun") - - activities = json_response_and_validate_schema(res_conn, 200) - [%{"id" => ^activity_id}] = activities - end - - # TODO: update after benchmarks - test "doesn't return replies if follow is posting with users from blocked domain with unnest param" 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?method=unnest") + res_conn = get(conn, "/api/v1/timelines/public") activities = json_response_and_validate_schema(res_conn, 200) [%{"id" => ^activity_id}] = activities From 81fb45a71ba1d606e6a522ac746f3c7a7dd8136b Mon Sep 17 00:00:00 2001 From: Fristi Date: Mon, 1 Jun 2020 16:25:57 +0000 Subject: [PATCH 239/492] Translated using Weblate (Dutch) Currently translated at 29.2% (31 of 106 strings) Translation: Pleroma/Pleroma backend Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma/nl/ --- priv/gettext/nl/LC_MESSAGES/errors.po | 84 ++++++++++++++------------- 1 file changed, 43 insertions(+), 41 deletions(-) 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 From 165a4b2a690ff7809ebbae65cddff3221d52489a Mon Sep 17 00:00:00 2001 From: rinpatch Date: Mon, 1 Jun 2020 22:18:20 +0300 Subject: [PATCH 240/492] Do not include activities of invisible users unless explicitly requested Closes #1833 --- lib/pleroma/user/query.ex | 6 +++--- lib/pleroma/web/activity_pub/activity_pub.ex | 12 ++++++++++++ lib/pleroma/web/admin_api/search.ex | 3 +-- test/tasks/relay_test.exs | 3 ++- .../controllers/admin_api_controller_test.exs | 13 +++++-------- 5 files changed, 23 insertions(+), 14 deletions(-) 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 @@ defp compose_query({key, value}, query) 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 b8a2873d8..a38f9a3c8 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1030,6 +1030,17 @@ defp exclude_poll_votes(query, _) do 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 @@ -1135,6 +1146,7 @@ def fetch_activities_query(recipients, opts \\ %{}) do |> restrict_instance(opts) |> Activity.restrict_deactivated_users() |> exclude_poll_votes(opts) + |> exclude_invisible_actors(opts) |> exclude_visibility(opts) 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 @@ def user(params \\ %{}) 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 @@ def user(params \\ %{}) do count = Repo.aggregate(query, :count, :id) results = Repo.all(paginated_query) - {:ok, results, count} end end diff --git a/test/tasks/relay_test.exs b/test/tasks/relay_test.exs index d3d88467d..678288854 100644 --- a/test/tasks/relay_test.exs +++ b/test/tasks/relay_test.exs @@ -65,7 +65,8 @@ test "relay is unfollowed" do "type" => "Undo", "actor_id" => follower_id, "limit" => 1, - "skip_preload" => true + "skip_preload" => true, + "invisible_actors" => true }) assert undo_activity.data["type"] == "Undo" diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index ead840186..193690469 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -757,8 +757,8 @@ test "renders users array for the first page", %{conn: conn, admin: admin} do 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") + 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} = @@ -767,8 +767,7 @@ test "pagination works correctly with service users", %{conn: conn} do |> json_response(200) assert Enum.count(users1) == 10 - assert service1 not in [users1] - assert service2 not in [users1] + assert service1 not in users1 assert %{"count" => 26, "page_size" => 10, "users" => users2} = conn @@ -776,8 +775,7 @@ test "pagination works correctly with service users", %{conn: conn} do |> json_response(200) assert Enum.count(users2) == 10 - assert service1 not in [users2] - assert service2 not in [users2] + assert service1 not in users2 assert %{"count" => 26, "page_size" => 10, "users" => users3} = conn @@ -785,8 +783,7 @@ test "pagination works correctly with service users", %{conn: conn} do |> json_response(200) assert Enum.count(users3) == 6 - assert service1 not in [users3] - assert service2 not in [users3] + assert service1 not in users3 end test "renders empty array for the second page", %{conn: conn} do From 805ab86933d90d4284c83e4a8ebfd6bf4b0395b3 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 2 Jun 2020 13:24:34 +0200 Subject: [PATCH 241/492] Notifications: Make notifications save their type. --- lib/pleroma/following_relationship.ex | 11 ++-- lib/pleroma/notification.ex | 61 ++++++++++++++++++- .../web/activity_pub/transmogrifier.ex | 3 + .../operations/notification_operation.ex | 1 + lib/pleroma/web/common_api/common_api.ex | 1 + .../mastodon_api/views/notification_view.ex | 20 +----- ...200602094828_add_type_to_notifications.exs | 9 +++ test/notification_test.exs | 11 +++- 8 files changed, 90 insertions(+), 27 deletions(-) create mode 100644 priv/repo/migrations/20200602094828_add_type_to_notifications.exs diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 3a3082e72..0343a20d4 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -62,10 +62,13 @@ def update(%User{} = follower, %User{} = following, state) do follow(follower, following, state) following_relationship -> - following_relationship - |> cast(%{state: state}, [:state]) - |> validate_required([:state]) - |> Repo.update() + {:ok, relationship} = + following_relationship + |> cast(%{state: state}, [:state]) + |> validate_required([:state]) + |> Repo.update() + + {:ok, relationship} end end diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index efafbce48..41ac53505 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -30,12 +30,26 @@ defmodule Pleroma.Notification do schema "notifications" do field(:seen, :boolean, default: false) + 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__, @@ -46,7 +60,7 @@ def unread_notifications_count(%User{id: user_id}) do def changeset(%Notification{} = notification, attrs) do notification - |> cast(attrs, [:seen]) + |> cast(attrs, [:seen, :type]) end @spec last_read_query(User.t()) :: Ecto.Queryable.t() @@ -330,12 +344,55 @@ defp do_create_notifications(%Activity{} = activity) do {: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" + + "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"}} = activity) do + object = Object.normalize(activity, false) + + case 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() diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 4ac0d43fc..886403fcd 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -9,6 +9,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do alias Pleroma.Activity alias Pleroma.EarmarkRenderer alias Pleroma.FollowingRelationship + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Object.Containment alias Pleroma.Repo @@ -595,6 +596,8 @@ def handle_incoming( 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", diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex index 46e72f8bf..c966b553a 100644 --- a/lib/pleroma/web/api_spec/operations/notification_operation.ex +++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex @@ -185,6 +185,7 @@ defp notification_type do "mention", "poll", "pleroma:emoji_reaction", + "pleroma:chat_mention", "move", "follow_request" ], diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index e0987b1a7..5a194910d 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -121,6 +121,7 @@ def accept_follow_request(follower, followed) do object: follow_activity.data["id"], type: "Accept" }) do + Notification.update_notification_type(followed, follow_activity) {:ok, follower} end end diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 07d55a3e9..c090be8ad 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -81,22 +81,6 @@ def render( end end - # This returns the notification type by activity, but both chats and statuses - # are in "Create" activities. - mastodon_type = - case Activity.mastodon_notification_type(activity) do - "mention" -> - object = Object.normalize(activity) - - case object do - %{data: %{"type" => "ChatMessage"}} -> "pleroma:chat_mention" - _ -> "mention" - end - - type -> - type - end - # Note: :relationships contain user mutes (needed for :muted flag in :status) status_render_opts = %{relationships: opts[:relationships]} @@ -107,7 +91,7 @@ def render( ) do response = %{ id: to_string(notification.id), - type: mastodon_type, + type: notification.type, created_at: CommonAPI.Utils.to_masto_date(notification.inserted_at), account: account, pleroma: %{ @@ -115,7 +99,7 @@ def render( } } - case mastodon_type do + case notification.type do "mention" -> put_status(response, activity, reading_user, status_render_opts) 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/test/notification_test.exs b/test/notification_test.exs index 37c255fee..421b7fc40 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -31,6 +31,7 @@ test "creates a notification for an emoji reaction" 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 +49,7 @@ test "notifies someone when they are directly addressed" 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}] = @@ -335,9 +337,12 @@ test "it creates `follow_request` notification for pending Follow activity" 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 From 127ccc4e1c76c2782b26a0cfbb154bc1317f31b3 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 2 Jun 2020 14:05:53 +0200 Subject: [PATCH 242/492] NotificationController: Don't return chat_mentions by default. --- docs/API/chats.md | 2 +- .../controllers/notification_controller.ex | 14 ++++++++++++- lib/pleroma/web/mastodon_api/mastodon_api.ex | 15 ++----------- .../notification_controller_test.exs | 21 +++++++++++++++++++ 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 2eca5adf6..d1d39f495 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -204,7 +204,7 @@ Returned data is the deleted message. ### Notifications -There's a new `pleroma:chat_mention` notification, which has this form: +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 { 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 @@ def index(conn, %{account_id: account_id} = params) 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/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 @@ defp cast_params(params) 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 @@ defp restrict(query, :account_ap_id, %{account_ap_id: account_ap_id}) 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/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index e278d61f5..698c99711 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 @@ test "list of notifications" 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) From 37542a9dfa99cc4324f211b45254acea758ac1ae Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 2 Jun 2020 14:22:16 +0200 Subject: [PATCH 243/492] Activity: Remove notifications-related functions. --- lib/pleroma/activity.ex | 36 ------------------- .../mastodon_api/views/notification_view.ex | 15 ++++---- lib/pleroma/web/push/impl.ex | 14 +++----- test/web/push/impl_test.exs | 25 +++++++------ 4 files changed, 26 insertions(+), 64 deletions(-) diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 6213d0eb7..da1be20b3 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) @@ -300,32 +290,6 @@ def follow_accepted?( 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/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index c090be8ad..af15bba48 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -16,18 +16,17 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do alias Pleroma.Web.MastodonAPI.StatusView alias Pleroma.Web.PleromaAPI.ChatMessageView + @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) @@ -44,7 +43,7 @@ def render("index.json", %{notifications: notifications, for: reading_user} = op 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"])) actors = diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index 691725702..125f33755 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,7 +29,7 @@ def perform( 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) @@ -116,7 +114,7 @@ def build_content( 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), @@ -151,7 +149,7 @@ def format_body( 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,10 +164,8 @@ def format_title(%{activity: %{data: %{"directMessage" => true}}}, _mastodon_typ "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" diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index a826b24c9..26c65bc82 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -60,7 +60,8 @@ test "performs sending notifications" do notif = insert(:notification, user: user, - activity: activity + activity: activity, + type: "mention" ) assert Impl.perform(notif) == {:ok, [:ok, :ok]} @@ -126,7 +127,7 @@ test "renders title and body for create activity" 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 +137,10 @@ test "renders title and body for follow activity" 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 @@ -157,7 +159,7 @@ test "renders title and body for announce activity" do 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 +175,10 @@ test "renders title and body for like activity" 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 @@ -218,7 +221,7 @@ test "hides details for notifications when privacy option enabled" 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 +284,7 @@ test "returns regular content for notifications with privacy option disabled" 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) From 38dce485c47e9315663c5c9cfd67dab4164b1bbe Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 2 Jun 2020 14:49:56 +0200 Subject: [PATCH 244/492] Notification: Add function to backfill notification types --- lib/pleroma/notification.ex | 20 ++++++++++++++++++++ test/notification_test.exs | 28 ++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 41ac53505..c8b964400 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -37,6 +37,26 @@ defmodule Pleroma.Notification do timestamps() end + def fill_in_notification_types() do + query = + from(n in __MODULE__, + where: is_nil(n.type), + preload: :activity + ) + + query + |> Repo.all() + |> Enum.each(fn notification -> + type = + notification.activity + |> type_from_activity() + + notification + |> changeset(%{type: type}) + |> Repo.update() + end) + end + def update_notification_type(user, activity) do with %__MODULE__{} = notification <- Repo.get_by(__MODULE__, user_id: user.id, activity_id: activity.id) do diff --git a/test/notification_test.exs b/test/notification_test.exs index 421b7fc40..6bc2b6904 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -20,6 +20,34 @@ defmodule Pleroma.NotificationTest do alias Pleroma.Web.Push alias Pleroma.Web.Streamer + 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) + + assert {4, nil} = Repo.update_all(Notification, set: [type: nil]) + + Notification.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:chat_mention"} = + Repo.get_by(Notification, user_id: other_user.id, activity_id: chat.id) + end + end + describe "create_notifications" do test "creates a notification for an emoji reaction" do user = insert(:user) From 6cd2fa2a4cbffaaab7c911f1051d4917e8a06c78 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 2 Jun 2020 15:13:19 +0200 Subject: [PATCH 245/492] Migrations: Add a migration to backfill notification types. --- lib/pleroma/notification.ex | 23 +++++++++++++++---- ...0602125218_backfill_notification_types.exs | 10 ++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 priv/repo/migrations/20200602125218_backfill_notification_types.exs diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index c8b964400..d89ee4645 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -49,7 +49,7 @@ def fill_in_notification_types() do |> Enum.each(fn notification -> type = notification.activity - |> type_from_activity() + |> type_from_activity(no_cachex: true) notification |> changeset(%{type: type}) @@ -364,10 +364,23 @@ defp do_create_notifications(%Activity{} = activity) do {:ok, notifications} end - defp type_from_activity(%{data: %{"type" => type}} = activity) do + defp type_from_activity(%{data: %{"type" => type}} = activity, opts \\ []) do case type do "Follow" -> - if Activity.follow_accepted?(activity) do + accepted_function = + if Keyword.get(opts, :no_cachex, false) do + # A special function to make this usable in a migration. + 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 + else + &Activity.follow_accepted?/1 + end + + if accepted_function.(activity) do "follow" else "follow_request" @@ -394,8 +407,10 @@ defp type_from_activity(%{data: %{"type" => type}} = activity) do 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.normalize(activity, false) + object = Object.get_by_ap_id(activity.data["object"]) case object.data["type"] do "ChatMessage" -> "pleroma:chat_mention" 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..493c0280c --- /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.Notification.fill_in_notification_types() + end + + def down do + end +end From 2c6ebe709a9fb84bedb5d50c24715fd4532272f9 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 2 Jun 2020 15:14:52 +0200 Subject: [PATCH 246/492] Credo fixes --- lib/pleroma/notification.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index d89ee4645..0f33d282d 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -37,7 +37,7 @@ defmodule Pleroma.Notification do timestamps() end - def fill_in_notification_types() do + def fill_in_notification_types do query = from(n in __MODULE__, where: is_nil(n.type), From f73b2063f484e83c0972527c00c42d4fbdd11a0c Mon Sep 17 00:00:00 2001 From: stwf Date: Tue, 2 Jun 2020 10:18:06 -0400 Subject: [PATCH 247/492] encode data properly --- .../web/fallback_redirect_controller.ex | 7 +-- lib/pleroma/web/preload.ex | 2 + lib/pleroma/web/preload/timelines.ex | 31 ++++++------- test/web/fallback_test.exs | 46 +++++++++++-------- test/web/preload/timeline_test.exs | 12 ++--- test/web/streamer/streamer_test.exs | 2 +- 6 files changed, 55 insertions(+), 45 deletions(-) diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex index 932fb8d7e..431ad5485 100644 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ b/lib/pleroma/web/fallback_redirect_controller.ex @@ -4,7 +4,9 @@ defmodule Fallback.RedirectController do use Pleroma.Web, :controller + require Logger + alias Pleroma.User alias Pleroma.Web.Metadata alias Pleroma.Web.Preload @@ -38,8 +40,7 @@ def redirector_with_meta(conn, params) do response = index_content - |> String.replace("", tags) - |> String.replace("", preloads) + |> String.replace("", tags <> preloads) conn |> put_resp_content_type("text/html") @@ -56,7 +57,7 @@ def redirector_with_preload(conn, params) do response = index_content - |> String.replace("", preloads) + |> String.replace("", preloads) conn |> put_resp_content_type("text/html") diff --git a/lib/pleroma/web/preload.ex b/lib/pleroma/web/preload.ex index c2211c597..f13932b89 100644 --- a/lib/pleroma/web/preload.ex +++ b/lib/pleroma/web/preload.ex @@ -22,6 +22,8 @@ def build_tags(_conn, params) do end def build_script_tag(content) do + content = Base.encode64(content) + HTML.Tag.content_tag(:script, HTML.raw(content), id: "initial-results", type: "application/json" diff --git a/lib/pleroma/web/preload/timelines.ex b/lib/pleroma/web/preload/timelines.ex index dbd7db407..2bb57567b 100644 --- a/lib/pleroma/web/preload/timelines.ex +++ b/lib/pleroma/web/preload/timelines.ex @@ -11,32 +11,29 @@ defmodule Pleroma.Web.Preload.Providers.Timelines do @public_url :"/api/v1/timelines/public" @impl Provider - def generate_terms(_params) do - build_public_tag(%{}) + def generate_terms(params) do + build_public_tag(%{}, params) end - def build_public_tag(acc) do + 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(nil)) + Map.put(acc, @public_url, public_timeline(params)) end end - defp public_timeline(user) do + 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 = - create_timeline_params(user) - |> Map.put("local_only", false) - |> ActivityPub.fetch_public_activities() + ActivityPub.fetch_public_activities(%{ + "type" => ["Create"], + "local_only" => local_only + }) - StatusView.render("index.json", activities: activities, for: user, as: :activity) - end - - defp create_timeline_params(user) do - %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) + StatusView.render("index.json", activities: activities, for: nil, as: :activity) end end diff --git a/test/web/fallback_test.exs b/test/web/fallback_test.exs index 3b7a51d5e..a65865860 100644 --- a/test/web/fallback_test.exs +++ b/test/web/fallback_test.exs @@ -11,7 +11,12 @@ test "GET /registration/:token", %{conn: conn} do response = get(conn, "/registration/foo") assert html_response(response, 200) =~ "" - assert html_response(response, 200) =~ "" + end + + test "GET /*path", %{conn: conn} do + assert conn + |> get("/foo") + |> html_response(200) =~ "" end end @@ -21,20 +26,35 @@ test "GET /:maybe_nickname_or_id", %{conn: conn} do user_missing = get(conn, "/foo") user_present = get(conn, "/#{user.nickname}") - assert html_response(user_missing, 200) =~ "" + assert(html_response(user_missing, 200) =~ "") refute html_response(user_present, 200) =~ "" + assert html_response(user_present, 200) =~ "initial-results" + end - assert html_response(user_missing, 200) =~ "" - refute html_response(user_present, 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 only attached to" do - test "GET /*path", %{conn: conn} do + describe "preloaded data is attached to" do + test "GET /main/public", %{conn: conn} do public_page = get(conn, "/main/public") - assert html_response(public_page, 200) =~ "" - refute html_response(public_page, 200) =~ "" + 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 @@ -48,16 +68,6 @@ test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} 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/preload/timeline_test.exs b/test/web/preload/timeline_test.exs index 00b10d0ab..da6a3aded 100644 --- a/test/web/preload/timeline_test.exs +++ b/test/web/preload/timeline_test.exs @@ -52,9 +52,9 @@ test "returns the timeline when not restricted" do 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!"}) + {: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) @@ -62,9 +62,9 @@ test "returns public items", %{user: user} do 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!"}) + {: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) diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 4cf640ce8..3f012259a 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -124,7 +124,7 @@ test "it streams boosts of mastodon user in the 'user' stream", %{user: user} do |> Map.put("object", activity.data["object"]) |> Map.put("actor", user.ap_id) - {:ok, %Pleroma.Activity{data: data, local: false} = announce} = + {: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} From 7922e63825e2e25ccb52ae6e0a6c0011207a598d Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 2 Jun 2020 19:07:17 +0400 Subject: [PATCH 248/492] Update OpenAPI spec for AdminAPI.StatusController --- lib/pleroma/web/admin_api/controllers/status_controller.ex | 4 +--- lib/pleroma/web/api_spec/operations/admin/status_operation.ex | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/admin_api/controllers/status_controller.ex b/lib/pleroma/web/admin_api/controllers/status_controller.ex index c91fbc771..574196be8 100644 --- a/lib/pleroma/web/admin_api/controllers/status_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/status_controller.ex @@ -41,9 +41,7 @@ def index(%{assigns: %{user: _admin}} = conn, params) do def show(conn, %{id: id}) do with %Activity{} = activity <- Activity.get_by_id(id) do - conn - |> put_view(Pleroma.Web.AdminAPI.StatusView) - |> render("show.json", %{activity: activity}) + render(conn, "show.json", %{activity: activity}) else nil -> {:error, :not_found} 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 index 0b138dc79..2947e6b34 100644 --- a/lib/pleroma/web/api_spec/operations/admin/status_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/status_operation.ex @@ -74,7 +74,7 @@ def show_operation do parameters: [id_param()], security: [%{"oAuth" => ["read:statuses"]}], responses: %{ - 200 => Operation.response("Status", "application/json", Status), + 200 => Operation.response("Status", "application/json", status()), 404 => Operation.response("Not Found", "application/json", ApiError) } } From 030240ee8f80472c8dab0c1f9bb2f30f4271272f Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Wed, 3 Jun 2020 04:36:09 +0000 Subject: [PATCH 249/492] docs: clients.md: Add Husky --- docs/clients.md | 6 ++++++ 1 file changed, 6 insertions(+) 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: From aa22fce8f46cf2e7f871b3584fbfff7ac2ebe4c2 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 12:30:12 +0200 Subject: [PATCH 250/492] ChatMessageReference: Introduce and switch in chat controller. --- lib/pleroma/chat.ex | 5 ++ lib/pleroma/chat_message_reference.ex | 80 +++++++++++++++++++ lib/pleroma/web/activity_pub/side_effects.ex | 9 ++- .../controllers/chat_controller.ex | 60 ++++++++------ ...view.ex => chat_message_reference_view.ex} | 21 +++-- ...02150528_create_chat_message_reference.exs | 20 +++++ test/web/activity_pub/side_effects_test.exs | 13 ++- .../controllers/chat_controller_test.exs | 22 +++-- ...s => chat_message_reference_view_test.exs} | 20 +++-- 9 files changed, 205 insertions(+), 45 deletions(-) create mode 100644 lib/pleroma/chat_message_reference.ex rename lib/pleroma/web/pleroma_api/views/{chat_message_view.ex => chat_message_reference_view.ex} (67%) create mode 100644 priv/repo/migrations/20200602150528_create_chat_message_reference.exs rename test/web/pleroma_api/views/{chat_message_view_test.exs => chat_message_reference_view_test.exs} (67%) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 4c92a58c7..211b872f9 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -72,6 +72,11 @@ def creation_cng(struct, params) do |> 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) diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat_message_reference.ex new file mode 100644 index 000000000..e9ca3dfe8 --- /dev/null +++ b/lib/pleroma/chat_message_reference.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.ChatMessageReference 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.CompatType, autogenerate: true} + + schema "chat_message_references" do + belongs_to(:object, Object) + belongs_to(:chat, Chat) + + field(:seen, :boolean, default: false) + + timestamps() + end + + def changeset(struct, params) do + struct + |> cast(params, [:object_id, :chat_id, :seen]) + |> validate_required([:object_id, :chat_id, :seen]) + 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 create(chat, object, seen) do + params = %{ + chat_id: chat.id, + object_id: object.id, + seen: seen + } + + %__MODULE__{} + |> changeset(params) + |> Repo.insert() + end +end diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index a34bf6a05..cda52b00e 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do """ alias Pleroma.Activity alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -104,6 +105,8 @@ def handle(%{data: %{"type" => "Delete", "object" => deleted_object}} = object, Object.decrease_replies_count(in_reply_to) end + ChatMessageReference.delete_for_object(deleted_object) + ActivityPub.stream_out(object) ActivityPub.stream_out_participations(deleted_object, user) :ok @@ -137,9 +140,11 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do |> Enum.each(fn [user, other_user] -> if user.local do if user.ap_id == actor.ap_id do - Chat.get_or_create(user.id, other_user.ap_id) + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + ChatMessageReference.create(chat, object, true) else - Chat.bump_or_create(user.id, other_user.ap_id) + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + ChatMessageReference.create(chat, object, false) end end end) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 210c8ec4a..c54681054 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -6,14 +6,15 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Activity alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Object alias Pleroma.Pagination alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.CommonAPI - alias Pleroma.Web.PleromaAPI.ChatMessageView alias Pleroma.Web.PleromaAPI.ChatView + alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView import Ecto.Query import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1] @@ -35,28 +36,38 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation - def delete_message(%{assigns: %{user: %{ap_id: actor} = user}} = conn, %{ - message_id: id + def delete_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ + message_id: message_id, + id: chat_id }) do - with %Object{ - data: %{ - "actor" => ^actor, - "id" => object, - "to" => [recipient], - "type" => "ChatMessage" - } - } = message <- Object.get_by_id(id), - %Chat{} = chat <- Chat.get(user.id, recipient), - %Activity{} = activity <- Activity.get_create_by_object_ap_id(object), - {:ok, _delete} <- CommonAPI.delete(activity.id, user) do + with %ChatMessageReference{} = cm_ref <- + ChatMessageReference.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(ChatMessageView) - |> render("show.json", for: user, object: message, chat: chat) + |> put_view(ChatMessageReferenceView) + |> render("show.json", chat_message_reference: cm_ref) else - _e -> {:error, :could_not_delete} + _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 + |> ChatMessageReference.delete() + end + def post_chat_message( %{body_params: params, assigns: %{user: %{id: user_id} = user}} = conn, %{ @@ -69,10 +80,11 @@ def post_chat_message( CommonAPI.post_chat_message(user, recipient, params[:content], media_id: params[:media_id] ), - message <- Object.normalize(activity) do + message <- Object.normalize(activity, false), + cm_ref <- ChatMessageReference.for_chat_and_object(chat, message) do conn - |> put_view(ChatMessageView) - |> render("show.json", for: user, object: message, chat: chat) + |> put_view(ChatMessageReferenceView) + |> render("show.json", for: user, chat_message_reference: cm_ref) end end @@ -87,14 +99,14 @@ def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do 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 - messages = + cm_refs = chat - |> Chat.messages_for_chat_query() + |> ChatMessageReference.for_chat_query() |> Pagination.fetch_paginated(params |> stringify_keys()) conn - |> put_view(ChatMessageView) - |> render("index.json", for: user, objects: messages, chat: chat) + |> put_view(ChatMessageReferenceView) + |> render("index.json", for: user, chat_message_references: cm_refs) else _ -> conn diff --git a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex b/lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex similarity index 67% rename from lib/pleroma/web/pleroma_api/views/chat_message_view.ex rename to lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex index b088a8734..ff170e162 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex @@ -2,10 +2,9 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.PleromaAPI.ChatMessageView do +defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceView do use Pleroma.Web, :view - alias Pleroma.Chat alias Pleroma.User alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.StatusView @@ -13,8 +12,12 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageView do def render( "show.json", %{ - object: %{id: id, data: %{"type" => "ChatMessage"} = chat_message}, - chat: %Chat{id: chat_id} + chat_message_reference: %{ + id: id, + object: %{data: chat_message}, + chat_id: chat_id, + seen: seen + } } ) do %{ @@ -26,11 +29,17 @@ def render( emojis: StatusView.build_emojis(chat_message["emoji"]), attachment: chat_message["attachment"] && - StatusView.render("attachment.json", attachment: chat_message["attachment"]) + StatusView.render("attachment.json", attachment: chat_message["attachment"]), + seen: seen } end def render("index.json", opts) do - render_many(opts[:objects], __MODULE__, "show.json", Map.put(opts, :as, :object)) + render_many( + opts[:chat_message_references], + __MODULE__, + "show.json", + Map.put(opts, :as, :chat_message_reference) + ) 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/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 210ba6ef0..ff6b3ac15 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -8,6 +8,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do alias Pleroma.Activity alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -330,7 +331,7 @@ test "it streams the created ChatMessage" do end end - test "it creates a Chat for the local users and bumps the unread count, except for the author" do + test "it creates a Chat and ChatMessageReferences for the local users and bumps the unread count, except for the author" do author = insert(:user, local: true) recipient = insert(:user, local: true) @@ -347,8 +348,18 @@ test "it creates a Chat for the local users and bumps the unread count, except f chat = Chat.get(author.id, recipient.ap_id) assert chat.unread == 0 + [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() + + assert cm_ref.object.data["content"] == "hey" + assert cm_ref.seen == true + chat = Chat.get(recipient.id, author.ap_id) assert chat.unread == 1 + + [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() + + assert cm_ref.object.data["content"] == "hey" + assert cm_ref.seen == false end test "it creates a Chat for the local users and bumps the unread count" do diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index d79aa3148..bd4024c09 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -5,6 +5,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub @@ -95,7 +96,7 @@ test "it works with an attachment", %{conn: conn, user: user} do describe "DELETE /api/v1/pleroma/chats/:id/messages/:message_id" do setup do: oauth_access(["write:statuses"]) - test "it deletes a message for the author of the message", %{conn: conn, user: user} do + test "it deletes a message from the chat", %{conn: conn, user: user} do recipient = insert(:user) {:ok, message} = @@ -107,23 +108,32 @@ test "it deletes a message for the author of the message", %{conn: conn, user: u chat = Chat.get(user.id, recipient.ap_id) + cm_ref = ChatMessageReference.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/#{object.id}") + |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}") |> json_response_and_validate_schema(200) - assert result["id"] == to_string(object.id) + assert result["id"] == cm_ref.id + refute ChatMessageReference.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 = ChatMessageReference.for_chat_and_object(chat, object) result = conn |> put_req_header("content-type", "application/json") - |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{object.id}") - |> json_response(400) + |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{cm_ref.id}") + |> json_response_and_validate_schema(200) - assert result == %{"error" => "could_not_delete"} + assert result["id"] == cm_ref.id + refute ChatMessageReference.get_by_id(cm_ref.id) + assert Object.get_by_id(object.id) end end diff --git a/test/web/pleroma_api/views/chat_message_view_test.exs b/test/web/pleroma_api/views/chat_message_reference_view_test.exs similarity index 67% rename from test/web/pleroma_api/views/chat_message_view_test.exs rename to test/web/pleroma_api/views/chat_message_reference_view_test.exs index d7a2d10a5..00024d52c 100644 --- a/test/web/pleroma_api/views/chat_message_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_reference_view_test.exs @@ -2,14 +2,15 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.PleromaAPI.ChatMessageViewTest do +defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do use Pleroma.DataCase alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Object alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI - alias Pleroma.Web.PleromaAPI.ChatMessageView + alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView import Pleroma.Factory @@ -30,25 +31,32 @@ test "it displays a chat message" do object = Object.normalize(activity) - chat_message = ChatMessageView.render("show.json", object: object, for: user, chat: chat) + cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert chat_message[:id] == object.id |> to_string() + chat_message = ChatMessageReferenceView.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[:seen] == true assert match?([%{shortcode: "firefox"}], chat_message[:emojis]) {:ok, activity} = CommonAPI.post_chat_message(recipient, user, "gkgkgk", media_id: upload.id) object = Object.normalize(activity) - chat_message_two = ChatMessageView.render("show.json", object: object, for: user, chat: chat) + cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert chat_message_two[:id] == object.id |> to_string() + chat_message_two = + ChatMessageReferenceView.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[:seen] == false end end From f3ccd50a33c9eec3661bf2116fe38542f04986aa Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 12:49:53 +0200 Subject: [PATCH 251/492] ChatMessageReferences: Adjust views --- lib/pleroma/chat_message_reference.ex | 7 +++++++ lib/pleroma/web/mastodon_api/views/notification_view.ex | 8 +++++--- lib/pleroma/web/pleroma_api/views/chat_view.ex | 8 +++++--- lib/pleroma/web/views/streamer_view.ex | 8 +++++++- test/web/mastodon_api/views/notification_view_test.exs | 7 +++++-- test/web/pleroma_api/views/chat_view_test.exs | 7 +++++-- 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat_message_reference.ex index e9ca3dfe8..6808d1365 100644 --- a/lib/pleroma/chat_message_reference.ex +++ b/lib/pleroma/chat_message_reference.ex @@ -66,6 +66,13 @@ def for_chat_query(chat) do ) end + def last_message_for_chat(chat) do + chat + |> for_chat_query() + |> limit(1) + |> Repo.one() + end + def create(chat, object, seen) do params = %{ chat_id: chat.id, diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index af15bba48..2ae82eb2d 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do use Pleroma.Web, :view alias Pleroma.Activity + alias Pleroma.ChatMessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.User @@ -14,7 +15,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MastodonAPI.NotificationView alias Pleroma.Web.MastodonAPI.StatusView - alias Pleroma.Web.PleromaAPI.ChatMessageView + alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView @parent_types ~w{Like Announce EmojiReact} @@ -138,8 +139,9 @@ 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) - render_opts = Map.merge(opts, %{object: object, for: reading_user, chat: chat}) - chat_message_render = ChatMessageView.render("show.json", render_opts) + cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + render_opts = Map.merge(opts, %{for: reading_user, chat_message_reference: cm_ref}) + chat_message_render = ChatMessageReferenceView.render("show.json", render_opts) Map.put(response, :chat_message, chat_message_render) end diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index 223b64987..331c1d282 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -6,22 +6,24 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do use Pleroma.Web, :view alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.User alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.PleromaAPI.ChatMessageView + alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView def render("show.json", %{chat: %Chat{} = chat} = opts) do recipient = User.get_cached_by_ap_id(chat.recipient) - last_message = opts[:message] || Chat.last_message_for_chat(chat) + last_message = opts[:last_message] || ChatMessageReference.last_message_for_chat(chat) %{ id: chat.id |> to_string(), account: AccountView.render("show.json", Map.put(opts, :user, recipient)), unread: chat.unread, last_message: - last_message && ChatMessageView.render("show.json", chat: chat, object: last_message), + last_message && + ChatMessageReferenceView.render("show.json", chat_message_reference: last_message), updated_at: Utils.to_masto_date(chat.updated_at) } end diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index 5e953d770..616e0c4f2 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.StreamerView do alias Pleroma.Activity alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Conversation.Participation alias Pleroma.Notification alias Pleroma.User @@ -15,10 +16,15 @@ defmodule Pleroma.Web.StreamerView do def render("chat_update.json", object, user, recipients) do chat = Chat.get(user.id, hd(recipients -- [user.ap_id])) + # 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 + cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + representation = Pleroma.Web.PleromaAPI.ChatView.render( "show.json", - %{message: object, chat: chat} + %{last_message: cm_ref, chat: chat} ) %{ diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 384fe7253..c5691341a 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -7,6 +7,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do alias Pleroma.Activity alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -16,7 +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.ChatMessageView + alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView import Pleroma.Factory defp test_notifications_rendering(notifications, user, expected_result) do @@ -44,13 +45,15 @@ test "ChatMessage notification" do object = Object.normalize(activity) chat = Chat.get(recipient.id, user.ap_id) + cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + expected = %{ id: to_string(notification.id), pleroma: %{is_seen: false}, type: "pleroma:chat_mention", account: AccountView.render("show.json", %{user: user, for: recipient}), chat_message: - ChatMessageView.render("show.json", %{object: object, for: recipient, chat: chat}), + ChatMessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}), created_at: Utils.to_masto_date(notification.inserted_at) } diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index 6062a0cfe..f3bd12616 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -6,11 +6,12 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do use Pleroma.DataCase alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Object alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.PleromaAPI.ChatMessageView + alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView alias Pleroma.Web.PleromaAPI.ChatView import Pleroma.Factory @@ -39,7 +40,9 @@ test "it represents a chat" do represented_chat = ChatView.render("show.json", chat: chat) + cm_ref = ChatMessageReference.for_chat_and_object(chat, chat_message) + assert represented_chat[:last_message] == - ChatMessageView.render("show.json", chat: chat, object: chat_message) + ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref) end end From 8a43611e01cef670c6eac8457be95c5d20efcbc8 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Wed, 3 Jun 2020 14:53:46 +0400 Subject: [PATCH 252/492] Use AdminAPI.StatusView in api/admin/users --- lib/pleroma/web/admin_api/controllers/admin_api_controller.ex | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 9f499e202..cc93fb509 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -30,7 +30,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do alias Pleroma.Web.AdminAPI.Search alias Pleroma.Web.CommonAPI alias Pleroma.Web.Endpoint - alias Pleroma.Web.MastodonAPI alias Pleroma.Web.Router require Logger @@ -279,7 +278,7 @@ def list_user_statuses(conn, %{"nickname" => nickname} = params) do }) conn - |> put_view(MastodonAPI.StatusView) + |> put_view(AdminAPI.StatusView) |> render("index.json", %{activities: activities, as: :activity}) else _ -> {:error, :not_found} From 2591745fc2417771f96340ed3f36177c0da194c3 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 12:56:39 +0200 Subject: [PATCH 253/492] ChatMessageReferences: Move tests --- lib/pleroma/chat.ex | 34 ---------------------------- test/chat_message_reference_test.exs | 29 ++++++++++++++++++++++++ test/chat_test.exs | 16 ------------- 3 files changed, 29 insertions(+), 50 deletions(-) create mode 100644 test/chat_message_reference_test.exs diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 211b872f9..65938c7a4 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -6,9 +6,7 @@ defmodule Pleroma.Chat do use Ecto.Schema import Ecto.Changeset - import Ecto.Query - alias Pleroma.Object alias Pleroma.Repo alias Pleroma.User @@ -26,38 +24,6 @@ defmodule Pleroma.Chat do timestamps() end - def last_message_for_chat(chat) do - messages_for_chat_query(chat) - |> order_by(desc: :id) - |> limit(1) - |> Repo.one() - end - - def messages_for_chat_query(chat) do - chat = - chat - |> Repo.preload(:user) - - from(o in Object, - where: fragment("?->>'type' = ?", o.data, "ChatMessage"), - where: - fragment( - """ - (?->>'actor' = ? and ?->'to' = ?) - OR (?->>'actor' = ? and ?->'to' = ?) - """, - o.data, - ^chat.user.ap_id, - o.data, - ^[chat.recipient], - o.data, - ^chat.recipient, - o.data, - ^[chat.user.ap_id] - ) - ) - end - def creation_cng(struct, params) do struct |> cast(params, [:user_id, :recipient, :unread]) diff --git a/test/chat_message_reference_test.exs b/test/chat_message_reference_test.exs new file mode 100644 index 000000000..963a0e225 --- /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.ChatMessageReferencTest do + use Pleroma.DataCase, async: true + + alias Pleroma.Chat + alias Pleroma.ChatMessageReference + 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 = ChatMessageReference.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 index dfcb6422e..42e01fe27 100644 --- a/test/chat_test.exs +++ b/test/chat_test.exs @@ -10,22 +10,6 @@ defmodule Pleroma.ChatTest do 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 = Chat.last_message_for_chat(chat) - - assert message.data["content"] == "ho" - end - end - describe "creation and getting" do test "it only works if the recipient is a valid user (for now)" do user = insert(:user) From 6413e06a861bd383196c79d7754a67d96cd5e2a4 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 13:13:44 +0200 Subject: [PATCH 254/492] Migrations: Add unique index to ChatMessageReferences. --- ...add_unique_index_to_chat_message_references.exs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 priv/repo/migrations/20200603105113_add_unique_index_to_chat_message_references.exs 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..1101be94f --- /dev/null +++ b/priv/repo/migrations/20200603105113_add_unique_index_to_chat_message_references.exs @@ -0,0 +1,14 @@ +defmodule Pleroma.Repo.Migrations.BackfillChatMessageReferences do + use Ecto.Migration + + alias Pleroma.Chat + alias Pleroma.ChatMessageReference + alias Pleroma.Object + alias Pleroma.Repo + + import Ecto.Query + + def change do + create(unique_index(:chat_message_references, [:object_id, :chat_id])) + end +end From 73127cff750736c5ebe15606db2f928a8924499a Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 13:17:29 +0200 Subject: [PATCH 255/492] Credo fixes. --- lib/pleroma/web/pleroma_api/controllers/chat_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index c54681054..f22f33de9 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -13,8 +13,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.CommonAPI - alias Pleroma.Web.PleromaAPI.ChatView alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView + alias Pleroma.Web.PleromaAPI.ChatView import Ecto.Query import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1] From 8edead7c1dc33457dc30b301b544d71482ef0f28 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 13:19:38 +0200 Subject: [PATCH 256/492] Migration: Remove superfluous imports --- ...3105113_add_unique_index_to_chat_message_references.exs | 7 ------- 1 file changed, 7 deletions(-) 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 index 1101be94f..623ac6c85 100644 --- 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 @@ -1,13 +1,6 @@ defmodule Pleroma.Repo.Migrations.BackfillChatMessageReferences do use Ecto.Migration - alias Pleroma.Chat - alias Pleroma.ChatMessageReference - alias Pleroma.Object - alias Pleroma.Repo - - import Ecto.Query - def change do create(unique_index(:chat_message_references, [:object_id, :chat_id])) end From 7f5c5b11a5baeddec36ccc01b4954ac8aa9f8590 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 14:26:50 +0200 Subject: [PATCH 257/492] Chats: Remove `unread` from the db, calculate from unseen messages. --- lib/pleroma/chat.ex | 13 +++---------- lib/pleroma/chat_message_reference.ex | 16 ++++++++++++++++ lib/pleroma/web/activity_pub/side_effects.ex | 9 ++------- .../pleroma_api/controllers/chat_controller.ex | 2 +- lib/pleroma/web/pleroma_api/views/chat_view.ex | 2 +- .../20200603120448_remove_unread_from_chats.exs | 9 +++++++++ test/chat_test.exs | 6 +----- test/web/activity_pub/side_effects_test.exs | 2 -- .../controllers/chat_controller_test.exs | 11 +++++++---- 9 files changed, 40 insertions(+), 30 deletions(-) create mode 100644 priv/repo/migrations/20200603120448_remove_unread_from_chats.exs diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 65938c7a4..5aefddc5e 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -19,14 +19,13 @@ defmodule Pleroma.Chat do schema "chats" do belongs_to(:user, User, type: FlakeId.Ecto.CompatType) field(:recipient, :string) - field(:unread, :integer, default: 0, read_after_writes: true) timestamps() end def creation_cng(struct, params) do struct - |> cast(params, [:user_id, :recipient, :unread]) + |> cast(params, [:user_id, :recipient]) |> validate_change(:recipient, fn :recipient, recipient -> case User.get_cached_by_ap_id(recipient) do @@ -61,16 +60,10 @@ def get_or_create(user_id, recipient) do def bump_or_create(user_id, recipient) do %__MODULE__{} - |> creation_cng(%{user_id: user_id, recipient: recipient, unread: 1}) + |> creation_cng(%{user_id: user_id, recipient: recipient}) |> Repo.insert( - on_conflict: [set: [updated_at: NaiveDateTime.utc_now()], inc: [unread: 1]], + on_conflict: [set: [updated_at: NaiveDateTime.utc_now()]], conflict_target: [:user_id, :recipient] ) end - - def mark_as_read(chat) do - chat - |> change(%{unread: 0}) - |> Repo.update() - end end diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat_message_reference.ex index 6808d1365..ad174b294 100644 --- a/lib/pleroma/chat_message_reference.ex +++ b/lib/pleroma/chat_message_reference.ex @@ -84,4 +84,20 @@ def create(chat, object, seen) do |> changeset(params) |> Repo.insert() end + + def unread_count_for_chat(chat) do + chat + |> for_chat_query() + |> where([cmr], cmr.seen == false) + |> Repo.aggregate(:count) + end + + def set_all_seen_for_chat(chat) do + chat + |> for_chat_query() + |> exclude(:order_by) + |> exclude(:preload) + |> where([cmr], cmr.seen == false) + |> Repo.update_all(set: [seen: true]) + end end diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index cda52b00e..884d399d0 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -139,13 +139,8 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do [[actor, recipient], [recipient, actor]] |> Enum.each(fn [user, other_user] -> if user.local do - if user.ap_id == actor.ap_id do - {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) - ChatMessageReference.create(chat, object, true) - else - {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) - ChatMessageReference.create(chat, object, false) - end + {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + ChatMessageReference.create(chat, object, user.ap_id == actor.ap_id) end end) diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index f22f33de9..29922da99 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -90,7 +90,7 @@ def post_chat_message( def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), - {:ok, chat} <- Chat.mark_as_read(chat) do + {_n, _} <- ChatMessageReference.set_all_seen_for_chat(chat) do conn |> put_view(ChatView) |> render("show.json", chat: chat) diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index 331c1d282..c903a71fd 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -20,7 +20,7 @@ def render("show.json", %{chat: %Chat{} = chat} = opts) do %{ id: chat.id |> to_string(), account: AccountView.render("show.json", Map.put(opts, :user, recipient)), - unread: chat.unread, + unread: ChatMessageReference.unread_count_for_chat(chat), last_message: last_message && ChatMessageReferenceView.render("show.json", chat_message_reference: last_message), 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/test/chat_test.exs b/test/chat_test.exs index 42e01fe27..332f2180a 100644 --- a/test/chat_test.exs +++ b/test/chat_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.ChatTest do use Pleroma.DataCase, async: true alias Pleroma.Chat - alias Pleroma.Web.CommonAPI import Pleroma.Factory @@ -35,7 +34,6 @@ test "it returns and bumps a chat for a user and recipient if it already exists" {:ok, chat_two} = Chat.bump_or_create(user.id, other_user.ap_id) assert chat.id == chat_two.id - assert chat_two.unread == 2 end test "it returns a chat for a user and recipient if it already exists" do @@ -48,15 +46,13 @@ test "it returns a chat for a user and recipient if it already exists" do assert chat.id == chat_two.id end - test "a returning chat will have an updated `update_at` field and an incremented unread count" do + 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) - assert chat.unread == 1 :timer.sleep(1500) {:ok, chat_two} = Chat.bump_or_create(user.id, other_user.ap_id) - assert chat_two.unread == 2 assert chat.id == chat_two.id assert chat.updated_at != chat_two.updated_at diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index ff6b3ac15..f2fa062b4 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -346,7 +346,6 @@ test "it creates a Chat and ChatMessageReferences for the local users and bumps SideEffects.handle(create_activity, local: false, object_data: chat_message_data) chat = Chat.get(author.id, recipient.ap_id) - assert chat.unread == 0 [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() @@ -354,7 +353,6 @@ test "it creates a Chat and ChatMessageReferences for the local users and bumps assert cm_ref.seen == true chat = Chat.get(recipient.id, author.ap_id) - assert chat.unread == 1 [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index bd4024c09..e62b71799 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -19,9 +19,12 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do test "it marks all messages in a chat as read", %{conn: conn, user: user} do other_user = insert(:user) - {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) + {:ok, create} = CommonAPI.post_chat_message(other_user, user, "sup") + {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + object = Object.normalize(create, false) + cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert chat.unread == 1 + assert cm_ref.seen == false result = conn @@ -30,9 +33,9 @@ test "it marks all messages in a chat as read", %{conn: conn, user: user} do assert result["unread"] == 0 - {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id) + cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert chat.unread == 0 + assert cm_ref.seen == true end end From 1e9efcf7c3de2aa4d57d4292dfa5843761bff111 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 14:27:54 +0200 Subject: [PATCH 258/492] Migrations: Fix migration module name --- ...200603105113_add_unique_index_to_chat_message_references.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 623ac6c85..fdf85132e 100644 --- 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 @@ -1,4 +1,4 @@ -defmodule Pleroma.Repo.Migrations.BackfillChatMessageReferences do +defmodule Pleroma.Repo.Migrations.AddUniqueIndexToChatMessageReferences do use Ecto.Migration def change do From 7b79871e9721dca9b134598c182df890b909047c Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 14:32:19 +0200 Subject: [PATCH 259/492] Migrations: Add chat_id, seen index to ChatMessageReferences This ensures fast count of unseen messages --- ...732_add_seen_index_to_chat_message_references.exs | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 priv/repo/migrations/20200603122732_add_seen_index_to_chat_message_references.exs 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 From 903955b189561d3a95d5955feda723999078b894 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 14:40:44 +0200 Subject: [PATCH 260/492] FollowingRelationship: Remove meaningless change --- lib/pleroma/following_relationship.ex | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 0343a20d4..3a3082e72 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -62,13 +62,10 @@ def update(%User{} = follower, %User{} = following, state) do follow(follower, following, state) following_relationship -> - {:ok, relationship} = - following_relationship - |> cast(%{state: state}, [:state]) - |> validate_required([:state]) - |> Repo.update() - - {:ok, relationship} + following_relationship + |> cast(%{state: state}, [:state]) + |> validate_required([:state]) + |> Repo.update() end end From fb4ae9c720054372c1f0e41e3227fb8ad24e6c2d Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 16:45:04 +0200 Subject: [PATCH 261/492] Streamer, SideEffects: Stream out ChatMessageReferences Saves us a few calles to fetch things from the DB that we already have. --- lib/pleroma/web/activity_pub/side_effects.ex | 8 +++- lib/pleroma/web/streamer/streamer.ex | 21 +++------ lib/pleroma/web/views/streamer_view.ex | 46 +++++++++----------- test/web/activity_pub/side_effects_test.exs | 5 +-- test/web/streamer/streamer_test.exs | 28 +++++++++--- 5 files changed, 58 insertions(+), 50 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 884d399d0..0c5709356 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -140,11 +140,15 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do |> Enum.each(fn [user, other_user] -> if user.local do {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) - ChatMessageReference.create(chat, object, user.ap_id == actor.ap_id) + {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id == actor.ap_id) + + Streamer.stream( + ["user", "user:pleroma_chat"], + {user, %{cm_ref | chat: chat, object: object}} + ) end end) - Streamer.stream(["user", "user:pleroma_chat"], object) {:ok, object, meta} end end diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index 2201cbfef..5e37e2cf2 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -6,11 +6,11 @@ defmodule Pleroma.Web.Streamer do require Logger alias Pleroma.Activity + alias Pleroma.ChatMessageReference alias Pleroma.Config alias Pleroma.Conversation.Participation alias Pleroma.Notification alias Pleroma.Object - alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Visibility @@ -201,22 +201,15 @@ defp do_stream(topic, %Notification{} = item) end) end - defp do_stream(topic, %{data: %{"type" => "ChatMessage"}} = object) + defp do_stream(topic, {user, %ChatMessageReference{} = cm_ref}) when topic in ["user", "user:pleroma_chat"] do - recipients = [object.data["actor"] | object.data["to"]] + topic = "#{topic}:#{user.id}" - topics = - %{ap_id: recipients, local: true} - |> Pleroma.User.Query.build() - |> Repo.all() - |> Enum.map(fn %{id: id} = user -> {user, "#{topic}:#{id}"} end) + text = StreamerView.render("chat_update.json", %{chat_message_reference: cm_ref}) - Enum.each(topics, fn {user, topic} -> - Registry.dispatch(@registry, topic, fn list -> - Enum.each(list, fn {pid, _auth} -> - text = StreamerView.render("chat_update.json", object, user, recipients) - send(pid, {:text, text}) - end) + Registry.dispatch(@registry, topic, fn list -> + Enum.each(list, fn {pid, _auth} -> + send(pid, {:text, text}) end) end) end diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index 616e0c4f2..a6efd0109 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -6,36 +6,11 @@ defmodule Pleroma.Web.StreamerView do use Pleroma.Web, :view alias Pleroma.Activity - alias Pleroma.Chat - alias Pleroma.ChatMessageReference alias Pleroma.Conversation.Participation alias Pleroma.Notification alias Pleroma.User alias Pleroma.Web.MastodonAPI.NotificationView - def render("chat_update.json", object, user, recipients) do - chat = Chat.get(user.id, hd(recipients -- [user.ap_id])) - - # 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 - cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - - representation = - Pleroma.Web.PleromaAPI.ChatView.render( - "show.json", - %{last_message: cm_ref, chat: chat} - ) - - %{ - event: "pleroma:chat_update", - payload: - representation - |> Jason.encode!() - } - |> Jason.encode!() - end - def render("update.json", %Activity{} = activity, %User{} = user) do %{ event: "update", @@ -76,6 +51,27 @@ def render("update.json", %Activity{} = activity) 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 + 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/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index f2fa062b4..92c266d84 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -325,9 +325,8 @@ test "it streams the created ChatMessage" do {:ok, _create_activity, _meta} = SideEffects.handle(create_activity, local: false, object_data: chat_message_data) - object = Object.normalize(create_activity, false) - - assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], object)) + assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], {author, :_})) + assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], {recipient, :_})) end end diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index bcb05a02d..893ae5449 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.Web.StreamerTest do import Pleroma.Factory + alias Pleroma.Chat + alias Pleroma.ChatMessageReference alias Pleroma.Conversation.Participation alias Pleroma.List alias Pleroma.Object @@ -150,22 +152,36 @@ test "it sends notify to in the 'user:notification' stream", %{user: user, notif 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") + {: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 = ChatMessageReference.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", object) - text = StreamerView.render("chat_update.json", object, user, [user.ap_id, other_user.ap_id]) + 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") + {: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 = ChatMessageReference.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", object) - text = StreamerView.render("chat_update.json", object, user, [user.ap_id, other_user.ap_id]) + 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 From 9d572f2f66d600d77cf74e40547dea0f959fe357 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 21 May 2020 19:43:56 +0400 Subject: [PATCH 262/492] Move report actions to AdminAPI.ReportController --- .../controllers/admin_api_controller.ex | 97 ----- .../controllers/report_controller.ex | 129 ++++++ lib/pleroma/web/router.ex | 10 +- .../controllers/admin_api_controller_test.exs | 341 ---------------- .../controllers/report_controller_test.exs | 368 ++++++++++++++++++ 5 files changed, 502 insertions(+), 443 deletions(-) create mode 100644 lib/pleroma/web/admin_api/controllers/report_controller.ex create mode 100644 test/web/admin_api/controllers/report_controller_test.exs diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index cc93fb509..467d05375 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -7,28 +7,22 @@ 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.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.Router @@ -71,18 +65,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do 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] - ) - plug( OAuthScopesPlug, %{scopes: ["read:statuses"], admin: true} @@ -645,85 +627,6 @@ def update_user_credentials( 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_log(conn, params) do {page, page_size} = page_params(params) 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..23f0174d4 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/report_controller.ex @@ -0,0 +1,129 @@ +# 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 + + @users_page_size 50 + + 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) + + def index(conn, params) do + {page, page_size} = page_params(params) + + reports = Utils.get_reports(params, page, 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}} = 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 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 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 + + defp page_params(params) do + {get_page(params["page"]), get_page_size(params["page_size"])} + end + + defp get_page(page_string) when is_nil(page_string), do: 1 + + defp get_page(page_string) do + case Integer.parse(page_string) do + {page, _} -> page + :error -> 1 + end + end + + defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size + + defp get_page_size(page_size_string) do + case Integer.parse(page_size_string) do + {page_size, _} -> page_size + :error -> @users_page_size + end + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 369c11138..80ea28364 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -183,11 +183,11 @@ 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", StatusController, :show) put("/statuses/:id", StatusController, :update) diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index d72851c9e..a1bff5688 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -17,7 +17,6 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do alias Pleroma.MFA alias Pleroma.ModerationLog alias Pleroma.Repo - alias Pleroma.ReportNote alias Pleroma.Tests.ObanHelpers alias Pleroma.User alias Pleroma.Web @@ -1198,286 +1197,6 @@ test "returns 404 if user not found", %{conn: conn} do 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) == %{"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) - |> 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/config" do setup do: clear_config(:configurable_from_database, true) @@ -3195,66 +2914,6 @@ test "it resend emails for two users", %{conn: conn, admin: admin} do 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) 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..0eddb369c --- /dev/null +++ b/test/web/admin_api/controllers/report_controller_test.exs @@ -0,0 +1,368 @@ +# 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(: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) == %{"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) + |> 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 "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] + }) + + 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 +end From c16315d055d07206dddb228583956d5b718ecdd4 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Wed, 3 Jun 2020 19:10:11 +0400 Subject: [PATCH 263/492] Add OpenAPI spec for AdminAPI.ReportController --- docs/API/admin_api.md | 4 +- lib/pleroma/web/activity_pub/utils.ex | 1 + .../controllers/report_controller.ex | 74 ++---- .../operations/admin/report_operation.ex | 237 ++++++++++++++++++ .../operations/admin/status_operation.ex | 2 +- .../controllers/report_controller_test.exs | 80 +++--- 6 files changed, 310 insertions(+), 88 deletions(-) create mode 100644 lib/pleroma/web/api_spec/operations/admin/report_operation.ex diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index 639c3224d..92816baf9 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -547,7 +547,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret ```json { - "totalReports" : 1, + "total" : 1, "reports": [ { "account": { @@ -768,7 +768,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 diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index f2375bcc4..a76a699ee 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -740,6 +740,7 @@ defp build_flag_object(_), do: [] def get_reports(params, page, page_size) do params = params + |> Map.new(fn {key, value} -> {to_string(key), value} end) |> Map.put("type", "Flag") |> Map.put("skip_preload", true) |> Map.put("preload_report_notes", true) diff --git a/lib/pleroma/web/admin_api/controllers/report_controller.ex b/lib/pleroma/web/admin_api/controllers/report_controller.ex index 23f0174d4..4c011e174 100644 --- a/lib/pleroma/web/admin_api/controllers/report_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/report_controller.ex @@ -18,8 +18,7 @@ defmodule Pleroma.Web.AdminAPI.ReportController do require Logger - @users_page_size 50 - + plug(Pleroma.Web.ApiSpec.CastAndValidate) plug(OAuthScopesPlug, %{scopes: ["read:reports"], admin: true} when action in [:index, :show]) plug( @@ -30,15 +29,15 @@ defmodule Pleroma.Web.AdminAPI.ReportController do action_fallback(AdminAPI.FallbackController) - def index(conn, params) do - {page, page_size} = page_params(params) + defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.Admin.ReportOperation - reports = Utils.get_reports(params, page, page_size) + 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 + 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 @@ -46,32 +45,33 @@ def show(conn, %{"id" => id}) do end end - def update(%{assigns: %{user: admin}} = conn, %{"reports" => reports}) do + def update(%{assigns: %{user: admin}, body_params: %{reports: reports}} = conn, _) 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 - }) + 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 - else - {:error, message} -> %{id: report["id"], error: message} + activity + + {: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, "") + 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}} = conn, %{ - "id" => report_id, - "content" => content + 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(%{ @@ -88,8 +88,8 @@ def notes_create(%{assigns: %{user: user}} = conn, %{ end def notes_delete(%{assigns: %{user: user}} = conn, %{ - "id" => note_id, - "report_id" => report_id + id: note_id, + report_id: report_id }) do with {:ok, note} <- ReportNote.destroy(note_id) do ModerationLog.insert_log(%{ @@ -104,26 +104,4 @@ def notes_delete(%{assigns: %{user: user}} = conn, %{ _ -> json_response(conn, :bad_request, "") end end - - defp page_params(params) do - {get_page(params["page"]), get_page_size(params["page_size"])} - end - - defp get_page(page_string) when is_nil(page_string), do: 1 - - defp get_page(page_string) do - case Integer.parse(page_string) do - {page, _} -> page - :error -> 1 - end - end - - defp get_page_size(page_size_string) when is_nil(page_size_string), do: @users_page_size - - defp get_page_size(page_size_string) do - case Integer.parse(page_size_string) do - {page_size, _} -> page_size - :error -> @users_page_size - end - 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 index 2947e6b34..745399b4b 100644 --- a/lib/pleroma/web/api_spec/operations/admin/status_operation.ex +++ b/lib/pleroma/web/api_spec/operations/admin/status_operation.ex @@ -123,7 +123,7 @@ defp status do } end - defp admin_account do + def admin_account do %Schema{ type: :object, properties: %{ diff --git a/test/web/admin_api/controllers/report_controller_test.exs b/test/web/admin_api/controllers/report_controller_test.exs index 0eddb369c..940bce340 100644 --- a/test/web/admin_api/controllers/report_controller_test.exs +++ b/test/web/admin_api/controllers/report_controller_test.exs @@ -41,7 +41,7 @@ test "returns report by its id", %{conn: conn} do response = conn |> get("/api/pleroma/admin/reports/#{report_id}") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert response["id"] == report_id end @@ -49,7 +49,7 @@ test "returns report by its id", %{conn: conn} do 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) == %{"error" => "Not found"} + assert json_response_and_validate_schema(conn, :not_found) == %{"error" => "Not found"} end end @@ -85,10 +85,11 @@ test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} d 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(403) + |> json_response_and_validate_schema(403) assert response == %{ "error" => "Insufficient permissions: admin:write:reports." @@ -96,20 +97,22 @@ test "requires admin:write:reports scope", %{conn: conn, id: id, admin: admin} d conn |> assign(:token, write_token) + |> put_req_header("content-type", "application/json") |> patch("/api/pleroma/admin/reports", %{ "reports" => [%{"state" => "resolved", "id" => id}] }) - |> json_response(:no_content) + |> 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(:no_content) + |> json_response_and_validate_schema(:no_content) activity = Activity.get_by_id(id) assert activity.data["state"] == "resolved" @@ -122,12 +125,13 @@ test "mark report as resolved", %{conn: conn, id: id, admin: admin} do 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(:no_content) + |> json_response_and_validate_schema(:no_content) activity = Activity.get_by_id(id) assert activity.data["state"] == "closed" @@ -141,25 +145,28 @@ test "closes report", %{conn: conn, id: id, admin: admin} do 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 hd(json_response(conn, :bad_request))["error"] == "Unsupported state" + 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(conn, :bad_request))["error"] == "not_found" + assert hd(json_response_and_validate_schema(conn, :bad_request))["error"] == "not_found" end test "updates state of multiple reports", %{ @@ -169,13 +176,14 @@ test "updates state of multiple reports", %{ 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(:no_content) + |> json_response_and_validate_schema(:no_content) activity = Activity.get_by_id(id) second_activity = Activity.get_by_id(second_report_id) @@ -197,7 +205,7 @@ test "returns empty response when no reports created", %{conn: conn} do response = conn |> get("/api/pleroma/admin/reports") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) assert Enum.empty?(response["reports"]) assert response["total"] == 0 @@ -217,7 +225,7 @@ test "returns reports", %{conn: conn} do response = conn |> get("/api/pleroma/admin/reports") - |> json_response(:ok) + |> json_response_and_validate_schema(:ok) [report] = response["reports"] @@ -248,12 +256,10 @@ test "returns reports with specified state", %{conn: conn} do response = conn - |> get("/api/pleroma/admin/reports", %{ - "state" => "open" - }) - |> json_response(:ok) + |> get("/api/pleroma/admin/reports?state=open") + |> json_response_and_validate_schema(:ok) - [open_report] = response["reports"] + assert [open_report] = response["reports"] assert length(response["reports"]) == 1 assert open_report["id"] == first_report_id @@ -262,27 +268,22 @@ test "returns reports with specified state", %{conn: conn} do response = conn - |> get("/api/pleroma/admin/reports", %{ - "state" => "closed" - }) - |> json_response(:ok) + |> get("/api/pleroma/admin/reports?state=closed") + |> json_response_and_validate_schema(:ok) - [closed_report] = response["reports"] + assert [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 + 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 @@ -302,7 +303,9 @@ test "returns 403 when requested by a non-admin" do test "returns 403 when requested by anonymous" do conn = get(build_conn(), "/api/pleroma/admin/reports") - assert json_response(conn, :forbidden) == %{"error" => "Invalid credentials."} + assert json_response(conn, :forbidden) == %{ + "error" => "Invalid credentials." + } end end @@ -318,11 +321,15 @@ test "returns 403 when requested by anonymous" do status_ids: [activity.id] }) - post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ content: "this is disgusting!" }) - post(conn, "/api/pleroma/admin/reports/#{report_id}/notes", %{ + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/reports/#{report_id}/notes", %{ content: "this is disgusting2!" }) @@ -333,7 +340,7 @@ test "returns 403 when requested by anonymous" do end test "it creates report note", %{admin_id: admin_id, report_id: report_id} do - [note, _] = Repo.all(ReportNote) + assert [note, _] = Repo.all(ReportNote) assert %{ activity_id: ^report_id, @@ -345,7 +352,7 @@ test "it creates report note", %{admin_id: admin_id, report_id: report_id} do test "it returns reports with notes", %{conn: conn, admin: admin} do conn = get(conn, "/api/pleroma/admin/reports") - response = json_response(conn, 200) + response = json_response_and_validate_schema(conn, 200) notes = hd(response["reports"])["notes"] [note, _] = notes @@ -357,8 +364,7 @@ test "it returns reports with notes", %{conn: conn, admin: admin} do test "it deletes the note", %{conn: conn, report_id: report_id} do assert ReportNote |> Repo.all() |> length() == 2 - - [note, _] = Repo.all(ReportNote) + assert [note, _] = Repo.all(ReportNote) delete(conn, "/api/pleroma/admin/reports/#{report_id}/notes/#{note.id}") From c020fd435216012f08812efdb9ee0c05352cec10 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 18:58:58 +0200 Subject: [PATCH 264/492] ChatMessageReferenceView: Return read status as `unread`. --- .../web/pleroma_api/views/chat_message_reference_view.ex | 2 +- .../pleroma_api/views/chat_message_reference_view_test.exs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 index ff170e162..f9405aec5 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex @@ -30,7 +30,7 @@ def render( attachment: chat_message["attachment"] && StatusView.render("attachment.json", attachment: chat_message["attachment"]), - seen: seen + unread: !seen } 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 index 00024d52c..b53bd3490 100644 --- a/test/web/pleroma_api/views/chat_message_reference_view_test.exs +++ b/test/web/pleroma_api/views/chat_message_reference_view_test.exs @@ -40,7 +40,7 @@ test "it displays a chat message" do assert chat_message[:account_id] == user.id assert chat_message[:chat_id] assert chat_message[:created_at] - assert chat_message[:seen] == true + 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) @@ -57,6 +57,6 @@ test "it displays a chat message" do 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[:seen] == false + assert chat_message_two[:unread] == true end end From b3407344d3acafa4a1271289d985632c058e7a6e Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 19:21:23 +0200 Subject: [PATCH 265/492] ChatController: Add function to mark single message as read. --- lib/pleroma/chat_message_reference.ex | 6 ++++ .../web/api_spec/operations/chat_operation.ex | 31 +++++++++++++++++-- .../controllers/chat_controller.ex | 23 +++++++++++++- lib/pleroma/web/router.ex | 1 + .../controllers/chat_controller_test.exs | 28 +++++++++++++++++ 5 files changed, 86 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat_message_reference.ex index ad174b294..9b00443f5 100644 --- a/lib/pleroma/chat_message_reference.ex +++ b/lib/pleroma/chat_message_reference.ex @@ -92,6 +92,12 @@ def unread_count_for_chat(chat) do |> Repo.aggregate(:count) end + def mark_as_read(cm_ref) do + cm_ref + |> changeset(%{seen: true}) + |> Repo.update() + end + def set_all_seen_for_chat(chat) do chat |> for_chat_query() diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index a1c5db5dc..6ad325113 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -39,6 +39,31 @@ def mark_as_read_operation do } 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"] + } + ] + } + end + def show_operation do %Operation{ tags: ["chat"], @@ -274,7 +299,8 @@ def chat_messages_response do "content" => "Check this out :firefox:", "id" => "13", "chat_id" => "1", - "actor_id" => "someflakeid" + "actor_id" => "someflakeid", + "unread" => false }, %{ "actor_id" => "someflakeid", @@ -282,7 +308,8 @@ def chat_messages_response do "id" => "12", "chat_id" => "1", "emojis" => [], - "created_at" => "2020-04-21T15:06:45.000Z" + "created_at" => "2020-04-21T15:06:45.000Z", + "unread" => false } ] } diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 29922da99..01d47045d 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -24,7 +24,13 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do plug( OAuthScopesPlug, %{scopes: ["write:statuses"]} - when action in [:post_chat_message, :create, :mark_as_read, :delete_message] + when action in [ + :post_chat_message, + :create, + :mark_as_read, + :mark_message_as_read, + :delete_message + ] ) plug( @@ -88,6 +94,21 @@ def post_chat_message( end end + def mark_message_as_read(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ + id: chat_id, + message_id: message_id + }) do + with %ChatMessageReference{} = cm_ref <- + ChatMessageReference.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} <- ChatMessageReference.mark_as_read(cm_ref) do + conn + |> put_view(ChatMessageReferenceView) + |> render("show.json", for: user, chat_message_reference: cm_ref) + end + end + def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), {_n, _} <- ChatMessageReference.set_all_seen_for_chat(chat) do diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index fef277ac6..fd2dc82ca 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -313,6 +313,7 @@ defmodule Pleroma.Web.Router do 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) get("/conversations/:id/statuses", ConversationController, :statuses) get("/conversations/:id", ConversationController, :show) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index e62b71799..e7892142a 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -13,6 +13,33 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do import Pleroma.Factory + describe "POST /api/v1/pleroma/chats/:id/messages/:message_id/read" do + setup do: oauth_access(["write:statuses"]) + + 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 = ChatMessageReference.for_chat_and_object(chat, object) + + assert cm_ref.seen == false + + 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 = ChatMessageReference.for_chat_and_object(chat, object) + + assert cm_ref.seen == true + end + end + describe "POST /api/v1/pleroma/chats/:id/read" do setup do: oauth_access(["write:statuses"]) @@ -20,6 +47,7 @@ test "it marks all messages in a chat 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 = ChatMessageReference.for_chat_and_object(chat, object) From 286bd8eb83e3fd9a2546e27c5e5d98f5316934a0 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 19:24:37 +0200 Subject: [PATCH 266/492] Docs: Add `mark_message_as_read` to docs --- docs/API/chats.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index d1d39f495..c0ef75664 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -94,6 +94,15 @@ Returned data: } ``` +### 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 @@ -149,7 +158,8 @@ Returned data: "visible_in_picker": false } ], - "id": "13" + "id": "13", + "unread": true }, { "account_id": "someflakeid", @@ -157,7 +167,8 @@ Returned data: "content": "Whats' up?", "created_at": "2020-04-21T15:06:45.000Z", "emojis": [], - "id": "12" + "id": "12", + "unread": false } ] ``` @@ -190,7 +201,8 @@ Returned data: "visible_in_picker": false } ], - "id": "13" + "id": "13", + "unread": false } ``` @@ -215,7 +227,8 @@ There's a new `pleroma:chat_mention` notification, which has this form. It is no "chat_id": "1", "id": "10", "content": "Hello", - "account_id": "someflakeid" + "account_id": "someflakeid", + "unread": false }, "created_at": "somedate" } From e213e3157737f87513999ef2aa00dffa735a8ada Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 19:25:57 +0200 Subject: [PATCH 267/492] Changelog: Add chats to changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 839bf90ab..1cf2210f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **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. From aa26dc6a130614b049696784ecb29e341956bbc2 Mon Sep 17 00:00:00 2001 From: stwf Date: Wed, 3 Jun 2020 13:40:48 -0400 Subject: [PATCH 268/492] add status_net/config --- config/config.exs | 3 ++- lib/pleroma/web/preload.ex | 10 +++++--- lib/pleroma/web/preload/status_net.ex | 24 +++++++++++++++++++ .../controllers/util_controller.ex | 13 ++-------- .../web/twitter_api/views/util_view.ex | 14 +++++++++++ test/web/preload/status_net_test.exs | 14 +++++++++++ 6 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 lib/pleroma/web/preload/status_net.ex create mode 100644 test/web/preload/status_net_test.exs diff --git a/config/config.exs b/config/config.exs index 1539b15c6..394c24d85 100644 --- a/config/config.exs +++ b/config/config.exs @@ -419,7 +419,8 @@ providers: [ Pleroma.Web.Preload.Providers.Instance, Pleroma.Web.Preload.Providers.User, - Pleroma.Web.Preload.Providers.Timelines + Pleroma.Web.Preload.Providers.Timelines, + Pleroma.Web.Preload.Providers.StatusNet ] config :pleroma, :http_security, diff --git a/lib/pleroma/web/preload.ex b/lib/pleroma/web/preload.ex index f13932b89..90e454468 100644 --- a/lib/pleroma/web/preload.ex +++ b/lib/pleroma/web/preload.ex @@ -9,7 +9,13 @@ defmodule Pleroma.Web.Preload do def build_tags(_conn, params) do preload_data = Enum.reduce(Pleroma.Config.get([__MODULE__, :providers], []), %{}, fn parser, acc -> - Map.merge(acc, parser.generate_terms(params)) + 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 = @@ -22,8 +28,6 @@ def build_tags(_conn, params) do end def build_script_tag(content) do - content = Base.encode64(content) - HTML.Tag.content_tag(:script, HTML.raw(content), id: "initial-results", type: "application/json" diff --git a/lib/pleroma/web/preload/status_net.ex b/lib/pleroma/web/preload/status_net.ex new file mode 100644 index 000000000..7e592d60d --- /dev/null +++ b/lib/pleroma/web/preload/status_net.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.Preload.Providers.StatusNet do + alias Pleroma.Web.TwitterAPI.UtilView + alias Pleroma.Web.Preload.Providers.Provider + + @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 + instance = Pleroma.Config.get(:instance) + info_data = UtilView.status_net_config(instance) + + Map.put(acc, @config_url, info_data) + end +end 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 @@ def notifications_read(%{assigns: %{user: user}} = conn, %{"id" => notification_ 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/test/web/preload/status_net_test.exs b/test/web/preload/status_net_test.exs new file mode 100644 index 000000000..ab6823a7e --- /dev/null +++ b/test/web/preload/status_net_test.exs @@ -0,0 +1,14 @@ +# 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 info =~ "Pleroma" + end +end From e46aecda55b20c0d48463fb2a5c0040d4fc34e97 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 3 Jun 2020 20:51:59 +0200 Subject: [PATCH 269/492] Notification: Fix notifications backfill for compacted activities --- lib/pleroma/notification.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 0f33d282d..455d214bf 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -412,7 +412,7 @@ defp type_from_activity_object(%{data: %{"type" => "Create", "object" => %{}}}), defp type_from_activity_object(%{data: %{"type" => "Create"}} = activity) do object = Object.get_by_ap_id(activity.data["object"]) - case object.data["type"] do + case object && object.data["type"] do "ChatMessage" -> "pleroma:chat_mention" _ -> "mention" end From 29ae5bb77166d9d7f8108a965b0c3d147b747e80 Mon Sep 17 00:00:00 2001 From: stwf Date: Tue, 12 May 2020 11:08:00 -0400 Subject: [PATCH 270/492] preload data into index.html --- config/config.exs | 25 ++-- .../web/fallback_redirect_controller.ex | 82 +++++++---- lib/pleroma/web/nodeinfo/nodeinfo.ex | 130 ++++++++++++++++++ .../web/nodeinfo/nodeinfo_controller.ex | 112 ++------------- lib/pleroma/web/preload.ex | 30 ++++ lib/pleroma/web/preload/instance.ex | 49 +++++++ lib/pleroma/web/preload/provider.ex | 7 + lib/pleroma/web/preload/timelines.ex | 42 ++++++ lib/pleroma/web/preload/user.ex | 25 ++++ lib/pleroma/web/router.ex | 2 +- test/plugs/instance_static_test.exs | 2 +- test/web/fallback_test.exs | 38 +++-- test/web/preload/instance_test.exs | 37 +++++ test/web/preload/timeline_test.exs | 74 ++++++++++ test/web/preload/user_test.exs | 33 +++++ 15 files changed, 532 insertions(+), 156 deletions(-) create mode 100644 lib/pleroma/web/nodeinfo/nodeinfo.ex create mode 100644 lib/pleroma/web/preload.ex create mode 100644 lib/pleroma/web/preload/instance.ex create mode 100644 lib/pleroma/web/preload/provider.ex create mode 100644 lib/pleroma/web/preload/timelines.ex create mode 100644 lib/pleroma/web/preload/user.ex create mode 100644 test/web/preload/instance_test.exs create mode 100644 test/web/preload/timeline_test.exs create mode 100644 test/web/preload/user_test.exs diff --git a/config/config.exs b/config/config.exs index 9508ae077..ee81eb899 100644 --- a/config/config.exs +++ b/config/config.exs @@ -241,18 +241,7 @@ account_field_value_length: 2048, external_user_synchronization: true, extended_nickname_format: true, - cleanup_attachments: false, - multi_factor_authentication: [ - totp: [ - # digits 6 or 8 - digits: 6, - period: 30 - ], - backup_codes: [ - number: 5, - length: 16 - ] - ] + cleanup_attachments: false config :pleroma, :feed, post_title: %{ @@ -361,8 +350,7 @@ reject: [], accept: [], avatar_removal: [], - banner_removal: [], - reject_deletes: [] + banner_removal: [] config :pleroma, :mrf_keyword, reject: [], @@ -428,6 +416,13 @@ ], unfurl_nsfw: false +config :pleroma, Pleroma.Web.Preload, + providers: [ + Pleroma.Web.Preload.Providers.Instance, + Pleroma.Web.Preload.Providers.User, + Pleroma.Web.Preload.Providers.Timelines + ] + config :pleroma, :http_security, enabled: true, sts: false, @@ -682,8 +677,6 @@ profiles: %{local: false, remote: false}, activities: %{local: false, remote: false} -config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false - # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex index 0d9d578fc..932fb8d7e 100644 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ b/lib/pleroma/web/fallback_redirect_controller.ex @@ -4,11 +4,10 @@ defmodule Fallback.RedirectController do use Pleroma.Web, :controller - require Logger - alias Pleroma.User alias Pleroma.Web.Metadata + alias Pleroma.Web.Preload def api_not_implemented(conn, _params) do conn @@ -16,16 +15,7 @@ def api_not_implemented(conn, _params) 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 +33,34 @@ def redirector_with_meta(conn, %{"maybe_nickname_or_id" => maybe_nickname_or_id} 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__) - ) + tags = build_tags(conn, params) + preloads = preload_data(conn, params) - "" - end - - response = String.replace(index_content, "", tags) + response = + index_content + |> String.replace("", tags) + |> String.replace("", 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 +72,36 @@ def empty(conn, _params) 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/nodeinfo/nodeinfo.ex b/lib/pleroma/web/nodeinfo/nodeinfo.ex new file mode 100644 index 000000000..d26b7c938 --- /dev/null +++ b/lib/pleroma/web/nodeinfo/nodeinfo.ex @@ -0,0 +1,130 @@ +# 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.ActivityPub.MRF + alias Pleroma.Web.Federator.Publisher + + # 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() + + quarantined = Config.get([:instance, :quarantined_instances], []) + + staff_accounts = + User.all_superusers() + |> Enum.map(fn u -> u.ap_id end) + + federation_response = + if Config.get([:instance, :mrf_transparency]) do + {:ok, data} = MRF.describe() + + data + |> Map.merge(%{quarantined_instances: quarantined}) + else + %{} + end + |> Map.put(:enabled, Config.get([:instance, :federating])) + + features = + [ + "pleroma_api", + "mastodon_api", + "mastodon_api_streaming", + "polls", + "pleroma_explicit_addressing", + "shareable_emoji_packs", + "multifetch", + "pleroma:api/v1/notifications:include_types_filter", + if Config.get([:media_proxy, :enabled]) do + "media_proxy" + end, + if Config.get([:gopher, :enabled]) do + "gopher" + end, + if Config.get([:chat, :enabled]) do + "chat" + end, + if Config.get([:instance, :allow_relay]) do + "relay" + end, + if Config.get([:instance, :safe_dm_mentions]) do + "safe_dm_mentions" + end, + "pleroma_emoji_reactions" + ] + |> Enum.filter(& &1) + + %{ + 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_response, + 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 @@ def schemas(conn, _params) 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" => version}) do + case Nodeinfo.get_nodeinfo(version) do + {:error, :missing} -> + render_error(conn, :not_found, "Nodeinfo schema version not handled") - 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") + 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/preload.ex b/lib/pleroma/web/preload.ex new file mode 100644 index 000000000..c2211c597 --- /dev/null +++ b/lib/pleroma/web/preload.ex @@ -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.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 -> + Map.merge(acc, parser.generate_terms(params)) + 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..0b6fd3313 --- /dev/null +++ b/lib/pleroma/web/preload/instance.ex @@ -0,0 +1,49 @@ +# 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.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" + + @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 = Path.join(:code.priv_dir(:pleroma), "static/instance/panel.html") + + 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/timelines.ex b/lib/pleroma/web/preload/timelines.ex new file mode 100644 index 000000000..dbd7db407 --- /dev/null +++ b/lib/pleroma/web/preload/timelines.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.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(%{}) + end + + def build_public_tag(acc) do + if Pleroma.Config.get([:restrict_unauthenticated, :timelines, :federated], true) do + acc + else + Map.put(acc, @public_url, public_timeline(nil)) + end + end + + defp public_timeline(user) do + activities = + create_timeline_params(user) + |> Map.put("local_only", false) + |> ActivityPub.fetch_public_activities() + + StatusView.render("index.json", activities: activities, for: user, as: :activity) + end + + defp create_timeline_params(user) do + %{} + |> Map.put("type", ["Create", "Announce"]) + |> Map.put("blocking_user", user) + |> Map.put("muting_user", user) + |> Map.put("user", user) + end +end diff --git a/lib/pleroma/web/preload/user.ex b/lib/pleroma/web/preload/user.ex new file mode 100644 index 000000000..3a244845b --- /dev/null +++ b/lib/pleroma/web/preload/user.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.User do + alias Pleroma.Web.MastodonAPI.AccountView + alias Pleroma.Web.Preload.Providers.Provider + + @behaviour Provider + @account_url :"/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, nil), do: acc + + def build_accounts_tag(acc, user) do + account_data = AccountView.render("show.json", %{user: user, for: user}) + Map.put(acc, @account_url, account_data) + end +end diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex index 80ea28364..3b55afede 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -718,7 +718,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/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/web/fallback_test.exs b/test/web/fallback_test.exs index 3919ef93a..3b7a51d5e 100644 --- a/test/web/fallback_test.exs +++ b/test/web/fallback_test.exs @@ -6,22 +6,36 @@ 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) =~ "" + assert html_response(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) =~ "" - refute conn - |> get("/" <> user.nickname) - |> html_response(200) =~ "" + assert html_response(user_missing, 200) =~ "" + refute html_response(user_present, 200) =~ "" + end + end + + describe "preloaded data only attached to" do + test "GET /*path", %{conn: conn} do + public_page = get(conn, "/main/public") + + assert html_response(public_page, 200) =~ "" + refute html_response(public_page, 200) =~ "" + end end test "GET /api*path", %{conn: conn} do diff --git a/test/web/preload/instance_test.exs b/test/web/preload/instance_test.exs new file mode 100644 index 000000000..52f9bab3b --- /dev/null +++ b/test/web/preload/instance_test.exs @@ -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.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, "A Pleroma instance, an alternative fediverse server") + end + + test "it renders the panel", %{"/instance/panel.html": panel} do + assert String.contains?( + panel, + "

Welcome to Pleroma!

" + ) + end + + test "it renders the node_info", %{"/nodeinfo/2.0": 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/timeline_test.exs b/test/web/preload/timeline_test.exs new file mode 100644 index 000000000..00b10d0ab --- /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..99232cdfa --- /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 + refute User.generate_terms(%{user: nil}) + |> Map.has_key?("/api/v1/accounts") + end + + test "missing user specified" do + refute User.generate_terms(%{user: :not_a_user}) + |> Map.has_key?("/api/v1/accounts") + end + end + + describe "specified user exists" do + setup do + user = insert(:user) + + {:ok, User.generate_terms(%{user: user})} + end + + test "account is rendered", %{"/api/v1/accounts": accounts} do + assert %{acct: user, username: user} = accounts + end + end +end From dbcc1b105ee1a2552595d189d8ac9d8484ffb601 Mon Sep 17 00:00:00 2001 From: stwf Date: Tue, 2 Jun 2020 10:18:06 -0400 Subject: [PATCH 271/492] encode data properly --- .../web/fallback_redirect_controller.ex | 7 +-- lib/pleroma/web/preload.ex | 2 + lib/pleroma/web/preload/timelines.ex | 31 ++++++------- test/web/fallback_test.exs | 46 +++++++++++-------- test/web/preload/timeline_test.exs | 12 ++--- 5 files changed, 54 insertions(+), 44 deletions(-) diff --git a/lib/pleroma/web/fallback_redirect_controller.ex b/lib/pleroma/web/fallback_redirect_controller.ex index 932fb8d7e..431ad5485 100644 --- a/lib/pleroma/web/fallback_redirect_controller.ex +++ b/lib/pleroma/web/fallback_redirect_controller.ex @@ -4,7 +4,9 @@ defmodule Fallback.RedirectController do use Pleroma.Web, :controller + require Logger + alias Pleroma.User alias Pleroma.Web.Metadata alias Pleroma.Web.Preload @@ -38,8 +40,7 @@ def redirector_with_meta(conn, params) do response = index_content - |> String.replace("", tags) - |> String.replace("", preloads) + |> String.replace("", tags <> preloads) conn |> put_resp_content_type("text/html") @@ -56,7 +57,7 @@ def redirector_with_preload(conn, params) do response = index_content - |> String.replace("", preloads) + |> String.replace("", preloads) conn |> put_resp_content_type("text/html") diff --git a/lib/pleroma/web/preload.ex b/lib/pleroma/web/preload.ex index c2211c597..f13932b89 100644 --- a/lib/pleroma/web/preload.ex +++ b/lib/pleroma/web/preload.ex @@ -22,6 +22,8 @@ def build_tags(_conn, params) do end def build_script_tag(content) do + content = Base.encode64(content) + HTML.Tag.content_tag(:script, HTML.raw(content), id: "initial-results", type: "application/json" diff --git a/lib/pleroma/web/preload/timelines.ex b/lib/pleroma/web/preload/timelines.ex index dbd7db407..2bb57567b 100644 --- a/lib/pleroma/web/preload/timelines.ex +++ b/lib/pleroma/web/preload/timelines.ex @@ -11,32 +11,29 @@ defmodule Pleroma.Web.Preload.Providers.Timelines do @public_url :"/api/v1/timelines/public" @impl Provider - def generate_terms(_params) do - build_public_tag(%{}) + def generate_terms(params) do + build_public_tag(%{}, params) end - def build_public_tag(acc) do + 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(nil)) + Map.put(acc, @public_url, public_timeline(params)) end end - defp public_timeline(user) do + 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 = - create_timeline_params(user) - |> Map.put("local_only", false) - |> ActivityPub.fetch_public_activities() + ActivityPub.fetch_public_activities(%{ + "type" => ["Create"], + "local_only" => local_only + }) - StatusView.render("index.json", activities: activities, for: user, as: :activity) - end - - defp create_timeline_params(user) do - %{} - |> Map.put("type", ["Create", "Announce"]) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) + StatusView.render("index.json", activities: activities, for: nil, as: :activity) end end diff --git a/test/web/fallback_test.exs b/test/web/fallback_test.exs index 3b7a51d5e..a65865860 100644 --- a/test/web/fallback_test.exs +++ b/test/web/fallback_test.exs @@ -11,7 +11,12 @@ test "GET /registration/:token", %{conn: conn} do response = get(conn, "/registration/foo") assert html_response(response, 200) =~ "" - assert html_response(response, 200) =~ "" + end + + test "GET /*path", %{conn: conn} do + assert conn + |> get("/foo") + |> html_response(200) =~ "" end end @@ -21,20 +26,35 @@ test "GET /:maybe_nickname_or_id", %{conn: conn} do user_missing = get(conn, "/foo") user_present = get(conn, "/#{user.nickname}") - assert html_response(user_missing, 200) =~ "" + assert(html_response(user_missing, 200) =~ "") refute html_response(user_present, 200) =~ "" + assert html_response(user_present, 200) =~ "initial-results" + end - assert html_response(user_missing, 200) =~ "" - refute html_response(user_present, 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 only attached to" do - test "GET /*path", %{conn: conn} do + describe "preloaded data is attached to" do + test "GET /main/public", %{conn: conn} do public_page = get(conn, "/main/public") - assert html_response(public_page, 200) =~ "" - refute html_response(public_page, 200) =~ "" + 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 @@ -48,16 +68,6 @@ test "GET /pleroma/admin -> /pleroma/admin/", %{conn: conn} 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/preload/timeline_test.exs b/test/web/preload/timeline_test.exs index 00b10d0ab..da6a3aded 100644 --- a/test/web/preload/timeline_test.exs +++ b/test/web/preload/timeline_test.exs @@ -52,9 +52,9 @@ test "returns the timeline when not restricted" do 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!"}) + {: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) @@ -62,9 +62,9 @@ test "returns public items", %{user: user} do 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!"}) + {: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) From 3b8180d7d1f52a9eae1913a59b9c970f6600e674 Mon Sep 17 00:00:00 2001 From: stwf Date: Wed, 3 Jun 2020 13:40:48 -0400 Subject: [PATCH 272/492] add status_net/config --- config/config.exs | 3 ++- lib/pleroma/web/preload.ex | 10 +++++--- lib/pleroma/web/preload/status_net.ex | 24 +++++++++++++++++++ .../controllers/util_controller.ex | 13 ++-------- .../web/twitter_api/views/util_view.ex | 14 +++++++++++ test/web/preload/status_net_test.exs | 14 +++++++++++ 6 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 lib/pleroma/web/preload/status_net.ex create mode 100644 test/web/preload/status_net_test.exs diff --git a/config/config.exs b/config/config.exs index ee81eb899..0dca26152 100644 --- a/config/config.exs +++ b/config/config.exs @@ -420,7 +420,8 @@ providers: [ Pleroma.Web.Preload.Providers.Instance, Pleroma.Web.Preload.Providers.User, - Pleroma.Web.Preload.Providers.Timelines + Pleroma.Web.Preload.Providers.Timelines, + Pleroma.Web.Preload.Providers.StatusNet ] config :pleroma, :http_security, diff --git a/lib/pleroma/web/preload.ex b/lib/pleroma/web/preload.ex index f13932b89..90e454468 100644 --- a/lib/pleroma/web/preload.ex +++ b/lib/pleroma/web/preload.ex @@ -9,7 +9,13 @@ defmodule Pleroma.Web.Preload do def build_tags(_conn, params) do preload_data = Enum.reduce(Pleroma.Config.get([__MODULE__, :providers], []), %{}, fn parser, acc -> - Map.merge(acc, parser.generate_terms(params)) + 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 = @@ -22,8 +28,6 @@ def build_tags(_conn, params) do end def build_script_tag(content) do - content = Base.encode64(content) - HTML.Tag.content_tag(:script, HTML.raw(content), id: "initial-results", type: "application/json" diff --git a/lib/pleroma/web/preload/status_net.ex b/lib/pleroma/web/preload/status_net.ex new file mode 100644 index 000000000..7e592d60d --- /dev/null +++ b/lib/pleroma/web/preload/status_net.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.Preload.Providers.StatusNet do + alias Pleroma.Web.TwitterAPI.UtilView + alias Pleroma.Web.Preload.Providers.Provider + + @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 + instance = Pleroma.Config.get(:instance) + info_data = UtilView.status_net_config(instance) + + Map.put(acc, @config_url, info_data) + end +end 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 @@ def notifications_read(%{assigns: %{user: user}} = conn, %{"id" => notification_ 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/test/web/preload/status_net_test.exs b/test/web/preload/status_net_test.exs new file mode 100644 index 000000000..ab6823a7e --- /dev/null +++ b/test/web/preload/status_net_test.exs @@ -0,0 +1,14 @@ +# 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 info =~ "Pleroma" + end +end From 5677b21e824aa7f3b5124068ef65041e04002579 Mon Sep 17 00:00:00 2001 From: stwf Date: Wed, 3 Jun 2020 16:32:38 -0400 Subject: [PATCH 273/492] clean up --- config/config.exs | 18 ++++++++++++++++-- lib/pleroma/web/preload/status_net.ex | 2 +- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/config/config.exs b/config/config.exs index 0dca26152..6e75b79ec 100644 --- a/config/config.exs +++ b/config/config.exs @@ -241,7 +241,18 @@ account_field_value_length: 2048, external_user_synchronization: true, extended_nickname_format: true, - cleanup_attachments: false + cleanup_attachments: false, + multi_factor_authentication: [ + totp: [ + # digits 6 or 8 + digits: 6, + period: 30 + ], + backup_codes: [ + number: 5, + length: 16 + ] + ] config :pleroma, :feed, post_title: %{ @@ -350,7 +361,8 @@ reject: [], accept: [], avatar_removal: [], - banner_removal: [] + banner_removal: [], + reject_deletes: [] config :pleroma, :mrf_keyword, reject: [], @@ -678,6 +690,8 @@ profiles: %{local: false, remote: false}, activities: %{local: false, remote: false} +config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/lib/pleroma/web/preload/status_net.ex b/lib/pleroma/web/preload/status_net.ex index 7e592d60d..367442d5c 100644 --- a/lib/pleroma/web/preload/status_net.ex +++ b/lib/pleroma/web/preload/status_net.ex @@ -3,8 +3,8 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.Preload.Providers.StatusNet do - alias Pleroma.Web.TwitterAPI.UtilView alias Pleroma.Web.Preload.Providers.Provider + alias Pleroma.Web.TwitterAPI.UtilView @behaviour Provider @config_url :"/api/statusnet/config.json" From 75e886b5065dd5ef6b7c99cbbe162f405e1b105e Mon Sep 17 00:00:00 2001 From: stwf Date: Wed, 3 Jun 2020 17:32:03 -0400 Subject: [PATCH 274/492] fix config --- config/config.exs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/config/config.exs b/config/config.exs index 0dca26152..6e75b79ec 100644 --- a/config/config.exs +++ b/config/config.exs @@ -241,7 +241,18 @@ account_field_value_length: 2048, external_user_synchronization: true, extended_nickname_format: true, - cleanup_attachments: false + cleanup_attachments: false, + multi_factor_authentication: [ + totp: [ + # digits 6 or 8 + digits: 6, + period: 30 + ], + backup_codes: [ + number: 5, + length: 16 + ] + ] config :pleroma, :feed, post_title: %{ @@ -350,7 +361,8 @@ reject: [], accept: [], avatar_removal: [], - banner_removal: [] + banner_removal: [], + reject_deletes: [] config :pleroma, :mrf_keyword, reject: [], @@ -678,6 +690,8 @@ profiles: %{local: false, remote: false}, activities: %{local: false, remote: false} +config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" From a8132690bd80b83fc0057566d78a49eceefe0349 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 4 Jun 2020 13:46:13 +0400 Subject: [PATCH 275/492] Fix credo --- test/web/admin_api/controllers/admin_api_controller_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index f4c37ae6e..2aaec510d 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1744,7 +1744,6 @@ test "it resend emails for two users", %{conn: conn, admin: admin} do end end - describe "/api/pleroma/admin/stats" do test "status visibility count", %{conn: conn} do admin = insert(:user, is_admin: true) From 5d7dda883e76041025384e453da74110c550aa3b Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 14:46:41 +0200 Subject: [PATCH 276/492] SideEffectsTest: More tests. --- test/web/activity_pub/side_effects_test.exs | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 92c266d84..82d72119e 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -321,7 +321,27 @@ test "it streams the created ChatMessage" do {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) - with_mock Pleroma.Web.Streamer, [], stream: fn _, _ -> nil end do + with_mock Pleroma.Web.Streamer, [], + stream: fn _, payload -> + case payload do + {^author, cm_ref} -> + assert cm_ref.seen == true + + {^recipient, cm_ref} -> + assert cm_ref.seen == false + + view = + Pleroma.Web.PleromaAPI.ChatView.render("show.json", + last_message: cm_ref, + chat: cm_ref.chat + ) + + assert view.unread == 1 + + _ -> + nil + end + end do {:ok, _create_activity, _meta} = SideEffects.handle(create_activity, local: false, object_data: chat_message_data) From b952f3f37907c735e3426ba43d01027f6f49c5b5 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 14:49:10 +0200 Subject: [PATCH 277/492] WebPush: Push out chat message notications. --- lib/pleroma/web/push/impl.ex | 3 ++- lib/pleroma/web/push/subscription.ex | 2 +- test/web/push/impl_test.exs | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index 125f33755..006a242af 100644 --- a/lib/pleroma/web/push/impl.ex +++ b/lib/pleroma/web/push/impl.ex @@ -32,7 +32,7 @@ def perform( 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) @@ -171,6 +171,7 @@ def format_title(%{type: type}, mastodon_type) do "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/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 26c65bc82..8fb7faaa5 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -5,6 +5,7 @@ defmodule Pleroma.Web.Push.ImplTest do use Pleroma.DataCase + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.CommonAPI @@ -196,6 +197,22 @@ test "renders title for create activity with direct visibility" 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 "hides details for notifications when privacy option enabled" do user = insert(:user, nickname: "Bob") user2 = insert(:user, nickname: "Rob", notification_settings: %{privacy_option: true}) From 6e103a18af6cfd7f454a911e2f0e1ae35cd45aa4 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 14:49:36 +0200 Subject: [PATCH 278/492] Docs: Document WebPush changes. --- docs/API/chats.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/API/chats.md b/docs/API/chats.md index c0ef75664..abeee698f 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -237,3 +237,7 @@ There's a new `pleroma:chat_mention` notification, which has this form. It is no ### 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. From a42d135cce3e6326cd8a16f08f4ab83633386c2e Mon Sep 17 00:00:00 2001 From: stwf Date: Thu, 4 Jun 2020 10:51:24 -0400 Subject: [PATCH 279/492] test fix --- test/web/preload/instance_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/preload/instance_test.exs b/test/web/preload/instance_test.exs index 52f9bab3b..42a0d87bc 100644 --- a/test/web/preload/instance_test.exs +++ b/test/web/preload/instance_test.exs @@ -15,7 +15,7 @@ test "it renders the info", %{"/api/v1/instance": info} do registrations: true } = info - assert String.equivalent?(description, "A Pleroma instance, an alternative fediverse server") + assert String.equivalent?(description, "Pleroma: An efficient and flexible fediverse server") end test "it renders the panel", %{"/instance/panel.html": panel} do From 00748e9650e911d828dfe6f769ac20a6b31c8b69 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 17:14:42 +0200 Subject: [PATCH 280/492] ChatMessageReferences: Change seen -> unread --- lib/pleroma/chat_message_reference.ex | 18 +++++------ lib/pleroma/web/activity_pub/side_effects.ex | 2 +- .../views/chat_message_reference_view.ex | 4 +-- ...n_to_unread_in_chat_message_references.exs | 30 +++++++++++++++++++ test/web/activity_pub/side_effects_test.exs | 8 ++--- .../controllers/chat_controller_test.exs | 8 ++--- 6 files changed, 50 insertions(+), 20 deletions(-) create mode 100644 priv/repo/migrations/20200604150318_migrate_seen_to_unread_in_chat_message_references.exs diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat_message_reference.ex index 9b00443f5..fc2aaae7a 100644 --- a/lib/pleroma/chat_message_reference.ex +++ b/lib/pleroma/chat_message_reference.ex @@ -23,15 +23,15 @@ defmodule Pleroma.ChatMessageReference do belongs_to(:object, Object) belongs_to(:chat, Chat) - field(:seen, :boolean, default: false) + field(:unread, :boolean, default: true) timestamps() end def changeset(struct, params) do struct - |> cast(params, [:object_id, :chat_id, :seen]) - |> validate_required([:object_id, :chat_id, :seen]) + |> cast(params, [:object_id, :chat_id, :unread]) + |> validate_required([:object_id, :chat_id, :unread]) end def get_by_id(id) do @@ -73,11 +73,11 @@ def last_message_for_chat(chat) do |> Repo.one() end - def create(chat, object, seen) do + def create(chat, object, unread) do params = %{ chat_id: chat.id, object_id: object.id, - seen: seen + unread: unread } %__MODULE__{} @@ -88,13 +88,13 @@ def create(chat, object, seen) do def unread_count_for_chat(chat) do chat |> for_chat_query() - |> where([cmr], cmr.seen == false) + |> where([cmr], cmr.unread == true) |> Repo.aggregate(:count) end def mark_as_read(cm_ref) do cm_ref - |> changeset(%{seen: true}) + |> changeset(%{unread: false}) |> Repo.update() end @@ -103,7 +103,7 @@ def set_all_seen_for_chat(chat) do |> for_chat_query() |> exclude(:order_by) |> exclude(:preload) - |> where([cmr], cmr.seen == false) - |> Repo.update_all(set: [seen: true]) + |> where([cmr], cmr.unread == true) + |> Repo.update_all(set: [unread: false]) end end diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 0c5709356..e9f109d80 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -140,7 +140,7 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do |> Enum.each(fn [user, other_user] -> if user.local do {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) - {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id == actor.ap_id) + {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id != actor.ap_id) Streamer.stream( ["user", "user:pleroma_chat"], 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 index f9405aec5..592bb17f0 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex @@ -16,7 +16,7 @@ def render( id: id, object: %{data: chat_message}, chat_id: chat_id, - seen: seen + unread: unread } } ) do @@ -30,7 +30,7 @@ def render( attachment: chat_message["attachment"] && StatusView.render("attachment.json", attachment: chat_message["attachment"]), - unread: !seen + unread: unread } 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/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 82d72119e..40df664eb 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -325,10 +325,10 @@ test "it streams the created ChatMessage" do stream: fn _, payload -> case payload do {^author, cm_ref} -> - assert cm_ref.seen == true + assert cm_ref.unread == false {^recipient, cm_ref} -> - assert cm_ref.seen == false + assert cm_ref.unread == true view = Pleroma.Web.PleromaAPI.ChatView.render("show.json", @@ -369,14 +369,14 @@ test "it creates a Chat and ChatMessageReferences for the local users and bumps [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() assert cm_ref.object.data["content"] == "hey" - assert cm_ref.seen == true + assert cm_ref.unread == false chat = Chat.get(recipient.id, author.ap_id) [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() assert cm_ref.object.data["content"] == "hey" - assert cm_ref.seen == false + assert cm_ref.unread == true end test "it creates a Chat for the local users and bumps the unread count" do diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index e7892142a..7af6dec1c 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -25,7 +25,7 @@ test "it marks one message as read", %{conn: conn, user: user} do object = Object.normalize(create, false) cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert cm_ref.seen == false + assert cm_ref.unread == true result = conn @@ -36,7 +36,7 @@ test "it marks one message as read", %{conn: conn, user: user} do cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert cm_ref.seen == true + assert cm_ref.unread == false end end @@ -52,7 +52,7 @@ test "it marks all messages in a chat as read", %{conn: conn, user: user} do object = Object.normalize(create, false) cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert cm_ref.seen == false + assert cm_ref.unread == true result = conn @@ -63,7 +63,7 @@ test "it marks all messages in a chat as read", %{conn: conn, user: user} do cm_ref = ChatMessageReference.for_chat_and_object(chat, object) - assert cm_ref.seen == true + assert cm_ref.unread == false end end From 41503b167335a5f54eb122ecfd945018c9b50f90 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 15:16:10 +0000 Subject: [PATCH 281/492] Apply suggestion to test/web/activity_pub/transmogrifier/chat_message_test.exs --- test/web/activity_pub/transmogrifier/chat_message_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/activity_pub/transmogrifier/chat_message_test.exs b/test/web/activity_pub/transmogrifier/chat_message_test.exs index 820090de3..d6736dc3e 100644 --- a/test/web/activity_pub/transmogrifier/chat_message_test.exs +++ b/test/web/activity_pub/transmogrifier/chat_message_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier.ChatMessageTest do alias Pleroma.Web.ActivityPub.Transmogrifier describe "handle_incoming" do - test "handles this" do + test "handles chonks with attachment" do data = %{ "@context" => "https://www.w3.org/ns/activitystreams", "actor" => "https://honk.tedunangst.com/u/tedu", From 9a53f619e03cd515460a7b1570d339e4554e1740 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 15:16:15 +0000 Subject: [PATCH 282/492] Apply suggestion to test/chat_message_reference_test.exs --- test/chat_message_reference_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/chat_message_reference_test.exs b/test/chat_message_reference_test.exs index 963a0e225..66bf493b4 100644 --- a/test/chat_message_reference_test.exs +++ b/test/chat_message_reference_test.exs @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.ChatMessageReferencTest do +defmodule Pleroma.ChatMessageReferenceTest do use Pleroma.DataCase, async: true alias Pleroma.Chat From 56dfa0e0fb0ca34054930e64e092f4a3a1b87fd1 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 19:22:49 +0200 Subject: [PATCH 283/492] Transmogrifier: Update notification after accepting. --- lib/pleroma/web/activity_pub/transmogrifier.ex | 1 + .../activity_pub/transmogrifier/follow_handling_test.exs | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 886403fcd..b2461de2b 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -538,6 +538,7 @@ def handle_incoming( {_, false} <- {:user_blocked, User.blocks?(followed, follower) && deny_follow_blocked}, {_, false} <- {:user_locked, User.locked?(followed)}, {_, {:ok, follower}} <- {:follow, User.follow(follower, followed)}, + _ <- Notification.update_notification_type(followed, activity), {_, {:ok, _}} <- {:follow_state_update, Utils.update_follow_state_for_all(activity, "accept")}, {:ok, _relationship} <- diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs index 967389fae..6b003b51c 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 @@ -57,9 +58,12 @@ test "it works for incoming follow requests" 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 +85,9 @@ test "with locked accounts, it does not create a follow or an accept" 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 From 317e2b8d6126d86eafb493fe6c3b7a29af65ee21 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 4 Jun 2020 21:33:16 +0400 Subject: [PATCH 284/492] Use atoms as keys in `ActivityPub.fetch_*` functions options --- benchmarks/load_testing/fetcher.ex | 194 ++++---- .../mix/tasks/pleroma/benchmarks/tags.ex | 16 +- lib/pleroma/bbs/handler.ex | 8 +- lib/pleroma/conversation/participation.ex | 4 +- lib/pleroma/pagination.ex | 17 +- lib/pleroma/web/activity_pub/activity_pub.ex | 448 ++++++++---------- .../activity_pub/activity_pub_controller.ex | 16 +- lib/pleroma/web/activity_pub/utils.ex | 15 +- .../controllers/admin_api_controller.ex | 14 +- .../controllers/status_controller.ex | 10 +- .../web/admin_api/views/report_view.ex | 2 +- lib/pleroma/web/controller_helper.ex | 3 +- lib/pleroma/web/feed/tag_controller.ex | 4 +- lib/pleroma/web/feed/user_controller.ex | 6 +- .../controllers/account_controller.ex | 4 +- .../controllers/conversation_controller.ex | 17 - .../controllers/status_controller.ex | 11 +- .../controllers/timeline_controller.ex | 65 ++- .../mastodon_api/views/conversation_view.ex | 4 +- .../controllers/account_controller.ex | 7 +- .../controllers/conversation_controller.ex | 9 +- .../controllers/scrobble_controller.ex | 5 +- .../web/static_fe/static_fe_controller.ex | 8 +- test/pagination_test.exs | 12 +- test/tasks/relay_test.exs | 10 +- test/user_test.exs | 4 +- test/web/activity_pub/activity_pub_test.exs | 261 +++++----- 27 files changed, 538 insertions(+), 636 deletions(-) diff --git a/benchmarks/load_testing/fetcher.ex b/benchmarks/load_testing/fetcher.ex index 22a06e472..15fd06c3d 100644 --- a/benchmarks/load_testing/fetcher.ex +++ b/benchmarks/load_testing/fetcher.ex @@ -52,12 +52,12 @@ defp render_views(user) 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 @@ -70,17 +70,17 @@ defp fetch_home_timeline(user) 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() @@ -90,19 +90,19 @@ defp fetch_home_timeline(user) 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() ) @@ -110,12 +110,12 @@ defp fetch_home_timeline(user) 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 @@ -130,7 +130,7 @@ defp fetch_direct_timeline(user) 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 @@ -138,7 +138,7 @@ defp fetch_direct_timeline(user) 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 @@ -146,7 +146,7 @@ defp fetch_direct_timeline(user) 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 @@ -165,7 +165,7 @@ defp fetch_direct_timeline(user) 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() ) @@ -173,34 +173,34 @@ defp fetch_direct_timeline(user) 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 @@ -223,7 +223,7 @@ defp fetch_public_timeline(user, :tag) 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 @@ -245,15 +245,13 @@ defp fetch_public_timeline(user, :with_blocks) do user = User.get_by_id(user.id) - opts = Map.put(opts, "blocking_user", user) + opts = Map.put(opts, :blocking_user, user) - Benchee.run( - %{ - "public timeline with user block" => fn -> - ActivityPub.fetch_public_activities(opts) - end - }, - ) + Benchee.run(%{ + "public timeline with user block" => fn -> + ActivityPub.fetch_public_activities(opts) + end + }) domains = Enum.reduce(remote_non_friends, [], fn non_friend, domains -> @@ -269,30 +267,28 @@ defp fetch_public_timeline(user, :with_blocks) do end) user = User.get_by_id(user.id) - opts = Map.put(opts, "blocking_user", user) + opts = Map.put(opts, :blocking_user, user) - Benchee.run( - %{ - "public timeline with domain block" => fn opts -> - ActivityPub.fetch_public_activities(opts) - end - } - ) + 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( @@ -303,17 +299,17 @@ defp fetch_public_timeline(opts, title) when is_binary(title) 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 @@ -322,15 +318,15 @@ defp fetch_notifications(user) 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( @@ -341,10 +337,10 @@ defp fetch_notifications(user) 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() ) @@ -354,13 +350,13 @@ defp fetch_favourites(user) 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( %{ @@ -370,10 +366,10 @@ defp fetch_favourites(user) 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() ) @@ -381,8 +377,8 @@ defp fetch_favourites(user) do defp opts_for_long_thread(user) do %{ - "blocking_user" => user, - "user" => user + blocking_user: user, + user: user } end @@ -392,9 +388,9 @@ defp fetch_long_thread(user) 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( %{ @@ -514,13 +510,13 @@ defp render_long_thread(user) 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( @@ -551,14 +547,14 @@ defp fetch_timelines_with_reply_filtering(user) 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 }, @@ -577,16 +573,16 @@ defp fetch_timelines_with_reply_filtering(user) 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/mix/tasks/pleroma/benchmarks/tags.ex b/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex index 1162b2e06..c051335a5 100644 --- a/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex +++ b/benchmarks/mix/tasks/pleroma/benchmarks/tags.ex @@ -100,14 +100,14 @@ defp hashtag_fetching(params, user, local_only) do _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) |> Pleroma.Web.ActivityPub.ActivityPub.fetch_public_activities() 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 @@ def handle_command(state, "home") 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/conversation/participation.ex b/lib/pleroma/conversation/participation.ex index 51bb1bda9..ce7bd2396 100644 --- a/lib/pleroma/conversation/participation.ex +++ b/lib/pleroma/conversation/participation.ex @@ -163,8 +163,8 @@ def for_user_with_last_activity_id(user, params \\ %{}) do |> Enum.map(fn participation -> activity_id = ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{ - "user" => user, - "blocking_user" => user + user: user, + blocking_user: user }) %{ diff --git a/lib/pleroma/pagination.ex b/lib/pleroma/pagination.ex index d43a96cd2..0ccc7b1f2 100644 --- a/lib/pleroma/pagination.ex +++ b/lib/pleroma/pagination.ex @@ -16,19 +16,16 @@ defmodule Pleroma.Pagination do @default_limit 20 @max_limit 40 - @page_keys ["max_id", "min_id", "limit", "since_id", "order"] - - def page_keys, do: @page_keys @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 +38,7 @@ def fetch_paginated(query, params, :keyset, table_binding) 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 +46,7 @@ def fetch_paginated(query, %{"total" => true} = params, :offset, table_binding) %{ 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 @@ -90,12 +87,6 @@ defp cast_params(params) 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/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 958f3e5af..ef21f180b 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -67,16 +67,12 @@ defp get_recipients(data) 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 +83,7 @@ defp check_remote_limit(%{"object" => %{"content" => content}}) when not is_nil( 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,36 +91,26 @@ def decrease_note_count_if_public(actor, object) 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 @spec persist(map(), keyword()) :: {:ok, Activity.t() | Object.t()} def persist(object, meta) do @@ -203,8 +189,8 @@ def notify_and_stream(activity) do 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 +212,15 @@ def stream_out_participations(participations) 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_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 +254,13 @@ defp do_create(%{to: to, actor: actor, context: context, object: object} = param 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 +288,13 @@ def listen(%{to: to, actor: actor, context: context, object: object} = params) d 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,14 +312,15 @@ def reject(params) 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), + data = + %{"to" => to, "type" => type, "actor" => actor.ap_id, "object" => object} + |> Utils.maybe_put("id", activity_id) + + with {:ok, activity} <- insert(data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} @@ -341,15 +332,17 @@ 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), + data = + %{ + "to" => to, + "cc" => cc, + "type" => "Update", + "actor" => actor, + "object" => object + } + |> Utils.maybe_put("id", activity_id) + + with {:ok, activity} <- insert(data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} @@ -366,8 +359,9 @@ def follow(follower, followed, activity_id \\ nil, local \\ true) do end defp do_follow(follower, followed, activity_id, local) do - with data <- make_follow_data(follower, followed, activity_id), - {:ok, activity} <- insert(data, local), + data = make_follow_data(follower, followed, activity_id) + + with {:ok, activity} <- insert(data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} @@ -411,13 +405,13 @@ def block(blocker, blocked, activity_id \\ nil, local \\ true) do 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) + if unfollow_blocked and fetch_latest_follow(blocker, blocked) do + unfollow(blocker, blocked, nil, local) end - with block_data <- make_block_data(blocker, blocked, activity_id), - {:ok, activity} <- insert(block_data, local), + block_data = make_block_data(blocker, blocked, activity_id) + + with {:ok, activity} <- insert(block_data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} @@ -496,8 +490,8 @@ def fetch_activities_for_context_query(context, opts) 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) @@ -505,7 +499,7 @@ def fetch_activities_for_context_query(context, opts) 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( @@ -532,7 +526,7 @@ def fetch_activities_for_context(context, opts \\ %{}) do FlakeId.Ecto.CompatType.t() | nil def fetch_latest_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)) |> limit(1) |> select([a], a.id) |> Repo.one() @@ -540,24 +534,18 @@ def fetch_latest_activity_id_for_context(context, opts \\ %{}) do @spec fetch_public_or_unlisted_activities(map(), Pagination.type()) :: [Activity.t()] def fetch_public_or_unlisted_activities(opts \\ %{}, pagination \\ :keyset) do - opts = Map.drop(opts, ["user"]) + opts = Map.delete(opts, :user) - query = fetch_activities_query([Constants.as_public()], opts) - - query = - if opts["restrict_unlisted"] do - restrict_unlisted(query) - else - query - end - - Pagination.fetch_paginated(query, opts, pagination) + [Constants.as_public()] + |> fetch_activities_query(opts) + |> 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) + |> Map.put(:restrict_unlisted, true) |> fetch_public_or_unlisted_activities(pagination) end @@ -566,20 +554,17 @@ def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do 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 @@ -601,7 +586,7 @@ defp restrict_visibility(_query, %{visibility: visibility}) 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( @@ -621,7 +606,7 @@ defp exclude_visibility(query, %{"exclude_visibilities" => visibility}) 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, @@ -636,7 +621,7 @@ defp exclude_visibility(query, %{"exclude_visibilities" => visibility}) ) 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 @@ -647,14 +632,10 @@ defp exclude_visibility(query, _visibility), do: query 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) @@ -666,87 +647,79 @@ defp restrict_thread_visibility(query, _, _), do: query 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_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) @@ -755,12 +728,11 @@ defp restrict_tag_reject(query, %{"tag_reject" => tag_reject}) 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) @@ -769,18 +741,18 @@ defp restrict_tag_all(query, %{"tag_all" => tag_all}) 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) @@ -803,35 +775,35 @@ defp restrict_recipients(query, recipients, user) 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) @@ -840,11 +812,11 @@ defp restrict_favorited_by(query, %{"favorited_by" => ap_id}) 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, where: fragment("not (?)->'attachment' = (?)", object.data, ^[]) @@ -853,7 +825,7 @@ defp restrict_media(query, %{"only_media" => val}) when val in [true, "true", "1 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) @@ -861,8 +833,8 @@ defp restrict_replies(query, %{"exclude_replies" => val}) when val in [true, "tr 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, @@ -877,8 +849,8 @@ defp restrict_replies(query, %{ 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, @@ -897,16 +869,16 @@ defp restrict_replies(query, %{ 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, @@ -914,7 +886,7 @@ defp restrict_muted(query, %{"muting_user" => %User{} = user} = opts) 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 @@ -923,8 +895,8 @@ defp restrict_muted(query, %{"muting_user" => %User{} = user} = opts) 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) @@ -970,7 +942,7 @@ defp restrict_blocked(query, %{"blocking_user" => %User{} = user} = opts) 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: @@ -982,19 +954,16 @@ defp restrict_unlisted(query) 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, @@ -1010,7 +979,7 @@ defp restrict_muted_reblogs(query, %{"muting_user" => %User{} = user} = opts) 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, @@ -1024,7 +993,7 @@ defp restrict_instance(query, %{"instance" => instance}) 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 @@ -1036,7 +1005,7 @@ defp exclude_poll_votes(query, _) do end end - defp exclude_invisible_actors(query, %{"invisible_actors" => true}), do: query + defp exclude_invisible_actors(query, %{invisible_actors: true}), do: query defp exclude_invisible_actors(query, _opts) do invisible_ap_ids = @@ -1047,38 +1016,38 @@ defp exclude_invisible_actors(query, _opts) do 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 + 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 +1063,23 @@ defp maybe_order(query, %{order: :asc}) 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 +1098,7 @@ def fetch_activities_query(recipients, opts \\ %{}) 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) @@ -1157,12 +1125,12 @@ def fetch_activities_query(recipients, opts \\ %{}) do 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 """ @@ -1178,16 +1146,15 @@ def fetch_favourites(user, params \\ %{}, pagination \\ :keyset) do |> select([_like, object, activity], %{activity | object: object}) |> order_by([like, _, _], desc_nulls_last: like.id) |> Pagination.fetch_paginated( - Map.merge(params, %{"skip_order" => true}), + Map.merge(params, %{skip_order: true}), pagination, :object_activity ) 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 @@ -1201,7 +1168,7 @@ defp maybe_update_cc(activities, list_memberships, %User{ap_id: user_ap_id}) 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 @@ -1276,8 +1243,8 @@ defp object_to_user_data(data) 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 @@ -1323,18 +1290,15 @@ defp object_to_user_data(data) 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 @@ -1409,9 +1373,8 @@ defp collection_private(%{"first" => first}) 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 @@ -1419,15 +1382,14 @@ def user_data_from_user_object(data) 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 @@ -1450,8 +1412,6 @@ def make_user_from_ap_id(ap_id) do |> Repo.insert() |> User.set_cache() end - else - e -> {:error, e} end end end @@ -1465,7 +1425,7 @@ def make_user_from_nickname(nickname) 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 @@ -1476,7 +1436,7 @@ def contain_activity(%Activity{} = activity, %User{} = user) 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 28727d619..55947925e 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -233,16 +233,16 @@ def outbox( activities = if params["max_id"] do ActivityPub.fetch_user_activities(user, for_user, %{ - "max_id" => params["max_id"], + 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 + include_poll_votes: true, + limit: 10 }) else ActivityPub.fetch_user_activities(user, for_user, %{ - "limit" => 10, - "include_poll_votes" => true + limit: 10, + include_poll_votes: true }) end @@ -356,11 +356,11 @@ def read_inbox( activities = if params["max_id"] do ActivityPub.fetch_activities([user.ap_id | User.following(user)], %{ - "max_id" => params["max_id"], - "limit" => 10 + max_id: params["max_id"], + limit: 10 }) else - ActivityPub.fetch_activities([user.ap_id | User.following(user)], %{"limit" => 10}) + ActivityPub.fetch_activities([user.ap_id | User.following(user)], %{limit: 10}) end conn diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index a76a699ee..1c40afdb2 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -244,7 +244,7 @@ defp lazy_put_object_defaults(activity, _), do: activity 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"]) @@ -740,13 +740,12 @@ defp build_flag_object(_), do: [] def get_reports(params, page, page_size) do params = params - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> 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 diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index bf24581cc..edd3abc63 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -228,10 +228,10 @@ def list_instance_statuses(conn, %{"instance" => instance} = params) 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 @@ -248,9 +248,9 @@ def list_user_statuses(conn, %{"nickname" => nickname} = params) 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 diff --git a/lib/pleroma/web/admin_api/controllers/status_controller.ex b/lib/pleroma/web/admin_api/controllers/status_controller.ex index 574196be8..bc48cc527 100644 --- a/lib/pleroma/web/admin_api/controllers/status_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/status_controller.ex @@ -29,11 +29,11 @@ defmodule Pleroma.Web.AdminAPI.StatusController do 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 + 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) 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 @@ def render("index.json", %{reports: reports}) 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/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 5a1316a5f..9f0ca5b69 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -81,8 +81,7 @@ def add_link_headers(conn, activities, extra_params) do 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 diff --git a/lib/pleroma/web/feed/tag_controller.ex b/lib/pleroma/web/feed/tag_controller.ex index 8133f8480..3404d2856 100644 --- a/lib/pleroma/web/feed/tag_controller.ex +++ b/lib/pleroma/web/feed/tag_controller.ex @@ -15,8 +15,8 @@ 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} + |> put_if_exist(: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 5a6fc9de0..7bf9bd3e3 100644 --- a/lib/pleroma/web/feed/user_controller.ex +++ b/lib/pleroma/web/feed/user_controller.ex @@ -52,10 +52,10 @@ def feed(conn, %{"nickname" => nickname} = params) 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"]) + |> put_if_exist(:max_id, params["max_id"]) |> ActivityPub.fetch_public_or_unlisted_activities() conn diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 97295a52f..edecbf418 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -254,9 +254,7 @@ def statuses(%{assigns: %{user: reading_user}} = conn, params) 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) diff --git a/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex b/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex index 69f0e3846..f35ec3596 100644 --- a/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/conversation_controller.ex @@ -21,7 +21,6 @@ defmodule Pleroma.Web.MastodonAPI.ConversationController do @doc "GET /api/v1/conversations" def index(%{assigns: %{user: user}} = conn, params) do - params = stringify_pagination_params(params) participations = Participation.for_user_with_last_activity_id(user, params) conn @@ -37,20 +36,4 @@ def mark_as_read(%{assigns: %{user: user}} = conn, %{id: participation_id}) do render(conn, "participation.json", participation: participation, for: user) end end - - defp stringify_pagination_params(params) do - atom_keys = - Pleroma.Pagination.page_keys() - |> Enum.map(&String.to_atom(&1)) - - str_keys = - params - |> Map.take(atom_keys) - |> Enum.map(fn {key, value} -> {to_string(key), value} end) - |> Enum.into(%{}) - - params - |> Map.delete(atom_keys) - |> Map.merge(str_keys) - end end diff --git a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex index f20157a5f..468b44b67 100644 --- a/lib/pleroma/web/mastodon_api/controllers/status_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/status_controller.ex @@ -359,9 +359,9 @@ def context(%{assigns: %{user: user}} = conn, %{id: id}) 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 @@ def context(%{assigns: %{user: user}} = conn, %{id: id}) 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 f67f75430..ed74a771a 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -44,12 +44,11 @@ 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) + |> 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)] @@ -71,10 +70,9 @@ def home(%{assigns: %{user: user}} = conn, params) 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 +91,7 @@ def direct(%{assigns: %{user: user}} = conn, params) 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 +107,11 @@ def public(%{assigns: %{user: user}} = conn, params) do else activities = params - |> 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) + |> 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 +126,38 @@ def public(%{assigns: %{user: user}} = conn, params) 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/views/conversation_view.ex b/lib/pleroma/web/mastodon_api/views/conversation_view.ex index 2b6f84c72..fbe618377 100644 --- a/lib/pleroma/web/mastodon_api/views/conversation_view.ex +++ b/lib/pleroma/web/mastodon_api/views/conversation_view.ex @@ -24,8 +24,8 @@ def render("participation.json", %{participation: participation, for: user}) 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 + user: user, + blocking_user: user }) end 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 @@ def favourites(%{assigns: %{account: %{hide_favorites: true}}} = conn, _params) 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/conversation_controller.ex b/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex index 21d5eb8d5..3d007f324 100644 --- a/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex @@ -42,15 +42,14 @@ def statuses( Participation.get(participation_id, preload: [:conversation]) do params = params - |> Map.new(fn {key, value} -> {to_string(key), value} end) - |> Map.put("blocking_user", user) - |> Map.put("muting_user", user) - |> Map.put("user", user) + |> 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)) + |> Pleroma.Pagination.fetch_paginated(Map.put(params, :total, false)) |> Enum.reverse() conn 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 @@ def create(%{assigns: %{user: user}, body_params: params} = conn, _) 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/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 @@ def show(%{assigns: %{username_or_id: username_or_id}} = conn, params) 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/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 @@ test "paginates by min_id", %{notes: notes} 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 @@ test "paginates by since_id", %{notes: notes} 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 @@ test "paginates by max_id", %{notes: notes} 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 @@ test "paginates by max_id", %{notes: notes} 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 @@ test "paginates by min_id & limit", %{notes: notes} 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/tasks/relay_test.exs b/test/tasks/relay_test.exs index 678288854..a8ba0658d 100644 --- a/test/tasks/relay_test.exs +++ b/test/tasks/relay_test.exs @@ -62,11 +62,11 @@ test "relay is unfollowed" do [undo_activity] = ActivityPub.fetch_activities([], %{ - "type" => "Undo", - "actor_id" => follower_id, - "limit" => 1, - "skip_preload" => true, - "invisible_actors" => 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/user_test.exs b/test/user_test.exs index 6b344158d..48c7605f5 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1122,7 +1122,7 @@ test "hide a user's statuses from timelines and notifications" 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) @@ -1132,7 +1132,7 @@ test "hide a user's statuses from timelines and notifications" do assert [] == ActivityPub.fetch_activities([user2.ap_id | User.following(user2)], %{ - "user" => user2 + user: user2 }) end end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 3dcb62873..2f65dfc8e 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -82,30 +82,28 @@ test "it restricts by the appropriate visibility" 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 @@ test "it excludes by the appropriate visibility" 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 @@ test "it excludes by the appropriate visibility" 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 @@ test "it excludes by the appropriate visibility" 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 @@ test "it excludes by the appropriate visibility" 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 @@ test "it fetches the appropriate tag-restricted posts" 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 @@ test "can be fetched into a timeline" 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 @@ test "retrieves activities that have a given context" 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 @@ test "doesn't return blocked activities" 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,8 +525,7 @@ test "doesn't return blocked activities" 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) @@ -541,16 +536,14 @@ test "doesn't return blocked activities" do %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 @@ test "doesn't return transitive interactions concerning blocked users" 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) @@ -595,7 +588,7 @@ test "doesn't return announce activities concerning blocked users" do {: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) @@ -611,8 +604,7 @@ test "doesn't return activities from blocked domains" 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 @@ -620,8 +612,7 @@ test "doesn't return activities from blocked domains" do ActivityPub.follow(user, 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 +632,7 @@ test "does return activities from followed users on blocked domains" 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 @@ -653,8 +643,7 @@ test "does return activities from followed users on blocked domains" do bad_activity = insert(:note_activity, %{note: bad_note}) {: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 +658,7 @@ test "doesn't return muted activities" 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 +667,9 @@ test "doesn't return muted activities" 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 +678,7 @@ test "doesn't return muted activities" 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) @@ -703,15 +690,14 @@ test "doesn't return muted activities" do %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 +713,7 @@ test "doesn't return thread muted activities" 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 +725,7 @@ test "returns thread muted activities when with_muted is set" 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 @@ -761,7 +747,7 @@ test "excludes reblogs on request" 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 +790,7 @@ test "retrieves ids starting from a since_id" 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 +805,7 @@ test "retrieves ids up to max_id" 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 +817,7 @@ test "paginates via offset/limit" 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 @@ -848,7 +833,7 @@ test "doesn't return reblogs for users for whom reblogs have been muted" do {: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 @@ -862,7 +847,7 @@ test "returns reblogs for users for whom reblogs have not been muted" do {: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 @@ -1066,7 +1051,7 @@ test "it filters broken threads" 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 @@ -1115,7 +1100,7 @@ test "returned pinned statuses" do CommonAPI.pin(activity_three.id, user) user = refresh_record(user) - activities = ActivityPub.fetch_user_activities(user, nil, %{"pinned" => "true"}) + activities = ActivityPub.fetch_user_activities(user, nil, %{pinned: true}) assert 3 = length(activities) end @@ -1226,7 +1211,7 @@ test "fetch_activities/2 returns activities addressed to a list " 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 @@ -1400,7 +1385,7 @@ test "returns a favourite activities sorted by adds to favorite" 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 @@ -1470,7 +1455,7 @@ test "doesn't retrieve replies activities with exclude_replies" 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 @@ -1483,11 +1468,11 @@ test "doesn't retrieve replies activities with exclude_replies" 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) @@ -1504,12 +1489,12 @@ test "public timeline with reply_visibility `following`", %{ } 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) @@ -1531,12 +1516,12 @@ test "public timeline with reply_visibility `self`", %{ } 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) @@ -1555,11 +1540,11 @@ test "home timeline", %{ } 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) @@ -1593,12 +1578,12 @@ test "home timeline with reply_visibility `following`", %{ } 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) @@ -1632,12 +1617,12 @@ test "home timeline with reply_visibility `self`", %{ } 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) @@ -1666,11 +1651,11 @@ test "home timeline with reply_visibility `self`", %{ 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) @@ -1680,13 +1665,13 @@ test "public timeline", %{users: %{u1: user}} 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) @@ -1696,13 +1681,13 @@ test "public timeline with default reply_visibility `following`", %{users: %{u1: 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) @@ -1712,10 +1697,10 @@ test "public timeline with default reply_visibility `self`", %{users: %{u1: user 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) @@ -1727,12 +1712,12 @@ test "home timeline", %{users: %{u1: user}} 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) @@ -1751,12 +1736,12 @@ test "home timeline with default reply_visibility `self`", %{ } 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) From d44da91bbf50ae91e8246ebe3669cfaf1fabda1b Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 20:28:33 +0200 Subject: [PATCH 285/492] SubscriptionOperation: Let chat mentions through. --- .../web/api_spec/operations/subscription_operation.ex | 5 +++++ .../controllers/subscription_controller_test.exs | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) 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 @@ defp create_request do allOf: [BooleanLike], nullable: true, description: "Receive poll notifications?" + }, + "pleroma:chat_mention": %Schema{ + allOf: [BooleanLike], + nullable: true, + description: "Receive chat notifications?" } } } 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 @@ test "successful creation", %{conn: conn} 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 @@ test "successful creation", %{conn: conn} 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 From aa2ac76510d95f2412e23f3739e8e1ae4402643f Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 4 Jun 2020 20:40:46 +0200 Subject: [PATCH 286/492] Notification: Don't break on figuring out the type of old EmojiReactions --- lib/pleroma/notification.ex | 4 ++++ test/notification_test.exs | 17 ++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 455d214bf..e5b880b10 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -398,6 +398,10 @@ defp type_from_activity(%{data: %{"type" => type}} = activity, opts \\ []) do "EmojiReact" -> "pleroma:emoji_reaction" + # Compatibility with old reactions + "EmojiReaction" -> + "pleroma:emoji_reaction" + "Create" -> activity |> type_from_activity_object() diff --git a/test/notification_test.exs b/test/notification_test.exs index 6bc2b6904..f2115a29e 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -8,8 +8,10 @@ defmodule Pleroma.NotificationTest do import Pleroma.Factory import Mock + alias Pleroma.Activity alias Pleroma.FollowingRelationship alias Pleroma.Notification + alias Pleroma.Repo alias Pleroma.Tests.ObanHelpers alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub @@ -29,8 +31,18 @@ test "it fills in missing notification types" do {: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, "☕") - assert {4, nil} = Repo.update_all(Notification, set: [type: nil]) + 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]) Notification.fill_in_notification_types() @@ -43,6 +55,9 @@ test "it fills in missing notification types" do 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 From cc8a7dc205a4516452c48659e6bf081f3f730496 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 5 Jun 2020 12:01:33 +0200 Subject: [PATCH 287/492] SideEffects / ChatView: Add an unread cache. This is to prevent wrong values in the stream. --- lib/pleroma/web/activity_pub/side_effects.ex | 5 ++++ .../web/pleroma_api/views/chat_view.ex | 2 +- lib/pleroma/web/streamer/streamer.ex | 28 +++++-------------- lib/pleroma/web/views/streamer_view.ex | 2 ++ test/web/pleroma_api/views/chat_view_test.exs | 15 ++++++++++ 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index e9f109d80..992c04ac1 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -142,6 +142,11 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id != actor.ap_id) + # We add a cache of the unread value here so that it doesn't change when being streamed out + chat = + chat + |> Map.put(:unread, ChatMessageReference.unread_count_for_chat(chat)) + Streamer.stream( ["user", "user:pleroma_chat"], {user, %{cm_ref | chat: chat, object: object}} diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index c903a71fd..91d50dd1e 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -20,7 +20,7 @@ def render("show.json", %{chat: %Chat{} = chat} = opts) do %{ id: chat.id |> to_string(), account: AccountView.render("show.json", Map.put(opts, :user, recipient)), - unread: ChatMessageReference.unread_count_for_chat(chat), + unread: Map.get(chat, :unread) || ChatMessageReference.unread_count_for_chat(chat), last_message: last_message && ChatMessageReferenceView.render("show.json", chat_message_reference: last_message), diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index 5e37e2cf2..b22297955 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -90,34 +90,20 @@ def remove_socket(topic) 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]) diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index a6efd0109..b000e7ce0 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -55,6 +55,8 @@ 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 = diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index f3bd12616..f77584dd1 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -16,6 +16,21 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do import Pleroma.Factory + test "giving a chat with an 'unread' field, it uses that" do + user = insert(:user) + recipient = insert(:user) + + {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id) + + chat = + chat + |> Map.put(:unread, 5) + + represented_chat = ChatView.render("show.json", chat: chat) + + assert represented_chat[:unread] == 5 + end + test "it represents a chat" do user = insert(:user) recipient = insert(:user) From 0efa8aa0b9567f42b1af63e2b93a9c51e9a0fb11 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 5 Jun 2020 12:26:07 +0200 Subject: [PATCH 288/492] Transmogrifier: For follows, create notifications last. As the notification type changes depending on the follow state, the notification should not be created and streamed out before the state settles. For this reason, the notification creation has been delayed until it's clear if the user has been followed or not. This is a bit hacky but it will be properly rewritten using the pipeline soon. --- lib/pleroma/web/activity_pub/activity_pub.ex | 12 +++++++----- lib/pleroma/web/activity_pub/transmogrifier.ex | 5 +++-- .../transmogrifier/follow_handling_test.exs | 18 ++++++++++++++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 568db2348..4f7043c92 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -363,19 +363,21 @@ def update(%{to: to, cc: cc, actor: actor, object: object} = params) do 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 + defp do_follow(follower, followed, activity_id, local, opts) do + skip_notify_and_stream = Keyword.get(opts, :skip_notify_and_stream, false) + with data <- make_follow_data(follower, followed, activity_id), {:ok, activity} <- insert(data, local), - _ <- notify_and_stream(activity), + _ <- skip_notify_and_stream || notify_and_stream(activity), :ok <- maybe_federate(activity) do {:ok, activity} else diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index b2461de2b..50f3216f3 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -533,12 +533,12 @@ def handle_incoming( 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)}, {_, {:ok, follower}} <- {:follow, User.follow(follower, followed)}, - _ <- Notification.update_notification_type(followed, activity), {_, {:ok, _}} <- {:follow_state_update, Utils.update_follow_state_for_all(activity, "accept")}, {:ok, _relationship} <- @@ -577,6 +577,7 @@ def handle_incoming( :noop end + ActivityPub.notify_and_stream(activity) {:ok, activity} else _e -> diff --git a/test/web/activity_pub/transmogrifier/follow_handling_test.exs b/test/web/activity_pub/transmogrifier/follow_handling_test.exs index 6b003b51c..06c39eed6 100644 --- a/test/web/activity_pub/transmogrifier/follow_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/follow_handling_test.exs @@ -13,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) @@ -151,6 +152,23 @@ test "it rejects incoming follow requests from blocked users when deny_follow_bl 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) From f3ea6ee2c82b2d63991d3e658566298c722ac0af Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 5 Jun 2020 12:45:25 +0200 Subject: [PATCH 289/492] Credo fixes. --- lib/pleroma/web/activity_pub/side_effects.ex | 3 ++- lib/pleroma/web/views/streamer_view.ex | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 992c04ac1..e7d050e81 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -142,7 +142,8 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id != actor.ap_id) - # We add a cache of the unread value here so that it doesn't change when being streamed out + # We add a cache of the unread value here so that it + # doesn't change when being streamed out chat = chat |> Map.put(:unread, ChatMessageReference.unread_count_for_chat(chat)) diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex index b000e7ce0..476a33245 100644 --- a/lib/pleroma/web/views/streamer_view.ex +++ b/lib/pleroma/web/views/streamer_view.ex @@ -55,7 +55,7 @@ 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)}") From 65689ba9bd44e291fc626cce2bd5136b93a5da90 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 5 Jun 2020 13:10:48 +0200 Subject: [PATCH 290/492] If Credo fixes is so good, why is there no Credo fixes 2? --- lib/pleroma/web/activity_pub/side_effects.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index e7d050e81..b3aacff40 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -142,7 +142,7 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id != actor.ap_id) - # We add a cache of the unread value here so that it + # We add a cache of the unread value here so that it # doesn't change when being streamed out chat = chat From 115d08a7542b92c5e1d889da41c0ee6837a1235e Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 5 Jun 2020 16:47:02 +0200 Subject: [PATCH 291/492] Pipeline: Add a side effects step after the transaction finishes This is to run things like streaming notifications out, which will sometimes need data that is created by the transaction, but is streamed out asynchronously. --- lib/pleroma/notification.ex | 26 ++++-- lib/pleroma/web/activity_pub/pipeline.ex | 4 + lib/pleroma/web/activity_pub/side_effects.ex | 30 ++++++- test/web/activity_pub/pipeline_test.exs | 9 +- test/web/activity_pub/side_effects_test.exs | 86 +++++++++++++++++--- test/web/common_api/common_api_test.exs | 43 ++++++++-- 6 files changed, 169 insertions(+), 29 deletions(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index e5b880b10..49e27c05a 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -334,30 +334,34 @@ def dismiss(%{id: user_id} = _user, id) do end end - def create_notifications(%Activity{data: %{"to" => _, "type" => "Create"}} = activity) do + 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) @@ -623,4 +627,12 @@ def skip?(:recently_followed, %Activity{data: %{"type" => "Follow"}} = activity, 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/web/activity_pub/pipeline.ex b/lib/pleroma/web/activity_pub/pipeline.ex index 0c54c4b23..6875c47f6 100644 --- a/lib/pleroma/web/activity_pub/pipeline.ex +++ b/lib/pleroma/web/activity_pub/pipeline.ex @@ -17,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 diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index b3aacff40..10136789a 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -16,6 +16,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.Streamer + alias Pleroma.Web.Push def handle(object, meta \\ []) @@ -37,7 +38,12 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do # - Set up notifications def handle(%{data: %{"type" => "Create"}} = activity, meta) do with {:ok, _object, _meta} <- handle_object_creation(meta[:object_data], meta) do - Notification.create_notifications(activity) + {:ok, notifications} = Notification.create_notifications(activity, do_send: false) + + meta = + meta + |> add_notifications(notifications) + {:ok, activity, meta} else e -> Repo.rollback(e) @@ -200,4 +206,26 @@ def handle_undoing( end def handle_undoing(object), do: {:error, ["don't know how to handle", object]} + + defp send_notifications(meta) do + Keyword.get(meta, :created_notifications, []) + |> Enum.each(fn notification -> + Streamer.stream(["user", "user:notification"], notification) + Push.send(notification) + end) + + meta + end + + defp add_notifications(meta, notifications) do + existing = Keyword.get(meta, :created_notifications, []) + + meta + |> Keyword.put(:created_notifications, notifications ++ existing) + end + + def handle_after_transaction(meta) do + meta + |> send_notifications() + end end diff --git a/test/web/activity_pub/pipeline_test.exs b/test/web/activity_pub/pipeline_test.exs index 26557720b..8deb64501 100644 --- a/test/web/activity_pub/pipeline_test.exs +++ b/test/web/activity_pub/pipeline_test.exs @@ -33,7 +33,10 @@ test "it goes through validation, filtering, persisting, side effects and federa { 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, @@ -71,7 +74,7 @@ test "it goes through validation, filtering, persisting, side effects without fe { 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, @@ -110,7 +113,7 @@ test "it goes through validation, filtering, persisting, side effects without fe { 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, diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 40df664eb..43ffe1337 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -22,6 +22,47 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do import Pleroma.Factory import Mock + describe "handle_after_transaction" do + test "it streams out notifications" 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[:created_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.Push.send(notification)) + end + end + end + describe "delete objects" do setup do user = insert(:user) @@ -361,22 +402,47 @@ test "it creates a Chat and ChatMessageReferences for the local users and bumps {: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) + 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) - chat = Chat.get(author.id, recipient.ap_id) + # The notification gets created + assert [notification] = meta[:created_notifications] + assert notification.activity_id == create_activity.id - [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() + # But it is not sent out + refute called(Pleroma.Web.Streamer.stream(["user", "user:notification"], notification)) + refute called(Pleroma.Web.Push.send(notification)) - assert cm_ref.object.data["content"] == "hey" - assert cm_ref.unread == false + chat = Chat.get(author.id, recipient.ap_id) - chat = Chat.get(recipient.id, author.ap_id) + [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() - [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() + assert cm_ref.object.data["content"] == "hey" + assert cm_ref.unread == false - assert cm_ref.object.data["content"] == "hey" - assert cm_ref.unread == true + chat = Chat.get(recipient.id, author.ap_id) + + [cm_ref] = ChatMessageReference.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 diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 611a9ae66..63b59820e 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -7,6 +7,7 @@ defmodule Pleroma.Web.CommonAPITest do alias Pleroma.Activity alias Pleroma.Chat alias Pleroma.Conversation.Participation + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub @@ -39,15 +40,41 @@ test "it posts a chat message without content but with an attachment" do {:ok, upload} = ActivityPub.upload(file, actor: author.ap_id) - {:ok, activity} = - CommonAPI.post_chat_message( - author, - recipient, - nil, - media_id: upload.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 + ) - assert activity + 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 activity + end end test "it adds html newlines" do From 54bae06b4fa960eadb9918414f50b9ececc1faa4 Mon Sep 17 00:00:00 2001 From: Haelwenn Date: Fri, 5 Jun 2020 14:48:02 +0000 Subject: [PATCH 292/492] Create Pleroma.Maps.put_if_present(map, key, value, value_fun // &{:ok, &1}) Unifies all the similar functions to one and simplify some blocks with it. --- lib/pleroma/helpers/uri_helper.ex | 8 ----- lib/pleroma/maps.ex | 15 ++++++++ lib/pleroma/web/activity_pub/activity_pub.ex | 20 +++-------- .../web/activity_pub/transmogrifier.ex | 17 ++++----- lib/pleroma/web/activity_pub/utils.ex | 18 +++++----- .../controllers/config_controller.ex | 5 ++- .../controllers/oauth_app_controller.ex | 14 ++------ lib/pleroma/web/controller_helper.ex | 5 --- lib/pleroma/web/feed/tag_controller.ex | 4 +-- lib/pleroma/web/feed/user_controller.ex | 4 +-- .../controllers/account_controller.ex | 36 +++++++------------ .../web/mastodon_api/views/app_view.ex | 6 +--- .../views/scheduled_activity_view.ex | 8 ++--- lib/pleroma/web/oauth/oauth_controller.ex | 5 +-- 14 files changed, 59 insertions(+), 106 deletions(-) create mode 100644 lib/pleroma/maps.ex diff --git a/lib/pleroma/helpers/uri_helper.ex b/lib/pleroma/helpers/uri_helper.ex index 69d8c8fe0..6d205a636 100644 --- a/lib/pleroma/helpers/uri_helper.ex +++ b/lib/pleroma/helpers/uri_helper.ex @@ -17,14 +17,6 @@ def append_uri_params(uri, appended_params) 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/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/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 958f3e5af..75468f415 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -9,6 +9,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do 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 +20,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 @@ -161,12 +161,7 @@ def insert(map, local \\ true, fake \\ false, bypass_actor_check \\ false) when }) # 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}) @@ -328,7 +323,7 @@ def accept_or_reject(type, %{to: to, actor: actor, object: object} = params) do with data <- %{"to" => to, "type" => type, "actor" => actor.ap_id, "object" => object} - |> Utils.maybe_put("id", activity_id), + |> Maps.put_if_present("id", activity_id), {:ok, activity} <- insert(data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do @@ -348,7 +343,7 @@ def update(%{to: to, cc: cc, actor: actor, object: object} = params) do "actor" => actor, "object" => object }, - data <- Utils.maybe_put(data, "id", activity_id), + data <- Maps.put_if_present(data, "id", activity_id), {:ok, activity} <- insert(data, local), _ <- notify_and_stream(activity), :ok <- maybe_federate(activity) do @@ -1225,12 +1220,7 @@ def fetch_activities_bounded( @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 diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 8443c284c..fda1c71df 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -9,6 +9,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do alias Pleroma.Activity alias Pleroma.EarmarkRenderer alias Pleroma.FollowingRelationship + alias Pleroma.Maps alias Pleroma.Object alias Pleroma.Object.Containment alias Pleroma.Repo @@ -208,12 +209,6 @@ def fix_context(object) do |> 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) - end - def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachment) do attachments = Enum.map(attachment, fn data -> @@ -241,13 +236,13 @@ def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachm 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) diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index a76a699ee..5fce0ba63 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 @@ -307,7 +308,7 @@ def make_like_data( "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 @@ def make_follow_data( "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 @@ def make_announce_data( "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 @@ def make_announce_data( "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 @@ def make_undo_data( "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 @@ def make_unfollow_data(follower, followed, follow_activity, activity_id) 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 @@ def make_block_data(blocker, blocked, activity_id) 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 @@ -871,7 +872,4 @@ def get_existing_votes(actor, %{data: %{"id" => id}}) 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/admin_api/controllers/config_controller.ex b/lib/pleroma/web/admin_api/controllers/config_controller.ex index e221d9418..d6e2019bc 100644 --- a/lib/pleroma/web/admin_api/controllers/config_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/config_controller.ex @@ -61,13 +61,12 @@ def show(conn, _params) do 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 + |> Pleroma.Maps.put_if_present(:db, db) end) end) |> List.flatten() diff --git a/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex b/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex index 04e629fc1..dca23ea73 100644 --- a/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/oauth_app_controller.ex @@ -42,12 +42,7 @@ def index(conn, params) do end def create(%{body_params: params} = conn, _) do - params = - if params[:name] do - Map.put(params, :client_name, params[:name]) - else - params - end + params = Pleroma.Maps.put_if_present(params, :client_name, params[:name]) case App.create(params) do {:ok, app} -> @@ -59,12 +54,7 @@ def create(%{body_params: params} = conn, _) do end def update(%{body_params: params} = conn, %{id: id}) do - params = - if params[:name] do - Map.put(params, :client_name, params.name) - else - params - end + 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) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 5a1316a5f..bf832fe94 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -99,11 +99,6 @@ def try_render(conn, _, _) 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/feed/tag_controller.ex b/lib/pleroma/web/feed/tag_controller.ex index 8133f8480..4e86cfeb5 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"]) + |> 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 5a6fc9de0..7c2e0d522 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) @@ -55,7 +53,7 @@ def feed(conn, %{"nickname" => nickname} = params) do "type" => ["Create"], "actor_id" => user.ap_id } - |> put_if_exist("max_id", params["max_id"]) + |> Pleroma.Maps.put_if_present("max_id", params["max_id"]) |> ActivityPub.fetch_public_or_unlisted_activities() conn diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 97295a52f..5734bb854 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -14,6 +14,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do json_response: 3 ] + alias Pleroma.Maps alias Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Plugs.RateLimiter @@ -160,23 +161,22 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p :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(: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) + |> 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[:actor_type]) changeset = User.update_changeset(user, user_params) @@ -206,16 +206,6 @@ defp build_update_activity_params(user) do } 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) 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 @@ def render("short.json", %{app: %App{website: webiste, client_name: name}}) 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/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 @@ defp with_media_attachments(data, %{params: %{"media_attachments" => media_attac 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 @@ defp status_params(params) 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/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 @@ defp handle_existing_authorization( 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 @@ def after_create_authorization(%Plug.Conn{} = conn, %Authorization{} = auth, %{ 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 From f24d2f714f44175cae9fcd878de1629ee32be73c Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 5 Jun 2020 17:18:48 +0200 Subject: [PATCH 293/492] Credo fixes --- lib/pleroma/web/activity_pub/side_effects.ex | 2 +- lib/pleroma/web/activity_pub/transmogrifier.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 10136789a..5258212ec 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -15,8 +15,8 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils - alias Pleroma.Web.Streamer alias Pleroma.Web.Push + alias Pleroma.Web.Streamer def handle(object, meta \\ []) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index f97ab510e..d2347cdc9 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -9,8 +9,8 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do alias Pleroma.Activity alias Pleroma.EarmarkRenderer alias Pleroma.FollowingRelationship - alias Pleroma.Notification alias Pleroma.Maps + alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Object.Containment alias Pleroma.Repo From 167812a3f2c1470012cb161f3c5ba4c021fbad97 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 5 Jun 2020 23:18:29 +0400 Subject: [PATCH 294/492] Fix pagination --- lib/pleroma/pagination.ex | 3 +++ lib/pleroma/web/activity_pub/activity_pub_controller.ex | 2 ++ 2 files changed, 5 insertions(+) diff --git a/lib/pleroma/pagination.ex b/lib/pleroma/pagination.ex index 0ccc7b1f2..1b99e44f9 100644 --- a/lib/pleroma/pagination.ex +++ b/lib/pleroma/pagination.ex @@ -16,6 +16,9 @@ defmodule Pleroma.Pagination do @default_limit 20 @max_limit 40 + @page_keys ["max_id", "min_id", "limit", "since_id", "order"] + + def page_keys, do: @page_keys @spec fetch_paginated(Ecto.Query.t(), map(), type(), atom() | nil) :: [Ecto.Schema.t()] def fetch_paginated(query, params, type \\ :keyset, table_binding \\ nil) diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index 5b8441384..f0b5c6e93 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -238,6 +238,7 @@ def outbox( 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) @@ -354,6 +355,7 @@ def read_inbox( |> 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 = [user.ap_id | User.following(user)] From 4e8c0eecd5179428a47795380a9da1ab0419e024 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 09:46:07 +0200 Subject: [PATCH 295/492] WebPush: Don't break on contentless chat messages. --- lib/pleroma/web/push/impl.ex | 7 +++++++ test/web/push/impl_test.exs | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/pleroma/web/push/impl.ex b/lib/pleroma/web/push/impl.ex index 006a242af..cdb827e76 100644 --- a/lib/pleroma/web/push/impl.ex +++ b/lib/pleroma/web/push/impl.ex @@ -124,6 +124,13 @@ def build_content(notification, actor, object, mastodon_type) 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, diff --git a/test/web/push/impl_test.exs b/test/web/push/impl_test.exs index 8fb7faaa5..b48952b29 100644 --- a/test/web/push/impl_test.exs +++ b/test/web/push/impl_test.exs @@ -8,6 +8,7 @@ defmodule Pleroma.Web.Push.ImplTest do 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 @@ -213,6 +214,30 @@ test "builds content for chat messages" do } 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}) From c5e3f2454c736e09de5c433a2bf578e8eb0e70c3 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 10:35:38 +0200 Subject: [PATCH 296/492] Docs: Unify parameters in examples. --- docs/API/chats.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index abeee698f..761047336 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -41,7 +41,7 @@ This is the overview of using the API. The API is also documented via OpenAPI, s 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}` +`POST /api/v1/pleroma/chats/by-account-id/:account_id` The account id is the normal FlakeId of the user ``` @@ -136,7 +136,7 @@ The usual pagination options are implemented. For a given Chat id, you can get the associated messages with -`GET /api/v1/pleroma/chats/{id}/messages` +`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. @@ -177,7 +177,7 @@ Returned data: Posting a chat message for given Chat id works like this: -`POST /api/v1/pleroma/chats/{id}/messages` +`POST /api/v1/pleroma/chats/:id/messages` Parameters: - content: The text content of the message. Optional if media is attached. @@ -210,7 +210,7 @@ Returned data: Deleting a chat message for given Chat id works like this: -`DELETE /api/v1/pleroma/chats/{chat_id}/messages/{message_id}` +`DELETE /api/v1/pleroma/chats/:chat_id/messages/:message_id` Returned data is the deleted message. From 239d03499ebe9196c099b6c8ded05f1f6634c09d Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 10:38:45 +0200 Subject: [PATCH 297/492] Chat: creation_cng -> changeset Make our usage of this more uniform. --- lib/pleroma/chat.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 5aefddc5e..4fe31de94 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -23,7 +23,7 @@ defmodule Pleroma.Chat do timestamps() end - def creation_cng(struct, params) do + def changeset(struct, params) do struct |> cast(params, [:user_id, :recipient]) |> validate_change(:recipient, fn @@ -49,7 +49,7 @@ def get(user_id, recipient) do def get_or_create(user_id, recipient) do %__MODULE__{} - |> creation_cng(%{user_id: user_id, recipient: recipient}) + |> 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]], @@ -60,7 +60,7 @@ def get_or_create(user_id, recipient) do def bump_or_create(user_id, recipient) do %__MODULE__{} - |> creation_cng(%{user_id: user_id, recipient: recipient}) + |> changeset(%{user_id: user_id, recipient: recipient}) |> Repo.insert( on_conflict: [set: [updated_at: NaiveDateTime.utc_now()]], conflict_target: [:user_id, :recipient] From 137adef6e061a1d7d7fc704feac27ebf5319a768 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 10:42:24 +0200 Subject: [PATCH 298/492] ChatMessageReference: Use FlakeId.Ecto.Type No need for compat because this is brand new. --- lib/pleroma/chat_message_reference.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat_message_reference.ex index fc2aaae7a..6e836cad9 100644 --- a/lib/pleroma/chat_message_reference.ex +++ b/lib/pleroma/chat_message_reference.ex @@ -17,7 +17,7 @@ defmodule Pleroma.ChatMessageReference do import Ecto.Changeset import Ecto.Query - @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true} + @primary_key {:id, FlakeId.Ecto.Type, autogenerate: true} schema "chat_message_references" do belongs_to(:object, Object) From ca0e6e702be3714bb40ff0fb48e9c08aaf322fff Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 11:51:10 +0200 Subject: [PATCH 299/492] ChatMessageReference -> Chat.MessageReference --- .../message_reference.ex} | 2 +- lib/pleroma/web/activity_pub/side_effects.ex | 8 ++--- .../mastodon_api/views/notification_view.ex | 8 ++--- .../controllers/chat_controller.ex | 30 +++++++++---------- .../message_reference_view.ex} | 2 +- .../web/pleroma_api/views/chat_view.ex | 10 +++---- lib/pleroma/web/streamer/streamer.ex | 4 +-- .../message_reference_test.exs} | 6 ++-- test/web/activity_pub/side_effects_test.exs | 8 ++--- .../views/notification_view_test.exs | 9 +++--- .../controllers/chat_controller_test.exs | 18 +++++------ .../message_reference_view_test.exs} | 15 +++++----- test/web/pleroma_api/views/chat_view_test.exs | 8 ++--- test/web/streamer/streamer_test.exs | 6 ++-- 14 files changed, 66 insertions(+), 68 deletions(-) rename lib/pleroma/{chat_message_reference.ex => chat/message_reference.ex} (98%) rename lib/pleroma/web/pleroma_api/views/{chat_message_reference_view.ex => chat/message_reference_view.ex} (95%) rename test/{chat_message_reference_test.exs => chat/message_reference_test.exs} (82%) rename test/web/pleroma_api/views/{chat_message_reference_view_test.exs => chat/message_reference_view_test.exs} (77%) diff --git a/lib/pleroma/chat_message_reference.ex b/lib/pleroma/chat/message_reference.ex similarity index 98% rename from lib/pleroma/chat_message_reference.ex rename to lib/pleroma/chat/message_reference.ex index 6e836cad9..4b201db2e 100644 --- a/lib/pleroma/chat_message_reference.ex +++ b/lib/pleroma/chat/message_reference.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.ChatMessageReference do +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. diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 5258212ec..1e9d6c2fc 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -7,7 +7,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do """ alias Pleroma.Activity alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -111,7 +111,7 @@ def handle(%{data: %{"type" => "Delete", "object" => deleted_object}} = object, Object.decrease_replies_count(in_reply_to) end - ChatMessageReference.delete_for_object(deleted_object) + MessageReference.delete_for_object(deleted_object) ActivityPub.stream_out(object) ActivityPub.stream_out_participations(deleted_object, user) @@ -146,13 +146,13 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do |> Enum.each(fn [user, other_user] -> if user.local do {:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id) - {:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id != actor.ap_id) + {:ok, cm_ref} = MessageReference.create(chat, object, user.ap_id != actor.ap_id) # We add a cache of the unread value here so that it # doesn't change when being streamed out chat = chat - |> Map.put(:unread, ChatMessageReference.unread_count_for_chat(chat)) + |> Map.put(:unread, MessageReference.unread_count_for_chat(chat)) Streamer.stream( ["user", "user:pleroma_chat"], diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 2ae82eb2d..b11578623 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -6,7 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do use Pleroma.Web, :view alias Pleroma.Activity - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.User @@ -15,7 +15,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do alias Pleroma.Web.MastodonAPI.AccountView alias Pleroma.Web.MastodonAPI.NotificationView alias Pleroma.Web.MastodonAPI.StatusView - alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView @parent_types ~w{Like Announce EmojiReact} @@ -139,9 +139,9 @@ 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 = ChatMessageReference.for_chat_and_object(chat, object) + 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 = ChatMessageReferenceView.render("show.json", render_opts) + chat_message_render = MessageReferenceView.render("show.json", render_opts) Map.put(response, :chat_message, chat_message_render) end diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 01d47045d..d6b3415d1 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -6,14 +6,14 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do alias Pleroma.Activity alias Pleroma.Chat - alias Pleroma.ChatMessageReference + 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.ChatMessageReferenceView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView alias Pleroma.Web.PleromaAPI.ChatView import Ecto.Query @@ -46,13 +46,13 @@ def delete_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ message_id: message_id, id: chat_id }) do - with %ChatMessageReference{} = cm_ref <- - ChatMessageReference.get_by_id(message_id), + 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(ChatMessageReferenceView) + |> put_view(MessageReferenceView) |> render("show.json", chat_message_reference: cm_ref) else _e -> @@ -71,7 +71,7 @@ defp remove_or_delete( defp remove_or_delete(cm_ref, _) do cm_ref - |> ChatMessageReference.delete() + |> MessageReference.delete() end def post_chat_message( @@ -87,9 +87,9 @@ def post_chat_message( media_id: params[:media_id] ), message <- Object.normalize(activity, false), - cm_ref <- ChatMessageReference.for_chat_and_object(chat, message) do + cm_ref <- MessageReference.for_chat_and_object(chat, message) do conn - |> put_view(ChatMessageReferenceView) + |> put_view(MessageReferenceView) |> render("show.json", for: user, chat_message_reference: cm_ref) end end @@ -98,20 +98,20 @@ def mark_message_as_read(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ id: chat_id, message_id: message_id }) do - with %ChatMessageReference{} = cm_ref <- - ChatMessageReference.get_by_id(message_id), + 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} <- ChatMessageReference.mark_as_read(cm_ref) do + {:ok, cm_ref} <- MessageReference.mark_as_read(cm_ref) do conn - |> put_view(ChatMessageReferenceView) + |> put_view(MessageReferenceView) |> render("show.json", for: user, chat_message_reference: cm_ref) end end def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), - {_n, _} <- ChatMessageReference.set_all_seen_for_chat(chat) do + {_n, _} <- MessageReference.set_all_seen_for_chat(chat) do conn |> put_view(ChatView) |> render("show.json", chat: chat) @@ -122,11 +122,11 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: id} = para with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do cm_refs = chat - |> ChatMessageReference.for_chat_query() + |> MessageReference.for_chat_query() |> Pagination.fetch_paginated(params |> stringify_keys()) conn - |> put_view(ChatMessageReferenceView) + |> put_view(MessageReferenceView) |> render("index.json", for: user, chat_message_references: cm_refs) else _ -> 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 similarity index 95% rename from lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex rename to lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex index 592bb17f0..f2112a86e 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_message_reference_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat/message_reference_view.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceView do +defmodule Pleroma.Web.PleromaAPI.Chat.MessageReferenceView do use Pleroma.Web, :view alias Pleroma.User diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index 91d50dd1e..d4c10977f 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -6,24 +6,24 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do use Pleroma.Web, :view alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.User alias Pleroma.Web.CommonAPI.Utils alias Pleroma.Web.MastodonAPI.AccountView - alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView + 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] || ChatMessageReference.last_message_for_chat(chat) + 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: Map.get(chat, :unread) || ChatMessageReference.unread_count_for_chat(chat), + unread: Map.get(chat, :unread) || MessageReference.unread_count_for_chat(chat), last_message: last_message && - ChatMessageReferenceView.render("show.json", chat_message_reference: last_message), + MessageReferenceView.render("show.json", chat_message_reference: last_message), updated_at: Utils.to_masto_date(chat.updated_at) } end diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index b22297955..d1d2c9b9c 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -6,7 +6,7 @@ defmodule Pleroma.Web.Streamer do require Logger alias Pleroma.Activity - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Config alias Pleroma.Conversation.Participation alias Pleroma.Notification @@ -187,7 +187,7 @@ defp do_stream(topic, %Notification{} = item) end) end - defp do_stream(topic, {user, %ChatMessageReference{} = cm_ref}) + defp do_stream(topic, {user, %MessageReference{} = cm_ref}) when topic in ["user", "user:pleroma_chat"] do topic = "#{topic}:#{user.id}" diff --git a/test/chat_message_reference_test.exs b/test/chat/message_reference_test.exs similarity index 82% rename from test/chat_message_reference_test.exs rename to test/chat/message_reference_test.exs index 66bf493b4..aaa7c1ad4 100644 --- a/test/chat_message_reference_test.exs +++ b/test/chat/message_reference_test.exs @@ -2,11 +2,11 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.ChatMessageReferenceTest do +defmodule Pleroma.Chat.MessageReferenceTest do use Pleroma.DataCase, async: true alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Web.CommonAPI import Pleroma.Factory @@ -21,7 +21,7 @@ test "it returns the last message in a chat" do {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id) - message = ChatMessageReference.last_message_for_chat(chat) + message = MessageReference.last_message_for_chat(chat) assert message.object.data["content"] == "ho" end diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 43ffe1337..b1afa6a2e 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do alias Pleroma.Activity alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -391,7 +391,7 @@ test "it streams the created ChatMessage" do end end - test "it creates a Chat and ChatMessageReferences for the local users and bumps the unread count, except for the author" do + 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) @@ -431,14 +431,14 @@ test "it creates a Chat and ChatMessageReferences for the local users and bumps chat = Chat.get(author.id, recipient.ap_id) - [cm_ref] = ChatMessageReference.for_chat_query(chat) |> Repo.all() + [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] = ChatMessageReference.for_chat_query(chat) |> Repo.all() + [cm_ref] = MessageReference.for_chat_query(chat) |> Repo.all() assert cm_ref.object.data["content"] == "hey" assert cm_ref.unread == true diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index c5691341a..b2fa5b302 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -7,7 +7,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do alias Pleroma.Activity alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo @@ -17,7 +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.ChatMessageReferenceView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView import Pleroma.Factory defp test_notifications_rendering(notifications, user, expected_result) do @@ -45,15 +45,14 @@ test "ChatMessage notification" do object = Object.normalize(activity) chat = Chat.get(recipient.id, user.ap_id) - cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) expected = %{ id: to_string(notification.id), pleroma: %{is_seen: false}, type: "pleroma:chat_mention", account: AccountView.render("show.json", %{user: user, for: recipient}), - chat_message: - ChatMessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}), + chat_message: MessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}), created_at: Utils.to_masto_date(notification.inserted_at) } diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 7af6dec1c..e73e4a32e 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -5,7 +5,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do use Pleroma.Web.ConnCase, async: true alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub @@ -23,7 +23,7 @@ test "it marks one message as read", %{conn: conn, user: user} do {: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 = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) assert cm_ref.unread == true @@ -34,7 +34,7 @@ test "it marks one message as read", %{conn: conn, user: user} do assert result["unread"] == false - cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) assert cm_ref.unread == false end @@ -50,7 +50,7 @@ test "it marks all messages in a chat as read", %{conn: conn, user: user} do {: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 = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) assert cm_ref.unread == true @@ -61,7 +61,7 @@ test "it marks all messages in a chat as read", %{conn: conn, user: user} do assert result["unread"] == 0 - cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) assert cm_ref.unread == false end @@ -139,7 +139,7 @@ test "it deletes a message from the chat", %{conn: conn, user: user} do chat = Chat.get(user.id, recipient.ap_id) - cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) # Deleting your own message removes the message and the reference result = @@ -149,12 +149,12 @@ test "it deletes a message from the chat", %{conn: conn, user: user} do |> json_response_and_validate_schema(200) assert result["id"] == cm_ref.id - refute ChatMessageReference.get_by_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 = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) result = conn @@ -163,7 +163,7 @@ test "it deletes a message from the chat", %{conn: conn, user: user} do |> json_response_and_validate_schema(200) assert result["id"] == cm_ref.id - refute ChatMessageReference.get_by_id(cm_ref.id) + refute MessageReference.get_by_id(cm_ref.id) assert Object.get_by_id(object.id) 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 similarity index 77% rename from test/web/pleroma_api/views/chat_message_reference_view_test.exs rename to test/web/pleroma_api/views/chat/message_reference_view_test.exs index b53bd3490..e5b165255 100644 --- a/test/web/pleroma_api/views/chat_message_reference_view_test.exs +++ b/test/web/pleroma_api/views/chat/message_reference_view_test.exs @@ -2,15 +2,15 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.PleromaAPI.ChatMessageReferenceViewTest do +defmodule Pleroma.Web.PleromaAPI.Chat.MessageReferenceViewTest do use Pleroma.DataCase alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Object alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.CommonAPI - alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView import Pleroma.Factory @@ -31,9 +31,9 @@ test "it displays a chat message" do object = Object.normalize(activity) - cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) - chat_message = ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref) + chat_message = MessageReferenceView.render("show.json", chat_message_reference: cm_ref) assert chat_message[:id] == cm_ref.id assert chat_message[:content] == "kippis :firefox:" @@ -47,10 +47,9 @@ test "it displays a chat message" do object = Object.normalize(activity) - cm_ref = ChatMessageReference.for_chat_and_object(chat, object) + cm_ref = MessageReference.for_chat_and_object(chat, object) - chat_message_two = - ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref) + 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" diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index f77584dd1..f7af5d4e0 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -6,12 +6,12 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do use Pleroma.DataCase alias Pleroma.Chat - alias Pleroma.ChatMessageReference + 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.ChatMessageReferenceView + alias Pleroma.Web.PleromaAPI.Chat.MessageReferenceView alias Pleroma.Web.PleromaAPI.ChatView import Pleroma.Factory @@ -55,9 +55,9 @@ test "it represents a chat" do represented_chat = ChatView.render("show.json", chat: chat) - cm_ref = ChatMessageReference.for_chat_and_object(chat, chat_message) + cm_ref = MessageReference.for_chat_and_object(chat, chat_message) assert represented_chat[:last_message] == - ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref) + MessageReferenceView.render("show.json", chat_message_reference: cm_ref) end end diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 893ae5449..245f6e63f 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Web.StreamerTest do import Pleroma.Factory alias Pleroma.Chat - alias Pleroma.ChatMessageReference + alias Pleroma.Chat.MessageReference alias Pleroma.Conversation.Participation alias Pleroma.List alias Pleroma.Object @@ -155,7 +155,7 @@ test "it sends chat messages to the 'user:pleroma_chat' stream", %{user: user} d {: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 = ChatMessageReference.for_chat_and_object(chat, object) + 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) @@ -173,7 +173,7 @@ test "it sends chat messages to the 'user' stream", %{user: user} do {: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 = ChatMessageReference.for_chat_and_object(chat, object) + 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) From 9fa3f0b156f92ba575b58b191685fa068a83f4d2 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 13:08:45 +0200 Subject: [PATCH 300/492] Notification: Change type of `type` to an enum. --- lib/pleroma/notification.ex | 3 ++ ..._change_type_to_enum_for_notifications.exs | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 priv/repo/migrations/20200606105430_change_type_to_enum_for_notifications.exs diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 49e27c05a..5c8994e35 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -30,6 +30,9 @@ 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, + # remembert 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) 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 From 9189b489eef29be723389e1b3642a843bc0d01bc Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 15:33:02 +0200 Subject: [PATCH 301/492] Migrations: Move Notification migration code to helper --- lib/pleroma/migration_helper.ex | 85 +++++++++++++++++++ lib/pleroma/notification.ex | 37 +------- ...0602125218_backfill_notification_types.exs | 2 +- test/migration_helper_test.exs | 56 ++++++++++++ test/notification_test.exs | 42 --------- 5 files changed, 144 insertions(+), 78 deletions(-) create mode 100644 lib/pleroma/migration_helper.ex create mode 100644 test/migration_helper_test.exs diff --git a/lib/pleroma/migration_helper.ex b/lib/pleroma/migration_helper.ex new file mode 100644 index 000000000..e6346aff1 --- /dev/null +++ b/lib/pleroma/migration_helper.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 do + alias Pleroma.User + alias Pleroma.Object + alias Pleroma.Notification + alias Pleroma.Repo + + import Ecto.Query + + def fill_in_notification_types do + query = + from(n in Pleroma.Notification, + where: is_nil(n.type), + preload: :activity + ) + + query + |> Repo.all() + |> 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 5c8994e35..682a26912 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -40,26 +40,6 @@ defmodule Pleroma.Notification do timestamps() end - def fill_in_notification_types do - query = - from(n in __MODULE__, - where: is_nil(n.type), - preload: :activity - ) - - query - |> Repo.all() - |> Enum.each(fn notification -> - type = - notification.activity - |> type_from_activity(no_cachex: true) - - notification - |> changeset(%{type: type}) - |> Repo.update() - end) - end - def update_notification_type(user, activity) do with %__MODULE__{} = notification <- Repo.get_by(__MODULE__, user_id: user.id, activity_id: activity.id) do @@ -371,23 +351,10 @@ defp do_create_notifications(%Activity{} = activity, options) do {:ok, notifications} end - defp type_from_activity(%{data: %{"type" => type}} = activity, opts \\ []) do + defp type_from_activity(%{data: %{"type" => type}} = activity) do case type do "Follow" -> - accepted_function = - if Keyword.get(opts, :no_cachex, false) do - # A special function to make this usable in a migration. - 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 - else - &Activity.follow_accepted?/1 - end - - if accepted_function.(activity) do + if Activity.follow_accepted?(activity) do "follow" else "follow_request" diff --git a/priv/repo/migrations/20200602125218_backfill_notification_types.exs b/priv/repo/migrations/20200602125218_backfill_notification_types.exs index 493c0280c..58943fad0 100644 --- a/priv/repo/migrations/20200602125218_backfill_notification_types.exs +++ b/priv/repo/migrations/20200602125218_backfill_notification_types.exs @@ -2,7 +2,7 @@ defmodule Pleroma.Repo.Migrations.BackfillNotificationTypes do use Ecto.Migration def up do - Pleroma.Notification.fill_in_notification_types() + Pleroma.MigrationHelper.fill_in_notification_types() end def down do diff --git a/test/migration_helper_test.exs b/test/migration_helper_test.exs new file mode 100644 index 000000000..1c8173987 --- /dev/null +++ b/test/migration_helper_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.MigrationHelperTest do + use Pleroma.DataCase + + alias Pleroma.Activity + alias Pleroma.MigrationHelper + 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]) + + MigrationHelper.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 f2115a29e..b9bbdceca 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -8,7 +8,6 @@ defmodule Pleroma.NotificationTest do import Pleroma.Factory import Mock - alias Pleroma.Activity alias Pleroma.FollowingRelationship alias Pleroma.Notification alias Pleroma.Repo @@ -22,47 +21,6 @@ defmodule Pleroma.NotificationTest do alias Pleroma.Web.Push alias Pleroma.Web.Streamer - 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]) - - Notification.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 - describe "create_notifications" do test "creates a notification for an emoji reaction" do user = insert(:user) From f77d4a302d8ee5999979136290caac556cac8873 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 15:51:08 +0200 Subject: [PATCH 302/492] Credo fixes. --- lib/pleroma/migration_helper.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/migration_helper.ex b/lib/pleroma/migration_helper.ex index e6346aff1..a20d27a01 100644 --- a/lib/pleroma/migration_helper.ex +++ b/lib/pleroma/migration_helper.ex @@ -3,10 +3,10 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.MigrationHelper do - alias Pleroma.User - alias Pleroma.Object alias Pleroma.Notification + alias Pleroma.Object alias Pleroma.Repo + alias Pleroma.User import Ecto.Query From e1b07402ab077899dd5b9c0023fbe1c48af259e9 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Mon, 23 Mar 2020 22:52:25 +0100 Subject: [PATCH 303/492] User: Add raw_bio, storing unformatted bio Related: https://git.pleroma.social/pleroma/pleroma/issues/1643 --- lib/pleroma/user.ex | 13 +++++++++- .../controllers/account_controller.ex | 1 + .../web/mastodon_api/views/account_view.ex | 13 +--------- .../20200322174133_user_raw_bio.exs | 9 +++++++ .../20200328193433_populate_user_raw_bio.exs | 25 +++++++++++++++++++ test/support/factory.ex | 3 ++- .../update_credentials_test.exs | 13 +++++++--- .../mastodon_api/views/account_view_test.exs | 3 ++- 8 files changed, 61 insertions(+), 19 deletions(-) create mode 100644 priv/repo/migrations/20200322174133_user_raw_bio.exs create mode 100644 priv/repo/migrations/20200328193433_populate_user_raw_bio.exs diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 72ee2d58e..23ca8c9f3 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -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) @@ -432,6 +433,7 @@ def update_changeset(struct, params \\ %{}) do params, [ :bio, + :raw_bio, :name, :emoji, :avatar, @@ -607,7 +609,16 @@ def register_changeset(struct, params \\ %{}, opts \\ []) 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) diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 5734bb854..ebfa533dd 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -165,6 +165,7 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p end) |> 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]) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 04c419d2f..5326b02c6 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -224,7 +224,7 @@ defp do_render("show.json", %{user: user} = opts) do fields: user.fields, bot: bot, source: %{ - note: prepare_user_bio(user), + note: user.raw_bio || "", sensitive: false, fields: user.raw_fields, pleroma: %{ @@ -259,17 +259,6 @@ defp do_render("show.json", %{user: user} = opts) 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/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/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/test/support/factory.ex b/test/support/factory.ex index 6e3676aca..1a9b96180 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -42,7 +42,8 @@ def user_factory do 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 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 7c420985d..76e6d603a 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 @@ -83,10 +83,9 @@ test "sets user settings in a generic way", %{conn: conn} do 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) @@ -94,6 +93,12 @@ test "updates the user's bio", %{conn: conn} 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 diff --git a/test/web/mastodon_api/views/account_view_test.exs b/test/web/mastodon_api/views/account_view_test.exs index f91333e5c..7ac70dc58 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 @@ test "Represent a user account" 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 = %{ From f4cf4ae16ee84655bf6630cf7e98e9eef2f410cc Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 16:48:02 +0200 Subject: [PATCH 304/492] ChatController: Use new oauth scope *:chats. --- .../web/api_spec/operations/chat_operation.ex | 14 +++++++------- .../pleroma_api/controllers/chat_controller.ex | 4 ++-- .../controllers/chat_controller_test.exs | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 6ad325113..74c3ad0bd 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -33,7 +33,7 @@ def mark_as_read_operation do }, security: [ %{ - "oAuth" => ["write"] + "oAuth" => ["write:chats"] } ] } @@ -58,7 +58,7 @@ def mark_message_as_read_operation do }, security: [ %{ - "oAuth" => ["write"] + "oAuth" => ["write:chats"] } ] } @@ -120,7 +120,7 @@ def create_operation do }, security: [ %{ - "oAuth" => ["write"] + "oAuth" => ["write:chats"] } ] } @@ -137,7 +137,7 @@ def index_operation do }, security: [ %{ - "oAuth" => ["read"] + "oAuth" => ["read:chats"] } ] } @@ -161,7 +161,7 @@ def messages_operation do }, security: [ %{ - "oAuth" => ["read"] + "oAuth" => ["read:chats"] } ] } @@ -187,7 +187,7 @@ def post_chat_message_operation do }, security: [ %{ - "oAuth" => ["write"] + "oAuth" => ["write:chats"] } ] } @@ -212,7 +212,7 @@ def delete_message_operation do }, security: [ %{ - "oAuth" => ["write"] + "oAuth" => ["write:chats"] } ] } diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index d6b3415d1..983550b13 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -23,7 +23,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do plug( OAuthScopesPlug, - %{scopes: ["write:statuses"]} + %{scopes: ["write:chats"]} when action in [ :post_chat_message, :create, @@ -35,7 +35,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do plug( OAuthScopesPlug, - %{scopes: ["read:statuses"]} when action in [:messages, :index, :show] + %{scopes: ["read:chats"]} when action in [:messages, :index, :show] ) plug(OpenApiSpex.Plug.CastAndValidate, render_error: Pleroma.Web.ApiSpec.RenderError) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index e73e4a32e..2128fd9dd 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -14,7 +14,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do import Pleroma.Factory describe "POST /api/v1/pleroma/chats/:id/messages/:message_id/read" do - setup do: oauth_access(["write:statuses"]) + setup do: oauth_access(["write:chats"]) test "it marks one message as read", %{conn: conn, user: user} do other_user = insert(:user) @@ -41,7 +41,7 @@ test "it marks one message as read", %{conn: conn, user: user} do end describe "POST /api/v1/pleroma/chats/:id/read" do - setup do: oauth_access(["write:statuses"]) + setup do: oauth_access(["write:chats"]) test "it marks all messages in a chat as read", %{conn: conn, user: user} do other_user = insert(:user) @@ -68,7 +68,7 @@ test "it marks all messages in a chat as read", %{conn: conn, user: user} do end describe "POST /api/v1/pleroma/chats/:id/messages" do - setup do: oauth_access(["write:statuses"]) + setup do: oauth_access(["write:chats"]) test "it posts a message to the chat", %{conn: conn, user: user} do other_user = insert(:user) @@ -125,7 +125,7 @@ test "it works with an attachment", %{conn: conn, user: user} do end describe "DELETE /api/v1/pleroma/chats/:id/messages/:message_id" do - setup do: oauth_access(["write:statuses"]) + setup do: oauth_access(["write:chats"]) test "it deletes a message from the chat", %{conn: conn, user: user} do recipient = insert(:user) @@ -169,7 +169,7 @@ test "it deletes a message from the chat", %{conn: conn, user: user} do end describe "GET /api/v1/pleroma/chats/:id/messages" do - setup do: oauth_access(["read:statuses"]) + setup do: oauth_access(["read:chats"]) test "it paginates", %{conn: conn, user: user} do recipient = insert(:user) @@ -229,7 +229,7 @@ test "it returns the messages for a given chat", %{conn: conn, user: user} do end describe "POST /api/v1/pleroma/chats/by-account-id/:id" do - setup do: oauth_access(["write:statuses"]) + setup do: oauth_access(["write:chats"]) test "it creates or returns a chat", %{conn: conn} do other_user = insert(:user) @@ -244,7 +244,7 @@ test "it creates or returns a chat", %{conn: conn} do end describe "GET /api/v1/pleroma/chats/:id" do - setup do: oauth_access(["read:statuses"]) + setup do: oauth_access(["read:chats"]) test "it returns a chat", %{conn: conn, user: user} do other_user = insert(:user) @@ -261,7 +261,7 @@ test "it returns a chat", %{conn: conn, user: user} do end describe "GET /api/v1/pleroma/chats" do - setup do: oauth_access(["read:statuses"]) + setup do: oauth_access(["read:chats"]) test "it does not return chats with users you blocked", %{conn: conn, user: user} do recipient = insert(:user) From 40fc4e974e5f60c3d61702b17029566774898e84 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 6 Jun 2020 16:59:08 +0200 Subject: [PATCH 305/492] Notfication: Add validation of notification types --- lib/pleroma/notification.ex | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 682a26912..3ac8737e2 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -61,9 +61,21 @@ def unread_notifications_count(%User{id: user_id}) 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, :type]) + |> validate_inclusion(:type, @notification_types) end @spec last_read_query(User.t()) :: Ecto.Queryable.t() From 0365053c8dbbcae4a4883f68b7eaec263c14f656 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 7 Jun 2020 09:19:00 +0200 Subject: [PATCH 306/492] AttachmentValidator: Check if the mime type is valid. --- .../activity_pub/object_validators/attachment_validator.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex index c4b502cb9..f53bb02be 100644 --- a/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/attachment_validator.ex @@ -45,11 +45,11 @@ def fix_media_type(data) do data |> Map.put_new("mediaType", data["mimeType"]) - if data["mediaType"] == "" do + if MIME.valid?(data["mediaType"]) do data - |> Map.put("mediaType", "application/octet-stream") else data + |> Map.put("mediaType", "application/octet-stream") end end From 1a11f0e453527070a8ab5511318045470abc95e2 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 7 Jun 2020 14:25:30 +0200 Subject: [PATCH 307/492] Chats: Change id to flake id. --- lib/pleroma/chat.ex | 3 +++ lib/pleroma/chat/message_reference.ex | 2 +- ...20200607112923_change_chat_id_to_flake.exs | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 priv/repo/migrations/20200607112923_change_chat_id_to_flake.exs diff --git a/lib/pleroma/chat.ex b/lib/pleroma/chat.ex index 4fe31de94..24a86371e 100644 --- a/lib/pleroma/chat.ex +++ b/lib/pleroma/chat.ex @@ -16,6 +16,8 @@ defmodule Pleroma.Chat do 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) @@ -63,6 +65,7 @@ def bump_or_create(user_id, recipient) do |> 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 diff --git a/lib/pleroma/chat/message_reference.ex b/lib/pleroma/chat/message_reference.ex index 4b201db2e..7ee7508ca 100644 --- a/lib/pleroma/chat/message_reference.ex +++ b/lib/pleroma/chat/message_reference.ex @@ -21,7 +21,7 @@ defmodule Pleroma.Chat.MessageReference do schema "chat_message_references" do belongs_to(:object, Object) - belongs_to(:chat, Chat) + belongs_to(:chat, Chat, type: FlakeId.Ecto.CompatType) field(:unread, :boolean, default: true) 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 From 2cdaac433035d8df3890eae098b55380b9e1c9fc Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 7 Jun 2020 14:52:56 +0200 Subject: [PATCH 308/492] SideEffects: Move streaming of chats to after the transaction. --- lib/pleroma/web/activity_pub/side_effects.ex | 59 ++++++++++++------- .../web/pleroma_api/views/chat_view.ex | 3 +- test/web/activity_pub/side_effects_test.exs | 41 ++++--------- test/web/common_api/common_api_test.exs | 1 + test/web/pleroma_api/views/chat_view_test.exs | 15 ----- 5 files changed, 52 insertions(+), 67 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 1e9d6c2fc..1a1cc675c 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -37,7 +37,7 @@ def handle(%{data: %{"type" => "Like"}} = object, meta) do # - 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 + with {:ok, _object, meta} <- handle_object_creation(meta[:object_data], meta) do {:ok, notifications} = Notification.create_notifications(activity, do_send: false) meta = @@ -142,24 +142,24 @@ def handle_object_creation(%{"type" => "ChatMessage"} = object, meta) do actor = User.get_cached_by_ap_id(object.data["actor"]) recipient = User.get_cached_by_ap_id(hd(object.data["to"])) - [[actor, recipient], [recipient, actor]] - |> Enum.each(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) + 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) - # We add a cache of the unread value here so that it - # doesn't change when being streamed out - chat = - chat - |> Map.put(:unread, MessageReference.unread_count_for_chat(chat)) + { + ["user", "user:pleroma_chat"], + {user, %{cm_ref | chat: chat, object: object}} + } + end + end) + |> Enum.filter(& &1) - Streamer.stream( - ["user", "user:pleroma_chat"], - {user, %{cm_ref | chat: chat, object: object}} - ) - end - end) + meta = + meta + |> add_streamables(streamables) {:ok, object, meta} end @@ -208,7 +208,7 @@ def handle_undoing( def handle_undoing(object), do: {:error, ["don't know how to handle", object]} defp send_notifications(meta) do - Keyword.get(meta, :created_notifications, []) + Keyword.get(meta, :notifications, []) |> Enum.each(fn notification -> Streamer.stream(["user", "user:notification"], notification) Push.send(notification) @@ -217,15 +217,32 @@ defp send_notifications(meta) do meta end - defp add_notifications(meta, notifications) do - existing = Keyword.get(meta, :created_notifications, []) + defp send_streamables(meta) do + Keyword.get(meta, :streamables, []) + |> Enum.each(fn {topics, items} -> + Streamer.stream(topics, items) + end) meta - |> Keyword.put(:created_notifications, notifications ++ existing) + 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/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex index d4c10977f..1c996da11 100644 --- a/lib/pleroma/web/pleroma_api/views/chat_view.ex +++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex @@ -14,13 +14,12 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do 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: Map.get(chat, :unread) || MessageReference.unread_count_for_chat(chat), + unread: MessageReference.unread_count_for_chat(chat), last_message: last_message && MessageReferenceView.render("show.json", chat_message_reference: last_message), diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index b1afa6a2e..6bbbaae87 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -23,7 +23,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do import Mock describe "handle_after_transaction" do - test "it streams out notifications" do + test "it streams out notifications and streams" do author = insert(:user, local: true) recipient = insert(:user, local: true) @@ -37,7 +37,7 @@ test "it streams out notifications" do {:ok, _create_activity, meta} = SideEffects.handle(create_activity, local: false, object_data: chat_message_data) - assert [notification] = meta[:created_notifications] + assert [notification] = meta[:notifications] with_mocks([ { @@ -58,6 +58,7 @@ test "it streams out notifications" 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 @@ -362,33 +363,10 @@ test "it streams the created ChatMessage" do {:ok, create_activity, _meta} = ActivityPub.persist(create_activity_data, local: false) - with_mock Pleroma.Web.Streamer, [], - stream: fn _, payload -> - case payload do - {^author, cm_ref} -> - assert cm_ref.unread == false + {:ok, _create_activity, meta} = + SideEffects.handle(create_activity, local: false, object_data: chat_message_data) - {^recipient, cm_ref} -> - assert cm_ref.unread == true - - view = - Pleroma.Web.PleromaAPI.ChatView.render("show.json", - last_message: cm_ref, - chat: cm_ref.chat - ) - - assert view.unread == 1 - - _ -> - nil - end - end do - {:ok, _create_activity, _meta} = - SideEffects.handle(create_activity, local: false, object_data: chat_message_data) - - assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], {author, :_})) - assert called(Pleroma.Web.Streamer.stream(["user", "user:pleroma_chat"], {recipient, :_})) - end + 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 @@ -422,13 +400,18 @@ test "it creates a Chat and MessageReferences for the local users and bumps the SideEffects.handle(create_activity, local: false, object_data: chat_message_data) # The notification gets created - assert [notification] = meta[:created_notifications] + 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() diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 63b59820e..6bd26050e 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -72,6 +72,7 @@ test "it posts a chat message without content but with an attachment" do 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 diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs index f7af5d4e0..14eecb1bd 100644 --- a/test/web/pleroma_api/views/chat_view_test.exs +++ b/test/web/pleroma_api/views/chat_view_test.exs @@ -16,21 +16,6 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do import Pleroma.Factory - test "giving a chat with an 'unread' field, it uses that" do - user = insert(:user) - recipient = insert(:user) - - {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id) - - chat = - chat - |> Map.put(:unread, 5) - - represented_chat = ChatView.render("show.json", chat: chat) - - assert represented_chat[:unread] == 5 - end - test "it represents a chat" do user = insert(:user) recipient = insert(:user) From 801e668a97adff4a33451dd7bb48799562ed8796 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 7 Jun 2020 15:38:33 +0200 Subject: [PATCH 309/492] ChatController: Add `last_read_id` option to mark_as_read. --- lib/pleroma/chat/message_reference.ex | 20 +++++++++++----- .../web/api_spec/operations/chat_operation.ex | 18 ++++++++++++++ .../controllers/chat_controller.ex | 3 ++- .../controllers/chat_controller_test.exs | 24 +++++++++++++++++++ 4 files changed, 58 insertions(+), 7 deletions(-) diff --git a/lib/pleroma/chat/message_reference.ex b/lib/pleroma/chat/message_reference.ex index 7ee7508ca..131ae0186 100644 --- a/lib/pleroma/chat/message_reference.ex +++ b/lib/pleroma/chat/message_reference.ex @@ -98,12 +98,20 @@ def mark_as_read(cm_ref) do |> Repo.update() end - def set_all_seen_for_chat(chat) do - chat - |> for_chat_query() - |> exclude(:order_by) - |> exclude(:preload) - |> where([cmr], cmr.unread == true) + 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/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 74c3ad0bd..45fbad311 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -23,6 +23,7 @@ def mark_as_read_operation do 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( @@ -333,4 +334,21 @@ def chat_message_create do } } end + + def mark_as_read do + %Schema{ + title: "MarkAsReadRequest", + description: "POST body for marking a number of chat messages as read", + type: :object, + properties: %{ + last_read_id: %Schema{ + type: :string, + description: "The content of your message. Optional." + } + }, + example: %{ + "last_read_id" => "abcdef12456" + } + } + end end diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 983550b13..002b75082 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -111,7 +111,8 @@ def mark_message_as_read(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ def mark_as_read(%{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) do + {_n, _} <- + MessageReference.set_all_seen_for_chat(chat, conn.body_params[:last_read_id]) do conn |> put_view(ChatView) |> render("show.json", chat: chat) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 2128fd9dd..63cd89c73 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -65,6 +65,30 @@ test "it marks all messages in a chat as read", %{conn: conn, user: user} do assert cm_ref.unread == false end + + test "it given a `last_read_id` ", %{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 From 680fa5fa36d8b30a9a9749edacf1a2c69fded29a Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 7 Jun 2020 15:41:46 +0200 Subject: [PATCH 310/492] Docs: Update docs on mark as read. --- docs/API/chats.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/API/chats.md b/docs/API/chats.md index 761047336..81ff57941 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -79,6 +79,11 @@ To set the `unread` count of a chat to 0, call `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. This should always be used. + + Returned data: ```json From 8d9e58688712ea416109aaee2883cc9ace644e02 Mon Sep 17 00:00:00 2001 From: Sergey Suprunenko Date: Sun, 7 Jun 2020 17:31:37 +0200 Subject: [PATCH 311/492] Delete pending follow requests on user deletion --- lib/pleroma/following_relationship.ex | 6 ++++++ lib/pleroma/user.ex | 8 ++++++++ test/user_test.exs | 5 +++++ 3 files changed, 19 insertions(+) diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 3a3082e72..093b1f405 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -141,6 +141,12 @@ def following_query(%User{} = user) 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/user.ex b/lib/pleroma/user.ex index 72ee2d58e..c5c74d132 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1489,6 +1489,8 @@ def perform(:delete, %User{} = user) do delete_user_activities(user) + delete_outgoing_pending_follow_requests(user) + delete_or_deactivate(user) end @@ -1611,6 +1613,12 @@ defp delete_activity(%{data: %{"type" => type}} = activity, user) 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 diff --git a/test/user_test.exs b/test/user_test.exs index 6b344158d..d68b4a58c 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -1159,6 +1159,9 @@ test "it deactivates a user, all follow relationships and all activities", %{use 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) @@ -1177,6 +1180,8 @@ test "it deactivates a user, all follow relationships and all activities", %{use 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() From fe2a5d061463313f447b0557de05572fa3771728 Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 7 Jun 2020 20:22:08 +0200 Subject: [PATCH 312/492] ChatController: Make last_read_id mandatory. --- .../web/api_spec/operations/chat_operation.ex | 3 +- .../controllers/chat_controller.ex | 7 +++-- .../controllers/chat_controller_test.exs | 28 +++---------------- 3 files changed, 11 insertions(+), 27 deletions(-) diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 45fbad311..cf299bfc2 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -340,10 +340,11 @@ def mark_as_read do 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. Optional." + description: "The content of your message." } }, example: %{ diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 002b75082..b9949236c 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -109,10 +109,13 @@ def mark_message_as_read(%{assigns: %{user: %{id: user_id} = user}} = conn, %{ end end - def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do + 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, conn.body_params[:last_read_id]) do + MessageReference.set_all_seen_for_chat(chat, last_read_id) do conn |> put_view(ChatView) |> render("show.json", chat: chat) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index 63cd89c73..c2960956d 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -43,30 +43,10 @@ test "it marks one message as read", %{conn: conn, user: user} do describe "POST /api/v1/pleroma/chats/:id/read" do setup do: oauth_access(["write:chats"]) - test "it marks all messages in a chat 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}/read") - |> json_response_and_validate_schema(200) - - assert result["unread"] == 0 - - cm_ref = MessageReference.for_chat_and_object(chat, object) - - assert cm_ref.unread == false - end - - test "it given a `last_read_id` ", %{conn: conn, user: user} do + 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") From 1a2acce7c5927cd113ebcffd0acc7a5c547bbf0e Mon Sep 17 00:00:00 2001 From: lain Date: Sun, 7 Jun 2020 20:23:17 +0200 Subject: [PATCH 313/492] Docs: Document new mandatory parameter. --- docs/API/chats.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 81ff57941..9eb581943 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -75,13 +75,13 @@ Returned data: ### Marking a chat as read -To set the `unread` count of a chat to 0, call +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. This should always be used. +- last_read_id: Given this id, all chat messages until this one will be marked as read. Required. Returned data: From 89b85f65297ef4b8ce92eacb27c90e8f7c874f54 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 8 Jun 2020 11:09:53 +0200 Subject: [PATCH 314/492] ChatController: Remove nonsensical pagination. --- docs/API/chats.md | 2 +- .../web/pleroma_api/controllers/chat_controller.ex | 4 ++-- .../pleroma_api/controllers/chat_controller_test.exs | 11 ++--------- 3 files changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/API/chats.md b/docs/API/chats.md index 9eb581943..aa6119670 100644 --- a/docs/API/chats.md +++ b/docs/API/chats.md @@ -135,7 +135,7 @@ Returned data: ``` The recipient of messages that are sent to this chat is given by their AP ID. -The usual pagination options are implemented. +No pagination is implemented for now. ### Getting the messages for a Chat diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index b9949236c..e4760f53e 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -140,7 +140,7 @@ def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{id: id} = para end end - def index(%{assigns: %{user: %{id: user_id} = user}} = conn, params) do + def index(%{assigns: %{user: %{id: user_id} = user}} = conn, _params) do blocked_ap_ids = User.blocked_users_ap_ids(user) chats = @@ -149,7 +149,7 @@ def index(%{assigns: %{user: %{id: user_id} = user}} = conn, params) do where: c.recipient not in ^blocked_ap_ids, order_by: [desc: c.updated_at] ) - |> Pagination.fetch_paginated(params |> stringify_keys) + |> Repo.all() conn |> put_view(ChatView) diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs index c2960956d..82e16741d 100644 --- a/test/web/pleroma_api/controllers/chat_controller_test.exs +++ b/test/web/pleroma_api/controllers/chat_controller_test.exs @@ -289,7 +289,7 @@ test "it does not return chats with users you blocked", %{conn: conn, user: user assert length(result) == 0 end - test "it paginates", %{conn: conn, user: user} do + 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) @@ -300,14 +300,7 @@ test "it paginates", %{conn: conn, user: user} do |> get("/api/v1/pleroma/chats") |> json_response_and_validate_schema(200) - assert length(result) == 20 - - result = - conn - |> get("/api/v1/pleroma/chats?max_id=#{List.last(result)["id"]}") - |> json_response_and_validate_schema(200) - - assert length(result) == 10 + assert length(result) == 30 end test "it return a list of chats the current user is participating in, in descending order of updates", From d44843e6774ed1c60d510a5307e0113e39569416 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Mon, 8 Jun 2020 17:56:34 +0400 Subject: [PATCH 315/492] Restrict ActivityExpirationPolicy to Notes only --- .../mrf/activity_expiration_policy.ex | 6 ++++- .../mrf/activity_expiration_policy_test.exs | 26 +++++++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex index a9bdf3b69..8e47f1e02 100644 --- a/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex +++ b/lib/pleroma/web/activity_pub/mrf/activity_expiration_policy.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy do @impl true def filter(activity) do activity = - if activity["type"] == "Create" && local?(activity) do + if note?(activity) and local?(activity) do maybe_add_expiration(activity) else activity @@ -25,6 +25,10 @@ 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) diff --git a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs index 0d3bcc457..8babf49e7 100644 --- a/test/web/activity_pub/mrf/activity_expiration_policy_test.exs +++ b/test/web/activity_pub/mrf/activity_expiration_policy_test.exs @@ -10,7 +10,11 @@ defmodule Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicyTest do test "adds `expires_at` property" do assert {:ok, %{"type" => "Create", "expires_at" => expires_at}} = - ActivityExpirationPolicy.filter(%{"id" => @id, "type" => "Create"}) + ActivityExpirationPolicy.filter(%{ + "id" => @id, + "type" => "Create", + "object" => %{"type" => "Note"} + }) assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 end @@ -22,7 +26,8 @@ test "keeps existing `expires_at` if it less than the config setting" do ActivityExpirationPolicy.filter(%{ "id" => @id, "type" => "Create", - "expires_at" => expires_at + "expires_at" => expires_at, + "object" => %{"type" => "Note"} }) end @@ -33,7 +38,8 @@ test "overwrites existing `expires_at` if it greater than the config setting" do ActivityExpirationPolicy.filter(%{ "id" => @id, "type" => "Create", - "expires_at" => too_distant_future + "expires_at" => too_distant_future, + "object" => %{"type" => "Note"} }) assert Timex.diff(expires_at, NaiveDateTime.utc_now(), :days) == 364 @@ -43,13 +49,14 @@ test "ignores remote activities" do assert {:ok, activity} = ActivityExpirationPolicy.filter(%{ "id" => "https://example.com/123", - "type" => "Create" + "type" => "Create", + "object" => %{"type" => "Note"} }) refute Map.has_key?(activity, "expires_at") end - test "ignores non-Create activities" do + test "ignores non-Create/Note activities" do assert {:ok, activity} = ActivityExpirationPolicy.filter(%{ "id" => "https://example.com/123", @@ -57,5 +64,14 @@ test "ignores non-Create activities" do }) 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 From fe1cb56fdc52092a8af2895fae4c020679156674 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Mon, 8 Jun 2020 21:04:16 +0200 Subject: [PATCH 316/492] transmogrifier: MIME.valid?/1 for mediaType No issues with the rest of the network yet but this makes sure it will work once https://git.pleroma.social/pleroma/pleroma/-/merge_requests/2429 is merged. --- lib/pleroma/web/activity_pub/transmogrifier.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index fda1c71df..543972ae9 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -221,9 +221,9 @@ def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachm 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 From fc04a138d46c43860a2838d60fc8668112fdc1ec Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 8 Jun 2020 20:01:37 +0000 Subject: [PATCH 317/492] Apply suggestion to lib/pleroma/notification.ex --- lib/pleroma/notification.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 3ac8737e2..3386a1933 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -31,7 +31,7 @@ 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, - # remembert to add a migration to add it to the `notifications_type` enum + # 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) From e1bc37d11852684a5007a9550208944d899800ca Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 9 Jun 2020 09:20:55 +0200 Subject: [PATCH 318/492] MigrationHelper: Move notification backfilling to own module. --- .../notification_backfill.ex} | 2 +- .../20200602125218_backfill_notification_types.exs | 2 +- .../notification_backfill_test.exs} | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename lib/pleroma/{migration_helper.ex => migration_helper/notification_backfill.ex} (97%) rename test/{migration_helper_test.exs => migration_helper/notification_backfill_test.exs} (91%) diff --git a/lib/pleroma/migration_helper.ex b/lib/pleroma/migration_helper/notification_backfill.ex similarity index 97% rename from lib/pleroma/migration_helper.ex rename to lib/pleroma/migration_helper/notification_backfill.ex index a20d27a01..09647d12a 100644 --- a/lib/pleroma/migration_helper.ex +++ b/lib/pleroma/migration_helper/notification_backfill.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.MigrationHelper do +defmodule Pleroma.MigrationHelper.NotificationBackfill do alias Pleroma.Notification alias Pleroma.Object alias Pleroma.Repo diff --git a/priv/repo/migrations/20200602125218_backfill_notification_types.exs b/priv/repo/migrations/20200602125218_backfill_notification_types.exs index 58943fad0..996d721ee 100644 --- a/priv/repo/migrations/20200602125218_backfill_notification_types.exs +++ b/priv/repo/migrations/20200602125218_backfill_notification_types.exs @@ -2,7 +2,7 @@ defmodule Pleroma.Repo.Migrations.BackfillNotificationTypes do use Ecto.Migration def up do - Pleroma.MigrationHelper.fill_in_notification_types() + Pleroma.MigrationHelper.NotificationBackfill.fill_in_notification_types() end def down do diff --git a/test/migration_helper_test.exs b/test/migration_helper/notification_backfill_test.exs similarity index 91% rename from test/migration_helper_test.exs rename to test/migration_helper/notification_backfill_test.exs index 1c8173987..2a62a2b00 100644 --- a/test/migration_helper_test.exs +++ b/test/migration_helper/notification_backfill_test.exs @@ -2,11 +2,11 @@ # Copyright © 2017-2020 Pleroma Authors # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.MigrationHelperTest do +defmodule Pleroma.MigrationHelper.NotificationBackfillTest do use Pleroma.DataCase alias Pleroma.Activity - alias Pleroma.MigrationHelper + alias Pleroma.MigrationHelper.NotificationBackfill alias Pleroma.Notification alias Pleroma.Repo alias Pleroma.Web.CommonAPI @@ -35,7 +35,7 @@ test "it fills in missing notification types" do assert {5, nil} = Repo.update_all(Notification, set: [type: nil]) - MigrationHelper.fill_in_notification_types() + NotificationBackfill.fill_in_notification_types() assert %{type: "mention"} = Repo.get_by(Notification, user_id: other_user.id, activity_id: post.id) From 063e6b9841ec72c7e89339c54581d199fa31e675 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 9 Jun 2020 10:53:40 +0200 Subject: [PATCH 319/492] StatusController: Correctly paginate favorites. Favorites were paginating wrongly, because the pagination headers where using the id of the id of the `Create` activity, while the ordering was by the id of the `Like` activity. This isn't easy to notice in most cases, as they usually have a similar order because people tend to favorite posts as they come in. This commit adds a way to give different pagination ids to the pagination helper, so we can paginate correctly in cases like this. --- lib/pleroma/activity.ex | 4 ++ lib/pleroma/web/activity_pub/activity_pub.ex | 5 +- .../api_spec/operations/status_operation.ex | 3 +- lib/pleroma/web/controller_helper.ex | 56 +++++++++++-------- .../controllers/status_controller_test.exs | 43 ++++++++++++-- 5 files changed, 79 insertions(+), 32 deletions(-) diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index 6213d0eb7..f800447fd 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -41,6 +41,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) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index eb73c95fe..cc883ccce 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1138,12 +1138,11 @@ def fetch_favourites(user, params \\ %{}, pagination \\ :keyset) do |> Activity.Queries.by_type("Like") |> Activity.with_joined_object() |> Object.with_joined_activity() - |> select([_like, object, activity], %{activity | object: object}) + |> 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 + pagination ) end diff --git a/lib/pleroma/web/api_spec/operations/status_operation.ex b/lib/pleroma/web/api_spec/operations/status_operation.ex index ca9db01e5..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 @@ def favourites_operation 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"]}], diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 5d67d75b5..5e33e0810 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -57,35 +57,45 @@ def add_link_headers(conn, activities, extra_params) do end end + 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(Pagination.page_keys() -- ["limit", "order"]) + + fields = %{ + "next" => current_url(conn, Map.put(params, :max_id, max_id)), + "prev" => current_url(conn, Map.put(params, :min_id, min_id)) + } + + # Generating an `id` without already present pagination keys would + # need a query-restriction with an `q.id >= ^id` or `q.id <= ^id` + # instead of the `q.id > ^min_id` and `q.id < ^max_id`. + # This is because we only have ids present inside of the page, while + # `min_id`, `since_id` and `max_id` requires to know one outside of it. + if Map.take(conn.params, Pagination.page_keys() -- ["limit", "order"]) != [] do + Map.put(fields, "id", current_url(conn, conn.params)) + else + fields + end + end + def get_pagination_fields(conn, activities, extra_params \\ %{}) do case List.last(activities) do - %{id: max_id} -> - params = - conn.params - |> Map.drop(Map.keys(conn.path_params)) - |> Map.merge(extra_params) - |> Map.drop(Pagination.page_keys() -- ["limit", "order"]) - - min_id = + %{pagination_id: max_id} when not is_nil(max_id) -> + %{pagination_id: min_id} = activities |> List.first() - |> Map.get(:id) - fields = %{ - "next" => current_url(conn, Map.put(params, :max_id, max_id)), - "prev" => current_url(conn, Map.put(params, :min_id, min_id)) - } + build_pagination_fields(conn, min_id, max_id, extra_params) - # Generating an `id` without already present pagination keys would - # need a query-restriction with an `q.id >= ^id` or `q.id <= ^id` - # instead of the `q.id > ^min_id` and `q.id < ^max_id`. - # This is because we only have ids present inside of the page, while - # `min_id`, `since_id` and `max_id` requires to know one outside of it. - if Map.take(conn.params, Pagination.page_keys() -- ["limit", "order"]) != [] do - Map.put(fields, "id", current_url(conn, conn.params)) - else - fields - end + %{id: max_id} -> + %{id: min_id} = + activities + |> List.first() + + build_pagination_fields(conn, min_id, max_id, extra_params) _ -> %{} diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index 700c82e4f..648e6f2ce 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -1541,14 +1541,49 @@ test "context" 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 @@ test "returns the favorites of a user" 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) From 3dd1de61a78f9571a1d886411d70cd52584e084a Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Mon, 8 Jun 2020 22:08:57 +0400 Subject: [PATCH 320/492] Add `url` field to AdminAPI.AccountView --- .../web/admin_api/views/account_view.ex | 3 +- .../controllers/admin_api_controller_test.exs | 66 ++++++++++++------- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/lib/pleroma/web/admin_api/views/account_view.ex b/lib/pleroma/web/admin_api/views/account_view.ex index 120159527..e1e929632 100644 --- a/lib/pleroma/web/admin_api/views/account_view.ex +++ b/lib/pleroma/web/admin_api/views/account_view.ex @@ -76,7 +76,8 @@ def render("show.json", %{user: user}) do "local" => user.local, "roles" => User.roles(user), "tags" => user.tags || [], - "confirmation_pending" => user.confirmation_pending + "confirmation_pending" => user.confirmation_pending, + "url" => user.uri || user.ap_id } 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 index bea810c4a..e3d3ccb8d 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -337,7 +337,8 @@ test "Show", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } assert expected == json_response(conn, 200) @@ -614,7 +615,8 @@ test "renders users array for the first page", %{conn: conn, admin: admin} do "tags" => [], "avatar" => User.avatar_url(admin) |> MediaProxy.url(), "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => admin.ap_id }, %{ "deactivated" => user.deactivated, @@ -625,7 +627,8 @@ test "renders users array for the first page", %{conn: conn, admin: admin} do "tags" => ["foo", "bar"], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] |> Enum.sort_by(& &1["nickname"]) @@ -697,7 +700,8 @@ test "regular search", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -722,7 +726,8 @@ test "search by domain", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -747,7 +752,8 @@ test "search by full nickname", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -772,7 +778,8 @@ test "search by display name", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -797,7 +804,8 @@ test "search by email", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -822,7 +830,8 @@ test "regular search with page size", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -842,7 +851,8 @@ test "regular search with page size", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(user2) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user2.name || user2.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user2.ap_id } ] } @@ -874,7 +884,8 @@ test "only local users" do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -899,7 +910,8 @@ test "only local users with no query", %{conn: conn, admin: old_admin} do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id }, %{ "deactivated" => admin.deactivated, @@ -910,7 +922,8 @@ test "only local users with no query", %{conn: conn, admin: old_admin} do "tags" => [], "avatar" => User.avatar_url(admin) |> MediaProxy.url(), "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => admin.ap_id }, %{ "deactivated" => false, @@ -921,7 +934,8 @@ test "only local users with no query", %{conn: conn, admin: old_admin} do "tags" => [], "avatar" => User.avatar_url(old_admin) |> MediaProxy.url(), "display_name" => HTML.strip_tags(old_admin.name || old_admin.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => old_admin.ap_id } ] |> Enum.sort_by(& &1["nickname"]) @@ -951,7 +965,8 @@ test "load only admins", %{conn: conn, admin: admin} do "tags" => [], "avatar" => User.avatar_url(admin) |> MediaProxy.url(), "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => admin.ap_id }, %{ "deactivated" => false, @@ -962,7 +977,8 @@ test "load only admins", %{conn: conn, admin: admin} do "tags" => [], "avatar" => User.avatar_url(second_admin) |> MediaProxy.url(), "display_name" => HTML.strip_tags(second_admin.name || second_admin.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => second_admin.ap_id } ] |> Enum.sort_by(& &1["nickname"]) @@ -994,7 +1010,8 @@ test "load only moderators", %{conn: conn} do "tags" => [], "avatar" => User.avatar_url(moderator) |> MediaProxy.url(), "display_name" => HTML.strip_tags(moderator.name || moderator.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => moderator.ap_id } ] } @@ -1019,7 +1036,8 @@ test "load users with tags list", %{conn: conn} do "tags" => ["first"], "avatar" => User.avatar_url(user1) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user1.name || user1.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user1.ap_id }, %{ "deactivated" => false, @@ -1030,7 +1048,8 @@ test "load users with tags list", %{conn: conn} do "tags" => ["second"], "avatar" => User.avatar_url(user2) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user2.name || user2.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user2.ap_id } ] |> Enum.sort_by(& &1["nickname"]) @@ -1069,7 +1088,8 @@ test "it works with multiple filters" do "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } ] } @@ -1093,7 +1113,8 @@ test "it omits relay user", %{admin: admin, conn: conn} do "tags" => [], "avatar" => User.avatar_url(admin) |> MediaProxy.url(), "display_name" => HTML.strip_tags(admin.name || admin.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => admin.ap_id } ] } @@ -1155,7 +1176,8 @@ test "PATCH /api/pleroma/admin/users/:nickname/toggle_activation", %{admin: admi "tags" => [], "avatar" => User.avatar_url(user) |> MediaProxy.url(), "display_name" => HTML.strip_tags(user.name || user.nickname), - "confirmation_pending" => false + "confirmation_pending" => false, + "url" => user.ap_id } log_entry = Repo.one(ModerationLog) From c4f267b3bef90dcac21b7db2a91f86d3ba5dc7c2 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 08:02:26 +0000 Subject: [PATCH 321/492] Apply suggestion to lib/pleroma/web/controller_helper.ex --- lib/pleroma/web/controller_helper.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 5e33e0810..6cb19d539 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -57,6 +57,7 @@ def add_link_headers(conn, activities, extra_params) do end end + @id_keys Pagination.page_keys() -- ["limit", "order"] defp build_pagination_fields(conn, min_id, max_id, extra_params) do params = conn.params From be7c322865b2b7aa1c8c25147cc598b6362ab187 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 08:02:35 +0000 Subject: [PATCH 322/492] Apply suggestion to lib/pleroma/web/controller_helper.ex --- lib/pleroma/web/controller_helper.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 6cb19d539..b7971e940 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -63,7 +63,7 @@ defp build_pagination_fields(conn, min_id, max_id, extra_params) do conn.params |> Map.drop(Map.keys(conn.path_params)) |> Map.merge(extra_params) - |> Map.drop(Pagination.page_keys() -- ["limit", "order"]) + |> Map.drop(@id_keys) fields = %{ "next" => current_url(conn, Map.put(params, :max_id, max_id)), From b4c50be9df701dc9faf0a25f776f631d2175c99f Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 08:12:29 +0000 Subject: [PATCH 323/492] Apply suggestion to lib/pleroma/web/controller_helper.ex --- lib/pleroma/web/controller_helper.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index b7971e940..ab6e6c61a 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -75,7 +75,7 @@ defp build_pagination_fields(conn, min_id, max_id, extra_params) do # instead of the `q.id > ^min_id` and `q.id < ^max_id`. # This is because we only have ids present inside of the page, while # `min_id`, `since_id` and `max_id` requires to know one outside of it. - if Map.take(conn.params, Pagination.page_keys() -- ["limit", "order"]) != [] do + if Map.take(conn.params, @id_keys) != %{} do Map.put(fields, "id", current_url(conn, conn.params)) else fields From 86fec45f40dfa45cc89eddc6dcc7799e89d6f461 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 11:09:45 +0200 Subject: [PATCH 324/492] ControllerHelper: Fix wrong comparison. --- lib/pleroma/web/controller_helper.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index ab6e6c61a..88f2cc6f1 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -75,7 +75,7 @@ defp build_pagination_fields(conn, min_id, max_id, extra_params) do # instead of the `q.id > ^min_id` and `q.id < ^max_id`. # This is because we only have ids present inside of the page, while # `min_id`, `since_id` and `max_id` requires to know one outside of it. - if Map.take(conn.params, @id_keys) != %{} do + if Map.take(conn.params, @id_keys) != [] do Map.put(fields, "id", current_url(conn, conn.params)) else fields From 9e411372d0b7ae286941063956305c0a2eae46a6 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 12:10:09 +0200 Subject: [PATCH 325/492] ActivityPub: Don't show announces of your own objects in timeline. --- lib/pleroma/web/activity_pub/activity_pub.ex | 40 ++++++++++--------- .../controllers/timeline_controller.ex | 1 + test/web/activity_pub/activity_pub_test.exs | 24 +++++++++++ 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index eb73c95fe..4182275bc 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -31,25 +31,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", []) @@ -702,6 +683,26 @@ defp user_activities_recipients(%{reading_user: reading_user}) do end end + 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 @@ -1113,6 +1114,7 @@ def fetch_activities_query(recipients, opts \\ %{}) 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_invisible_actors(opts) diff --git a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex index 9270ca267..4bdd46d7e 100644 --- a/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex @@ -48,6 +48,7 @@ def home(%{assigns: %{user: user}} = conn, params) do |> 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 = diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 2f65dfc8e..e17cc4ab1 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -1643,6 +1643,30 @@ test "home timeline with reply_visibility `self`", %{ 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"], + 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 From 600e2ea07396489325e06dee3e8432288e0e13c2 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 12:15:56 +0200 Subject: [PATCH 326/492] ActivityPubTest: Make test easier to understand. --- test/web/activity_pub/activity_pub_test.exs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index e17cc4ab1..6cd3b8d1b 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -1656,6 +1656,16 @@ test "filtering out announces where the user is the actor of the announced messa {: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 From 570123ae21382c7e78b99442e3c025b0e66b8f6d Mon Sep 17 00:00:00 2001 From: Thibaut Girka Date: Sun, 7 Jun 2020 18:21:11 +0200 Subject: [PATCH 327/492] Add test --- test/web/activity_pub/activity_pub_test.exs | 35 ++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 6cd3b8d1b..72d3f3dfa 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -574,7 +574,7 @@ test "doesn't return transitive interactions concerning blocked users" 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) @@ -596,6 +596,39 @@ test "doesn't return announce activities concerning blocked users" do 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) + refute Enum.member?(activities, activity_two.id) + refute Enum.member?(activities, activity_three.id) + end + test "doesn't return activities from blocked domains" do domain = "dogwhistle.zone" domain_user = insert(:user, %{ap_id: "https://#{domain}/@pundit"}) From 5d87405b51efe9f99fea669090a5914db22ca9ed Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 16:55:30 +0200 Subject: [PATCH 328/492] ActivityPubTest: Update test for atomized parameters. --- test/web/activity_pub/activity_pub_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 72d3f3dfa..b239b812f 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -621,7 +621,7 @@ test "doesn't return announce activities with blocked users in 'cc'" do assert {:ok, activity_three} = ActivityPub.insert(data) 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) From 99afc7f4e423997079aaee1287b9ffb28a851d8b Mon Sep 17 00:00:00 2001 From: rinpatch Date: Wed, 10 Jun 2020 20:09:16 +0300 Subject: [PATCH 329/492] HTTP security plug: add media proxy base url host to csp --- lib/pleroma/plugs/http_security_plug.ex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 6a339b32c..620408d0f 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -113,6 +113,10 @@ defp get_proxy_and_attachment_sources do add_source(acc, host) end) + media_proxy_base_url = + if Config.get([Pleroma.Upload, :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 @@ -122,6 +126,7 @@ defp get_proxy_and_attachment_sources do 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) From 7c47f791a803aa5cee2f2f6931b8445d2c0551e5 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Wed, 10 Jun 2020 13:02:08 -0500 Subject: [PATCH 330/492] Add command to reload emoji packs from cli for OTP users Not useful for source releases as we don't have a way to automate connecting to the running instance. --- docs/administration/CLI_tasks/emoji.md | 8 ++++++++ lib/mix/tasks/pleroma/emoji.ex | 6 ++++++ 2 files changed, 14 insertions(+) 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/lib/mix/tasks/pleroma/emoji.ex b/lib/mix/tasks/pleroma/emoji.ex index 29a5fa99c..f4eaeac98 100644 --- a/lib/mix/tasks/pleroma/emoji.ex +++ b/lib/mix/tasks/pleroma/emoji.ex @@ -237,6 +237,12 @@ def run(["gen-pack" | args]) do end 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) From 5e44e9d69871f2e5805a8dddcfce43ae713eb52d Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 10 Jun 2020 18:56:46 +0000 Subject: [PATCH 331/492] Apply suggestion to lib/pleroma/web/controller_helper.ex --- lib/pleroma/web/controller_helper.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index 88f2cc6f1..a5eb3e9e0 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -76,7 +76,7 @@ defp build_pagination_fields(conn, min_id, max_id, extra_params) do # This is because we only have ids present inside of the page, while # `min_id`, `since_id` and `max_id` requires to know one outside of it. if Map.take(conn.params, @id_keys) != [] do - Map.put(fields, "id", current_url(conn, conn.params)) + Map.put(fields, "id", current_url(conn)) else fields end From b28cec4271c52d55f6e6cf8a1bcdb41efec3ef03 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Thu, 11 Jun 2020 16:05:14 +0300 Subject: [PATCH 332/492] [#1794] Fixes URI query handling for hashtags extraction in search. --- .../mastodon_api/controllers/search_controller.ex | 14 ++++++++++++++ .../controllers/search_controller_test.exs | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 8840fc19c..46bcf4228 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -124,6 +124,7 @@ defp resource_search(:v1, "hashtags", query, _options) do defp prepare_tags(query, add_joined_tag \\ true) do tags = query + |> preprocess_uri_query() |> String.split(~r/[^#\w]+/u, trim: true) |> Enum.uniq_by(&String.downcase/1) @@ -147,6 +148,19 @@ defp prepare_tags(query, add_joined_tag \\ true) do end 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 + |> 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) diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 84d46895e..0e025adca 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -111,6 +111,15 @@ test "constructs hashtags from search query", %{conn: conn} do %{"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"} + ] end test "excludes a blocked users from search results", %{conn: conn} do From 1f35acce54ea6924a54b4fc387be3346a6f5551e Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 11 Jun 2020 17:57:31 +0400 Subject: [PATCH 333/492] Merge OGP parser with TwitterCard --- CHANGELOG.md | 1 + config/config.exs | 1 - config/description.exs | 2 - lib/pleroma/web/rich_media/parser.ex | 4 +- .../rich_media/parsers/meta_tags_parser.ex | 23 ++-- .../web/rich_media/parsers/oembed_parser.ex | 4 +- lib/pleroma/web/rich_media/parsers/ogp.ex | 3 +- .../web/rich_media/parsers/twitter_card.ex | 15 +- .../rich_media/parsers/twitter_card_test.exs | 130 ++++++++++-------- 9 files changed, 90 insertions(+), 93 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cf2210f5..575eb67b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [unreleased] ### Changed +- OGP rich media parser merged with TwitterCard
API Changes - **Breaking:** Emoji API: changed methods and renamed routes. diff --git a/config/config.exs b/config/config.exs index 9508ae077..cafa40820 100644 --- a/config/config.exs +++ b/config/config.exs @@ -385,7 +385,6 @@ 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] diff --git a/config/description.exs b/config/description.exs index 807c945e0..b993959d7 100644 --- a/config/description.exs +++ b/config/description.exs @@ -2091,9 +2091,7 @@ 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 ] }, diff --git a/lib/pleroma/web/rich_media/parser.ex b/lib/pleroma/web/rich_media/parser.ex index 40980def8..78e9048f3 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -105,8 +105,8 @@ defp parse_html(html), do: Floki.parse_document!(html) 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 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..c09b96eae 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) + 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) - - if Enum.empty?(meta_data) do - {:error, error_message} - else - {:ok, meta_data} - end + Map.merge(acc, attributes) + end) + |> maybe_put_title(html) end defp get_elements(html, key_name, prefix) do diff --git a/lib/pleroma/web/rich_media/parsers/oembed_parser.ex b/lib/pleroma/web/rich_media/parsers/oembed_parser.ex index 8f32bf91b..5d87a90e9 100644 --- a/lib/pleroma/web/rich_media/parsers/oembed_parser.ex +++ b/lib/pleroma/web/rich_media/parsers/oembed_parser.ex @@ -7,9 +7,9 @@ def parse(html, _data) do with elements = [_ | _] <- get_discovery_data(html), {:ok, 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 diff --git a/lib/pleroma/web/rich_media/parsers/ogp.ex b/lib/pleroma/web/rich_media/parsers/ogp.ex index 3e9012588..5eebe42f7 100644 --- a/lib/pleroma/web/rich_media/parsers/ogp.ex +++ b/lib/pleroma/web/rich_media/parsers/ogp.ex @@ -5,10 +5,9 @@ defmodule Pleroma.Web.RichMedia.Parsers.OGP do def parse(html, data) do Pleroma.Web.RichMedia.Parsers.MetaTagsParser.parse( - html, data, + html, "og", - "No OGP metadata found", "property" ) 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/test/web/rich_media/parsers/twitter_card_test.exs b/test/web/rich_media/parsers/twitter_card_test.exs index 87c767c15..3ccf26651 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 @@ test "parses twitter card with only name attributes" 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 @@ test "parses twitter card with only property attributes" 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 @@ test "parses twitter card with name & property attributes" 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 @@ test "respect only first title tag on the page" 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 @@ test "takes first founded title in html head if there is html markup error" 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 From 7f7a1a467677471e0e1ec688e4eca9ba759d976a Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 11 Jun 2020 11:05:22 -0500 Subject: [PATCH 334/492] Check for media proxy base_url, not Upload base_url --- lib/pleroma/plugs/http_security_plug.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/plugs/http_security_plug.ex b/lib/pleroma/plugs/http_security_plug.ex index 620408d0f..1420a9611 100644 --- a/lib/pleroma/plugs/http_security_plug.ex +++ b/lib/pleroma/plugs/http_security_plug.ex @@ -114,7 +114,7 @@ defp get_proxy_and_attachment_sources do end) media_proxy_base_url = - if Config.get([Pleroma.Upload, :base_url]), + if Config.get([:media_proxy, :base_url]), do: URI.parse(Config.get([:media_proxy, :base_url])).host upload_base_url = From 2419776e192316cefbdbe607306c9b92ec558319 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Thu, 11 Jun 2020 23:11:46 +0400 Subject: [PATCH 335/492] Deprecate Pleroma.Web.RichMedia.Parsers.OGP --- lib/pleroma/web/rich_media/parsers/ogp.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pleroma/web/rich_media/parsers/ogp.ex b/lib/pleroma/web/rich_media/parsers/ogp.ex index 5eebe42f7..363815f81 100644 --- a/lib/pleroma/web/rich_media/parsers/ogp.ex +++ b/lib/pleroma/web/rich_media/parsers/ogp.ex @@ -3,6 +3,7 @@ # SPDX-License-Identifier: AGPL-3.0-only defmodule Pleroma.Web.RichMedia.Parsers.OGP do + @deprecated "OGP parser is deprecated. Use TwitterCard instead." def parse(html, data) do Pleroma.Web.RichMedia.Parsers.MetaTagsParser.parse( data, From 40970f6bb94760d19cc1d3201405df5bb32f5083 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 11 Jun 2020 22:54:39 +0200 Subject: [PATCH 336/492] New mix task: pleroma.user reset_mfa --- docs/administration/CLI_tasks/user.md | 10 +++++++++ lib/mix/tasks/pleroma/user.ex | 12 +++++++++++ test/tasks/user_test.exs | 30 +++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/docs/administration/CLI_tasks/user.md b/docs/administration/CLI_tasks/user.md index afeb8d52f..1e6f4a8b4 100644 --- a/docs/administration/CLI_tasks/user.md +++ b/docs/administration/CLI_tasks/user.md @@ -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 ...] diff --git a/lib/mix/tasks/pleroma/user.ex b/lib/mix/tasks/pleroma/user.ex index 3635c02bc..bca7e87bf 100644 --- a/lib/mix/tasks/pleroma/user.ex +++ b/lib/mix/tasks/pleroma/user.ex @@ -144,6 +144,18 @@ def run(["reset_password", nickname]) do end end + 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() diff --git a/test/tasks/user_test.exs b/test/tasks/user_test.exs index b55aa1cdb..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 @@ -278,6 +279,35 @@ test "no user to reset password" 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 -> From 122328b93a708e396b5c0cd1930a4b759e7b7db6 Mon Sep 17 00:00:00 2001 From: normandy Date: Fri, 12 Jun 2020 01:41:09 +0000 Subject: [PATCH 337/492] Update pleroma.nginx to support TLSv1.3 Based on SSL config from https://ssl-config.mozilla.org/ --- installation/pleroma.nginx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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; From 21880970660906d8072dc501e6a8b25fb4a4b0c7 Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov Date: Fri, 12 Jun 2020 14:25:41 +0300 Subject: [PATCH 338/492] [#1794] Fixes URI query handling for hashtags extraction in search. --- .../controllers/search_controller.ex | 1 + .../controllers/search_controller_test.exs | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 46bcf4228..3be0ca095 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -152,6 +152,7 @@ defp prepare_tags(query, add_joined_tag \\ true) do defp preprocess_uri_query(query) do if query =~ ~r/https?:\/\// do query + |> String.trim_trailing("/") |> URI.parse() |> Map.get(:path) |> String.split("/") diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index 0e025adca..c605957b1 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -120,6 +120,35 @@ test "constructs hashtags from search query", %{conn: conn} do 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 "excludes a blocked users from search results", %{conn: conn} do From f9dcf15ecb684b4b802d731a216448c76913d462 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Fri, 12 Jun 2020 14:49:54 +0300 Subject: [PATCH 339/492] added admin api for MediaProxy cache invalidation --- .../media_proxy_cache_controller.ex | 38 ++++++ .../admin_api/views/media_proxy_cache_view.ex | 11 ++ .../admin/media_proxy_cache_operation.ex | 109 ++++++++++++++++++ lib/pleroma/web/router.ex | 4 + .../media_proxy_cache_controller_test.exs | 66 +++++++++++ 5 files changed, 228 insertions(+) create mode 100644 lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex create mode 100644 lib/pleroma/web/admin_api/views/media_proxy_cache_view.ex create mode 100644 lib/pleroma/web/api_spec/operations/admin/media_proxy_cache_operation.ex create mode 100644 test/web/admin_api/controllers/media_proxy_cache_controller_test.exs 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..7b28f7c72 --- /dev/null +++ b/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex @@ -0,0 +1,38 @@ +# 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 + + 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, _) do + render(conn, "index.json", urls: []) + end + + def delete(%{assigns: %{user: _}, body_params: %{urls: urls}} = conn, _) do + render(conn, "index.json", urls: urls) + end + + def purge(%{assigns: %{user: _}, body_params: %{urls: urls, ban: _ban}} = conn, _) do + render(conn, "index.json", urls: urls) + 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/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/router.ex b/lib/pleroma/web/router.ex index 57570b672..eda74a171 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -209,6 +209,10 @@ defmodule Pleroma.Web.Router do 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 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..1b1d6bc36 --- /dev/null +++ b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -0,0 +1,66 @@ +# 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 + + 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/media_proxy_caches" do + test "shows banned MediaProxy URLs", %{conn: conn} do + response = + conn + |> get("/api/pleroma/admin/media_proxy_caches") + |> json_response_and_validate_schema(200) + + assert response["urls"] == [] + end + end + + describe "DELETE /api/pleroma/admin/media_proxy_caches/delete" do + test "deleted MediaProxy URLs from banned", %{conn: conn} do + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/media_proxy_caches/delete", %{ + urls: ["http://example.com/media/a688346.jpg", "http://example.com/media/fb1f4d.jpg"] + }) + |> json_response_and_validate_schema(200) + + assert response["urls"] == [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] + end + end + + describe "PURGE /api/pleroma/admin/media_proxy_caches/purge" do + test "perform invalidates cache of MediaProxy", %{conn: conn} do + response = + conn + |> put_req_header("content-type", "application/json") + |> post("/api/pleroma/admin/media_proxy_caches/purge", %{ + urls: ["http://example.com/media/a688346.jpg", "http://example.com/media/fb1f4d.jpg"] + }) + |> json_response_and_validate_schema(200) + + assert response["urls"] == [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] + end + end +end From c2048f75cd09696e30b443423cae4ba6ef3e593b Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 12 Jun 2020 08:42:23 -0500 Subject: [PATCH 340/492] Add changelog entry for emoji pack reload command --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cf2210f5..b19cae8b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Mastodon API: Add support for filtering replies in public and home timelines - Admin API: endpoints for create/update/delete OAuth Apps. - Admin API: endpoint for status view. +- OTP: Add command to reload emoji packs
### Fixed From e505e59d9c43db286ccf7fe70da2fa974ae3d700 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Fri, 12 Jun 2020 08:51:11 -0500 Subject: [PATCH 341/492] Document new mix task feature to reset mfa --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cf2210f5..c23beec9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - 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 From 4655407451c8dd05b6024f607e598359047efce2 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 12 Jun 2020 14:03:33 +0000 Subject: [PATCH 342/492] Apply suggestion to config/description.exs --- config/description.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/description.exs b/config/description.exs index 086a28ace..add1601e2 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1476,7 +1476,7 @@ key: :mrf_activity_expiration, label: "MRF Activity Expiration Policy", type: :group, - description: "Adds expiration to all local Create activities", + description: "Adds expiration to all local Create Note activities", children: [ %{ key: :days, From 09d31d24de568aac06fe203beeb8bb2a9de8f602 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 12 Jun 2020 18:37:32 +0400 Subject: [PATCH 343/492] Return an empty map from Pleroma.Web.RichMedia.Parsers.OGP.parse/2 --- lib/pleroma/web/rich_media/parsers/ogp.ex | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/pleroma/web/rich_media/parsers/ogp.ex b/lib/pleroma/web/rich_media/parsers/ogp.ex index 363815f81..b3b3b059c 100644 --- a/lib/pleroma/web/rich_media/parsers/ogp.ex +++ b/lib/pleroma/web/rich_media/parsers/ogp.ex @@ -4,12 +4,7 @@ defmodule Pleroma.Web.RichMedia.Parsers.OGP do @deprecated "OGP parser is deprecated. Use TwitterCard instead." - def parse(html, data) do - Pleroma.Web.RichMedia.Parsers.MetaTagsParser.parse( - data, - html, - "og", - "property" - ) + def parse(_html, _data) do + %{} end end From 520367d6fd8a268e0bc8c145a46aca46a62e8b66 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Tue, 9 Jun 2020 21:49:24 +0400 Subject: [PATCH 344/492] Fix atom leak in Rich Media Parser --- .../web/mastodon_api/views/status_view.ex | 14 ++-- lib/pleroma/web/rich_media/helpers.ex | 6 +- lib/pleroma/web/rich_media/parser.ex | 12 +-- .../rich_media/parsers/meta_tags_parser.ex | 8 +- .../web/rich_media/parsers/oembed_parser.ex | 18 ++--- test/web/rich_media/parser_test.exs | 75 ++++++++++--------- .../rich_media/parsers/twitter_card_test.exs | 60 +++++++-------- 7 files changed, 91 insertions(+), 102 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 8e3715093..2c49bedb3 100644 --- a/lib/pleroma/web/mastodon_api/views/status_view.ex +++ b/lib/pleroma/web/mastodon_api/views/status_view.ex @@ -377,8 +377,8 @@ def render("card.json", %{rich_media: rich_media, page_url: page_url}) 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 +386,9 @@ def render("card.json", %{rich_media: rich_media, page_url: page_url}) 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 +397,8 @@ def render("card.json", %{rich_media: rich_media, page_url: page_url}) 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/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 @@ defp validate_page_url(page_url) when is_binary(page_url) 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..d9b5068b1 100644 --- a/lib/pleroma/web/rich_media/parser.ex +++ b/lib/pleroma/web/rich_media/parser.ex @@ -91,7 +91,7 @@ defp parse_url(url) do html |> parse_html() |> maybe_parse() - |> Map.put(:url, url) + |> Map.put("url", url) |> clean_parsed_data() |> check_parsed_data() rescue @@ -111,8 +111,8 @@ defp maybe_parse(html) do 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 @@ defp check_parsed_data(data) 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..2762b5902 100644 --- a/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex +++ b/lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex @@ -29,19 +29,19 @@ defp normalize_attributes(html_node, prefix, key_name, value_name) 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..db8ccf15d 100644 --- a/lib/pleroma/web/rich_media/parsers/oembed_parser.ex +++ b/lib/pleroma/web/rich_media/parsers/oembed_parser.ex @@ -5,7 +5,7 @@ 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} else @@ -17,19 +17,13 @@ defp get_discovery_data(html) 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/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 @@ test "returns error when no metadata present" 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 @@ test "falls back to when ogp:title is missing" 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 @@ test "parses twitter card" 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 @@ test "parses OEmbed" 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" => "<a data-flickr-embed=\"true\" href=\"https://www.flickr.com/photos/bees/2362225867/\" title=\"Bacon Lollys by ‮‭‬bees‬, on Flickr\"><img src=\"https://farm4.staticflickr.com/3040/2362225867_4a87ab8baf_b.jpg\" width=\"1024\" height=\"768\" alt=\"Bacon Lollys\"></a><script async src=\"https://embedr.flickr.com/assets/client-code.js\" charset=\"utf-8\"></script>", - 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..847623535 100644 --- a/test/web/rich_media/parsers/twitter_card_test.exs +++ b/test/web/rich_media/parsers/twitter_card_test.exs @@ -19,11 +19,11 @@ test "parses twitter card with only name attributes" do 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: + "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" }} end @@ -36,15 +36,15 @@ test "parses twitter card with only property attributes" do assert TwitterCard.parse(html, %{}) == {:ok, %{ - card: "summary_large_image", - description: + "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: + "image" => "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", - "image:alt": "", - title: + "image:alt" => "", + "title" => "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", - url: + "url" => "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" }} end @@ -57,19 +57,19 @@ test "parses twitter card with name & property attributes" do 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: + "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: + "image" => "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", - "image:alt": "", - site: nil, - title: + "image:alt" => "", + "site" => nil, + "title" => "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", - url: + "url" => "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" }} end @@ -86,11 +86,11 @@ test "respect only first title tag on the page" do assert TwitterCard.parse(html, %{}) == {:ok, %{ - site: "@atlasobscura", - title: + "site" => "@atlasobscura", + "title" => "The Missing Grave of Margaret Corbin, Revolutionary War Veteran - Atlas Obscura", - card: "summary_large_image", - image: image_path + "card" => "summary_large_image", + "image" => image_path }} end @@ -102,12 +102,12 @@ test "takes first founded title in html head if there is html markup error" do assert TwitterCard.parse(html, %{}) == {:ok, %{ - site: nil, - title: + "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" + "app:id:googleplay" => "com.nytimes.android", + "app:name:googleplay" => "NYTimes", + "app:url:googleplay" => "nytimes://reader/id/100000006583622" }} end end From cb7be6eef252216d7ba5d5f72c8005d66b04986c Mon Sep 17 00:00:00 2001 From: href <href@random.sh> Date: Wed, 10 Jun 2020 17:34:23 +0200 Subject: [PATCH 345/492] Remove use of atoms in MRF.UserAllowListPolicy --- config/description.exs | 6 ++--- docs/configuration/cheatsheet.md | 5 ++-- lib/pleroma/config/deprecation_warnings.ex | 25 ++++++++++++++++++- .../mrf/user_allow_list_policy.ex | 2 +- .../mrf/user_allowlist_policy_test.exs | 6 ++--- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/config/description.exs b/config/description.exs index add1601e2..2f1eaf5f2 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1623,14 +1623,12 @@ # %{ # 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"]} # ] # ] # }, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 456762151..fad67fc4d 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -138,8 +138,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 diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex index c39a8984b..b68ded01f 100644 --- a/lib/pleroma/config/deprecation_warnings.ex +++ b/lib/pleroma/config/deprecation_warnings.ex @@ -4,9 +4,10 @@ defmodule Pleroma.Config.DeprecationWarnings do require Logger + alias Pleroma.Config 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 +15,29 @@ def check_hellthread_threshold 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() 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 @@ def filter(%{"actor" => actor} = object) do allow_list = Config.get( - [:mrf_user_allowlist, String.to_atom(actor_info.host)], + [:mrf_user_allowlist, actor_info.host], [] ) 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 @@ test "pass filter if allow list is empty" 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 From 4b865bba107b0db1de886cefd14227454cbece1e Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Sat, 13 Jun 2020 10:37:15 +0000 Subject: [PATCH 346/492] Apply suggestion to lib/pleroma/web/controller_helper.ex --- lib/pleroma/web/controller_helper.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index a5eb3e9e0..d5e9c33f5 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -75,7 +75,7 @@ defp build_pagination_fields(conn, min_id, max_id, extra_params) do # instead of the `q.id > ^min_id` and `q.id < ^max_id`. # This is because we only have ids present inside of the page, while # `min_id`, `since_id` and `max_id` requires to know one outside of it. - if Map.take(conn.params, @id_keys) != [] do + if Map.take(conn.params, @id_keys) != %{} do Map.put(fields, "id", current_url(conn)) else fields From 1d625c29a09cf7c0fb415d5606a91315902efaad Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Sat, 13 Jun 2020 13:12:43 +0200 Subject: [PATCH 347/492] ControllerHelper: Always return id field. --- lib/pleroma/web/controller_helper.ex | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/lib/pleroma/web/controller_helper.ex b/lib/pleroma/web/controller_helper.ex index d5e9c33f5..69946fb81 100644 --- a/lib/pleroma/web/controller_helper.ex +++ b/lib/pleroma/web/controller_helper.ex @@ -65,21 +65,11 @@ defp build_pagination_fields(conn, min_id, max_id, extra_params) do |> Map.merge(extra_params) |> Map.drop(@id_keys) - fields = %{ + %{ "next" => current_url(conn, Map.put(params, :max_id, max_id)), - "prev" => current_url(conn, Map.put(params, :min_id, min_id)) + "prev" => current_url(conn, Map.put(params, :min_id, min_id)), + "id" => current_url(conn) } - - # Generating an `id` without already present pagination keys would - # need a query-restriction with an `q.id >= ^id` or `q.id <= ^id` - # instead of the `q.id > ^min_id` and `q.id < ^max_id`. - # This is because we only have ids present inside of the page, while - # `min_id`, `since_id` and `max_id` requires to know one outside of it. - if Map.take(conn.params, @id_keys) != %{} do - Map.put(fields, "id", current_url(conn)) - else - fields - end end def get_pagination_fields(conn, activities, extra_params \\ %{}) do From b15cfc3d365dcfa5f99159fe06e29de6f8aceb4f Mon Sep 17 00:00:00 2001 From: eugenijm <eugenijm@protonmail.com> Date: Mon, 18 May 2020 18:46:04 +0300 Subject: [PATCH 348/492] Mastodon API: ensure the notification endpoint doesn't return less than the requested amount of records unless it's the last page --- CHANGELOG.md | 1 + lib/pleroma/notification.ex | 19 +++++- lib/pleroma/user.ex | 8 +++ .../mastodon_api/views/notification_view.ex | 68 +++++++++---------- ...ete_notifications_from_invisible_users.exs | 18 +++++ test/notification_test.exs | 8 +++ .../notification_controller_test.exs | 27 ++++++++ .../views/notification_view_test.exs | 4 +- 8 files changed, 112 insertions(+), 41 deletions(-) create mode 100644 priv/repo/migrations/20200527163635_delete_notifications_from_invisible_users.exs diff --git a/CHANGELOG.md b/CHANGELOG.md index 9361fa260..b3f2dd10f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - 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)] diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 3386a1933..9ee9606be 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -166,8 +166,16 @@ defp exclude_visibility(query, %{exclude_visibilities: visibility}) 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 @@ -541,6 +549,7 @@ def exclude_thread_muter_ap_ids(ap_ids, %Activity{} = activity) do def skip?(%Activity{} = activity, %User{} = user) do [ :self, + :invisible, :followers, :follows, :non_followers, @@ -557,6 +566,12 @@ def skip?(:self, %Activity{} = activity, %User{} = user) 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, diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index c5c74d132..52ac9052b 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1488,6 +1488,7 @@ def perform(:delete, %User{} = user) do end) delete_user_activities(user) + delete_notifications_from_user_activities(user) delete_outgoing_pending_follow_requests(user) @@ -1576,6 +1577,13 @@ def follow_import(%User{} = follower, followed_identifiers) }) 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() diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index b11578623..3865be280 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -46,6 +46,7 @@ def render("index.json", %{notifications: notifications, for: reading_user} = op activities |> Enum.filter(&(&1.data["type"] == "Move")) |> Enum.map(&User.get_cached_by_ap_id(&1.data["target"])) + |> Enum.filter(& &1) actors = activities @@ -84,50 +85,45 @@ def render( # 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: notification.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_seen: notification.seen } + } - case notification.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) - "pleroma:chat_mention" -> - put_chat_message(response, activity, reading_user, status_render_opts) + "pleroma:chat_mention" -> + put_chat_message(response, activity, reading_user, status_render_opts) - type when type in ["follow", "follow_request"] -> - response - - _ -> - nil - end - else - _ -> nil + type when type in ["follow", "follow_request"] -> + response 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/test/notification_test.exs b/test/notification_test.exs index b9bbdceca..526f43fab 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -306,6 +306,14 @@ test "it doesn't create subscription notifications if the recipient cannot see t 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 diff --git a/test/web/mastodon_api/controllers/notification_controller_test.exs b/test/web/mastodon_api/controllers/notification_controller_test.exs index 698c99711..70ef0e8b5 100644 --- a/test/web/mastodon_api/controllers/notification_controller_test.exs +++ b/test/web/mastodon_api/controllers/notification_controller_test.exs @@ -313,6 +313,33 @@ test "filters notifications for Announce activities" 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 diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index b2fa5b302..9c399b2df 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -139,9 +139,7 @@ test "Follow notification" 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 From 2e8a236cef28c0b754aecb04a5c60c3b7655c5a6 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Sun, 14 Jun 2020 21:02:57 +0300 Subject: [PATCH 349/492] fix invalidates media url's --- config/config.exs | 7 + config/description.exs | 64 +++++++++ docs/configuration/cheatsheet.md | 6 +- installation/nginx-cache-purge.sh.example | 4 +- lib/pleroma/application.ex | 3 +- lib/pleroma/plugs/uploaded_media.ex | 16 ++- lib/pleroma/web/media_proxy/invalidation.ex | 29 ++-- .../web/media_proxy/invalidations/http.ex | 8 +- .../web/media_proxy/invalidations/script.ex | 36 ++--- lib/pleroma/web/media_proxy/media_proxy.ex | 35 ++++- .../web/media_proxy/media_proxy_controller.ex | 3 +- .../workers/attachments_cleanup_worker.ex | 133 ++++++++++-------- test/web/media_proxy/invalidation_test.exs | 65 +++++++++ .../media_proxy/invalidations/http_test.exs | 13 +- .../media_proxy/invalidations/script_test.exs | 21 ++- .../media_proxy_controller_test.exs | 17 +++ 16 files changed, 346 insertions(+), 114 deletions(-) create mode 100644 test/web/media_proxy/invalidation_test.exs diff --git a/config/config.exs b/config/config.exs index 9508ae077..e299fb8dd 100644 --- a/config/config.exs +++ b/config/config.exs @@ -406,6 +406,13 @@ ], whitelist: [] +config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Http, + method: :purge, + headers: [], + options: [] + +config :pleroma, Pleroma.Web.MediaProxy.Invalidation.Script, script_path: nil + config :pleroma, :chat, enabled: true config :phoenix, :format_encoders, json: Jason diff --git a/config/description.exs b/config/description.exs index 807c945e0..857293794 100644 --- a/config/description.exs +++ b/config/description.exs @@ -1637,6 +1637,31 @@ "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, type: :keyword, @@ -1709,6 +1734,45 @@ } ] }, + %{ + 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, diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 505acb293..20bd0ed85 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -262,7 +262,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. @@ -278,8 +278,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 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/lib/pleroma/application.ex b/lib/pleroma/application.ex index 9d3d92b38..adebebc7a 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -148,7 +148,8 @@ defp cachex_children 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("deleted_urls", default_ttl: :timer.hours(24 * 30), limit: 5_000) ] end diff --git a/lib/pleroma/plugs/uploaded_media.ex b/lib/pleroma/plugs/uploaded_media.ex index 94147e0c4..2f3fde002 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 @@ def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) 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 @@ def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) 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_deleted(conn, get_method) do get_media(conn, get_method, proxy_remote, opts) else _ -> @@ -59,6 +61,14 @@ def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) do def call(conn, _opts), do: conn + defp media_is_deleted(%{request_path: path} = _conn, {:static_dir, _}) do + MediaProxy.in_deleted_urls(Pleroma.Web.base_url() <> path) + end + + defp media_is_deleted(_, {:url, url}), do: MediaProxy.in_deleted_urls(url) + + defp media_is_deleted(_, _), do: false + defp get_media(conn, {:static_dir, directory}, _, opts) do static_opts = Map.get(opts, :static_plug_opts) diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex index c037ff13e..83ff8589c 100644 --- a/lib/pleroma/web/media_proxy/invalidation.ex +++ b/lib/pleroma/web/media_proxy/invalidation.ex @@ -5,22 +5,33 @@ 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) + provider.purge(urls, Config.get(provider)) 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..3694b56e8 100644 --- a/lib/pleroma/web/media_proxy/invalidations/http.ex +++ b/lib/pleroma/web/media_proxy/invalidations/http.ex @@ -10,9 +10,9 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Http do @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, []) + 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 @@ def purge(urls, opts) 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..d41d647bb 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, nil) + |> 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 b2b524524..59ca217ab 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_deleted_urls(String.t()) :: boolean() + def in_deleted_urls(url), do: elem(Cachex.exists?(:deleted_urls_cache, url(url)), 1) + + def remove_from_deleted_urls(urls) when is_list(urls) do + Cachex.execute!(:deleted_urls_cache, fn cache -> + Enum.each(Invalidation.prepare_urls(urls), &Cachex.del(cache, &1)) + end) + end + + def remove_from_deleted_urls(url) when is_binary(url) do + Cachex.del(:deleted_urls_cache, url(url)) + end + + def put_in_deleted_urls(urls) when is_list(urls) do + Cachex.execute!(:deleted_urls_cache, fn cache -> + Enum.each(Invalidation.prepare_urls(urls), &Cachex.put(cache, &1, true)) + end) + end + + def put_in_deleted_urls(url) when is_binary(url) do + Cachex.put(:deleted_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 disabled?() or local?(url) or whitelisted?(url) do + if disabled?() or not is_url_proxiable?(url) do url else encode_url(url) end end + @spec is_url_proxiable?(String.t()) :: boolean() + def is_url_proxiable?(url) do + if local?(url) or whitelisted?(url) do + false + else + true + end + end + defp disabled?, do: !Config.get([:media_proxy, :enabled], false) defp local?(url), do: String.starts_with?(url, Pleroma.Web.base_url()) diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index 4657a4383..ff0158d83 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -14,10 +14,11 @@ def remote(conn, %{"sig" => sig64, "url" => url64} = params) do with config <- Pleroma.Config.get([:media_proxy], []), true <- Keyword.get(config, :enabled, false), {:ok, url} <- MediaProxy.decode_url(sig64, url64), + {_, false} <- {:in_deleted_urls, MediaProxy.in_deleted_urls(url)}, :ok <- filename_matches(params, conn.request_path, url) do ReverseProxy.call(conn, url, Keyword.get(config, :proxy_opts, @default_proxy_opts)) else - false -> + error when error in [false, {:in_deleted_urls, true}] -> send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) {:error, :invalid_signature} -> diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex index 49352db2a..4ad19c0fc 100644 --- a/lib/pleroma/workers/attachments_cleanup_worker.ex +++ b/lib/pleroma/workers/attachments_cleanup_worker.ex @@ -23,8 +23,25 @@ def perform( Enum.map(attachment["url"], & &1["href"]) end) - names = Enum.map(attachments, & &1["name"]) + # find all objects for copies of the attachments, name and actor doesn't matter here + hrefs + |> fetch_objects + |> prepare_objects(actor, Enum.map(attachments, & &1["name"])) + |> Enum.reduce({[], []}, fn {href, %{id: id, count: count}}, {ids, hrefs} -> + with 1 <- count do + {ids ++ [id], hrefs ++ [href]} + else + _ -> {ids ++ [id], hrefs} + end + end) + |> do_clean + {: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 +56,60 @@ def perform( "/" ) - # 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} + Enum.each(attachment_urls, fn href -> + href + |> String.trim_leading("#{base_url}/#{prefix}") + |> uploader.delete_file() + end) - 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) - - object_ids = Enum.map(object_ids_and_hrefs, fn {id, _} -> id end) - - from(o in Object, where: o.id in ^object_ids) - |> Repo.delete_all() - - object_ids_and_hrefs - |> Enum.filter(fn {_, href} -> not is_nil(href) end) - |> Enum.map(&elem(&1, 1)) - |> Pleroma.Web.MediaProxy.Invalidation.purge() - - {:ok, :success} + delete_objects(object_ids) end - def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: {:ok, :skip} + defp delete_objects([_ | _] = object_ids) do + Repo.delete_all(from(o in Object, where: o.id in ^object_ids)) + end + + defp delete_objects(_), do: :ok + + # we should delete 1 object for any given attachment, but don't delete + # files if there are more than 1 object for it + def 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 + + def 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/test/web/media_proxy/invalidation_test.exs b/test/web/media_proxy/invalidation_test.exs new file mode 100644 index 000000000..3a9fa8c88 --- /dev/null +++ b/test/web/media_proxy/invalidation_test.exs @@ -0,0 +1,65 @@ +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(:deleted_urls_cache) end) + :ok + 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_deleted_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_deleted_urls(image_url) + assert Invalidation.purge([image_url]) == {:ok, [image_url]} + assert Pleroma.Web.MediaProxy.in_deleted_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_deleted_urls(image_url) + + with_mocks [{System, [], [cmd: fn _, _ -> {"ok", 0} end]}] do + assert capture_log(fn -> + assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url) + assert Invalidation.purge([image_url]) == {:ok, [image_url]} + assert Pleroma.Web.MediaProxy.in_deleted_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..09e7ca0fb 100644 --- a/test/web/media_proxy/invalidations/http_test.exs +++ b/test/web/media_proxy/invalidations/http_test.exs @@ -5,6 +5,11 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do import ExUnit.CaptureLog import Tesla.Mock + setup do + on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) + :ok + 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 +19,8 @@ test "logs hasn't error message when request is valid" 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 +33,8 @@ test "it write error message in logs when request invalid" 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..c69cec07a 100644 --- a/test/web/media_proxy/invalidations/script_test.exs +++ b/test/web/media_proxy/invalidations/script_test.exs @@ -4,17 +4,24 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.ScriptTest do import ExUnit.CaptureLog + setup do + on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) + :ok + 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..2b6b25221 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -10,6 +10,11 @@ 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(:deleted_urls_cache) end) + :ok + end + test "it returns 404 when MediaProxy disabled", %{conn: conn} do Config.put([:media_proxy, :enabled], false) @@ -66,4 +71,16 @@ test "it performs ReverseProxy.call when signature valid", %{conn: conn} do assert %Plug.Conn{status: :success} = get(conn, url) end end + + test "it returns 404 when url contains in deleted_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_deleted_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 From b7df7436c813bfcb4f27ac64c85ebc1507153601 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 15 Jun 2020 12:27:13 +0200 Subject: [PATCH 350/492] Conversations: Return last dm for conversation, not last message. --- lib/pleroma/conversation/participation.ex | 11 +++++++---- lib/pleroma/web/activity_pub/activity_pub.ex | 7 ++++--- .../web/mastodon_api/views/conversation_view.ex | 11 +++++++---- .../web/mastodon_api/views/conversation_view_test.exs | 11 ++++++++++- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/pleroma/conversation/participation.ex b/lib/pleroma/conversation/participation.ex index ce7bd2396..8bc3e85d6 100644 --- a/lib/pleroma/conversation/participation.ex +++ b/lib/pleroma/conversation/participation.ex @@ -162,10 +162,13 @@ def for_user_with_last_activity_id(user, params \\ %{}) 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/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index c9dc6135c..3e4f3ad30 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -210,7 +210,7 @@ def stream_out_participations(%Object{data: %{"context" => context}}, user) do conversation = Repo.preload(conversation, :participations) last_activity_id = - fetch_latest_activity_id_for_context(conversation.ap_id, %{ + fetch_latest_direct_activity_id_for_context(conversation.ap_id, %{ user: user, blocking_user: user }) @@ -517,11 +517,12 @@ def fetch_activities_for_context(context, opts \\ %{}) 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)) + |> restrict_visibility(%{visibility: "direct"}) |> limit(1) |> select([a], a.id) |> Repo.one() diff --git a/lib/pleroma/web/mastodon_api/views/conversation_view.ex b/lib/pleroma/web/mastodon_api/views/conversation_view.ex index fbe618377..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 @@ def render("participation.json", %{participation: participation, for: user}) 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/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 @@ test "represents a Mastodon Conversation entity" 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) From 1092b3650068169ece0ac95cd88ec0e4da30036b Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 15 Jun 2020 12:30:11 +0200 Subject: [PATCH 351/492] Changelog: Add info about conversation view changes. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3f2dd10f..c546f1f04 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [unreleased] ### Changed +- In Conversations, return only direct messages as `last_status` - MFR policy to set global expiration for all local Create activities <details> <summary>API Changes</summary> From 62b8c31b7a84dadb2a46861fe0f2dd1dbf9d40f0 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Mon, 15 Jun 2020 14:55:00 +0300 Subject: [PATCH 352/492] added tests --- .../media_proxy_cache_controller.ex | 31 ++++- .../web/media_proxy/invalidations/script.ex | 2 +- .../media_proxy_cache_controller_test.exs | 116 +++++++++++++++--- 3 files changed, 127 insertions(+), 22 deletions(-) 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 index 7b28f7c72..e3fa0ac28 100644 --- a/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex @@ -7,6 +7,7 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheController do alias Pleroma.Plugs.OAuthScopesPlug alias Pleroma.Web.ApiSpec.Admin, as: Spec + alias Pleroma.Web.MediaProxy plug(Pleroma.Web.ApiSpec.CastAndValidate) @@ -24,15 +25,39 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheController do defdelegate open_api_operation(action), to: Spec.MediaProxyCacheOperation - def index(%{assigns: %{user: _}} = conn, _) do - render(conn, "index.json", urls: []) + def index(%{assigns: %{user: _}} = conn, params) do + cursor = + :deleted_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_deleted_urls(urls) render(conn, "index.json", urls: urls) end - def purge(%{assigns: %{user: _}, body_params: %{urls: urls, ban: _ban}} = conn, _) do + def purge(%{assigns: %{user: _}, body_params: %{urls: urls, ban: ban}} = conn, _) do + MediaProxy.Invalidation.purge(urls) + + if ban do + MediaProxy.put_in_deleted_urls(urls) + end + render(conn, "index.json", urls: urls) end end diff --git a/lib/pleroma/web/media_proxy/invalidations/script.ex b/lib/pleroma/web/media_proxy/invalidations/script.ex index d41d647bb..0217b119d 100644 --- a/lib/pleroma/web/media_proxy/invalidations/script.ex +++ b/lib/pleroma/web/media_proxy/invalidations/script.ex @@ -10,7 +10,7 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Script do require Logger @impl Pleroma.Web.MediaProxy.Invalidation - def purge(urls, opts) do + def purge(urls, opts \\ %{}) do args = urls |> List.wrap() 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 index 1b1d6bc36..76a96f46f 100644 --- a/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs +++ b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -6,6 +6,16 @@ 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(:deleted_urls_cache) end) + :ok + end setup do admin = insert(:user, is_admin: true) @@ -16,51 +26,121 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do |> 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_deleted_urls([ + "http://localhost:4001/media/a688346.jpg", + "http://localhost:4001/media/fb1f4d.jpg" + ]) + + MediaProxy.put_in_deleted_urls("http://localhost:4001/media/gb1f44.jpg") + MediaProxy.put_in_deleted_urls("http://localhost:4001/media/tb13f47.jpg") + MediaProxy.put_in_deleted_urls("http://localhost:4001/media/wb1f46.jpg") + response = conn - |> get("/api/pleroma/admin/media_proxy_caches") + |> get("/api/pleroma/admin/media_proxy_caches?page_size=2") |> json_response_and_validate_schema(200) - assert response["urls"] == [] + 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 "DELETE /api/pleroma/admin/media_proxy_caches/delete" do test "deleted MediaProxy URLs from banned", %{conn: conn} do + MediaProxy.put_in_deleted_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://example.com/media/a688346.jpg", "http://example.com/media/fb1f4d.jpg"] + urls: ["http://localhost:4001/media/a688346.jpg"] }) |> json_response_and_validate_schema(200) - assert response["urls"] == [ - "http://example.com/media/a688346.jpg", - "http://example.com/media/fb1f4d.jpg" - ] + assert response["urls"] == ["http://localhost:4001/media/a688346.jpg"] + refute MediaProxy.in_deleted_urls("http://localhost:4001/media/a688346.jpg") + assert MediaProxy.in_deleted_urls("http://localhost:4001/media/fb1f4d.jpg") end end describe "PURGE /api/pleroma/admin/media_proxy_caches/purge" do test "perform invalidates cache of MediaProxy", %{conn: conn} do - response = - conn - |> put_req_header("content-type", "application/json") - |> post("/api/pleroma/admin/media_proxy_caches/purge", %{ - urls: ["http://example.com/media/a688346.jpg", "http://example.com/media/fb1f4d.jpg"] - }) - |> json_response_and_validate_schema(200) + urls = [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] - assert response["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_deleted_urls("http://example.com/media/a688346.jpg") + refute MediaProxy.in_deleted_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_deleted_urls("http://example.com/media/a688346.jpg") + assert MediaProxy.in_deleted_urls("http://example.com/media/fb1f4d.jpg") + end end end end From bd63089a633099233d4fc19faece2796253a7ee0 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn <egor@kislitsyn.com> Date: Mon, 15 Jun 2020 16:20:05 +0400 Subject: [PATCH 353/492] Fix tests --- .../rich_media/parsers/twitter_card_test.exs | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/test/web/rich_media/parsers/twitter_card_test.exs b/test/web/rich_media/parsers/twitter_card_test.exs index 3ccf26651..219f005a2 100644 --- a/test/web/rich_media/parsers/twitter_card_test.exs +++ b/test/web/rich_media/parsers/twitter_card_test.exs @@ -17,18 +17,18 @@ test "parses twitter card with only name attributes" do assert TwitterCard.parse(html, %{}) == %{ - "app:id:googleplay": "com.nytimes.android", - "app:name:googleplay": "NYTimes", - "app:url:googleplay": "nytimes://reader/id/100000006583622", - site: nil, - description: + "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: + "image" => "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg", - type: "article", - url: + "type" => "article", + "url" => "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html", - title: + "title" => "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database." } end @@ -40,17 +40,17 @@ test "parses twitter card with only property attributes" do assert TwitterCard.parse(html, %{}) == %{ - card: "summary_large_image", - description: + "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: + "image" => "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", - "image:alt": "", - title: + "image:alt" => "", + "title" => "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", - url: + "url" => "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html", - type: "article" + "type" => "article" } end @@ -61,21 +61,21 @@ test "parses twitter card with name & property attributes" do assert TwitterCard.parse(html, %{}) == %{ - "app:id:googleplay": "com.nytimes.android", - "app:name:googleplay": "NYTimes", - "app:url:googleplay": "nytimes://reader/id/100000006583622", - card: "summary_large_image", - description: + "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: + "image" => "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-videoSixteenByNineJumbo1600.jpg", - "image:alt": "", - site: nil, - title: + "image:alt" => "", + "site" => nil, + "title" => "She Was Arrested at 14. Then Her Photo Went to a Facial Recognition Database.", - url: + "url" => "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html", - type: "article" + "type" => "article" } end @@ -90,15 +90,15 @@ test "respect only first title tag on the page" do assert TwitterCard.parse(html, %{}) == %{ - site: "@atlasobscura", - title: "The Missing Grave of Margaret Corbin, Revolutionary War Veteran", - card: "summary_large_image", - image: image_path, - description: + "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" + "site_name" => "Atlas Obscura", + "type" => "article", + "url" => "http://www.atlasobscura.com/articles/margaret-corbin-grave-west-point" } end @@ -109,18 +109,18 @@ test "takes first founded title in html head if there is html markup error" do assert TwitterCard.parse(html, %{}) == %{ - site: nil, - title: + "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: + "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: + "image" => "https://static01.nyt.com/images/2019/08/01/nyregion/01nypd-juveniles-promo/01nypd-juveniles-promo-facebookJumbo.jpg", - type: "article", - url: + "type" => "article", + "url" => "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html" } end From efdfc85c2d8e5118c1aa18e4f04026ec90cd11d2 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Mon, 15 Jun 2020 15:24:00 +0300 Subject: [PATCH 354/492] update docs --- docs/API/admin_api.md | 64 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index 92816baf9..6659b605d 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1224,4 +1224,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` + +- 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` + - `ban` + +- Response: + +``` json +{ + "urls": [ + "http://example.com/media/a688346.jpg", + "http://example.com/media/fb1f4d.jpg" + ] +} + +``` From e1ee8bc1da17a356c88b535db7a9228fccc5251f Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 15 Jun 2020 14:29:34 +0200 Subject: [PATCH 355/492] User: update_follower_count refactor. --- lib/pleroma/user.ex | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 52ac9052b..39a9e13e8 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -747,7 +747,6 @@ def follow(%User{} = follower, %User{} = followed, state \\ :follow_accept) do follower |> update_following_count() - |> set_cache() end end @@ -776,7 +775,6 @@ defp do_unfollow(%User{} = follower, %User{} = followed) do {:ok, follower} = follower |> update_following_count() - |> set_cache() {:ok, follower, followed} @@ -1128,35 +1126,25 @@ defp follow_information_changeset(user, params) 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)}) + follower_count = FollowingRelationship.follower_count(user) - 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 + 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 @@ -1165,7 +1153,7 @@ def update_following_count(%User{local: true} = 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 From faba1a6e337715af557e2e222e62de6fd35c9e8a Mon Sep 17 00:00:00 2001 From: stwf <steven.fuchs@dockyard.com> Date: Mon, 15 Jun 2020 12:25:03 -0400 Subject: [PATCH 356/492] fix tests --- lib/pleroma/web/preload/timelines.ex | 4 ++-- test/web/node_info_test.exs | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/preload/timelines.ex b/lib/pleroma/web/preload/timelines.ex index 2bb57567b..e531b8960 100644 --- a/lib/pleroma/web/preload/timelines.ex +++ b/lib/pleroma/web/preload/timelines.ex @@ -30,8 +30,8 @@ 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 + type: ["Create"], + local_only: local_only }) StatusView.render("index.json", activities: activities, for: nil, as: :activity) diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 00925caad..9bcc07b37 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -145,8 +145,7 @@ test "it shows default features flags", %{conn: conn} do "shareable_emoji_packs", "multifetch", "pleroma_emoji_reactions", - "pleroma:api/v1/notifications:include_types_filter", - "pleroma_chat_messages" + "pleroma:api/v1/notifications:include_types_filter" ] assert MapSet.subset?( From b02311079961c5193af1c144516a3caeee72b582 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Mon, 15 Jun 2020 20:47:02 +0300 Subject: [PATCH 357/492] fixed a visibility of functions --- .../workers/attachments_cleanup_worker.ex | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/workers/attachments_cleanup_worker.ex b/lib/pleroma/workers/attachments_cleanup_worker.ex index 4ad19c0fc..8deeabda0 100644 --- a/lib/pleroma/workers/attachments_cleanup_worker.ex +++ b/lib/pleroma/workers/attachments_cleanup_worker.ex @@ -18,22 +18,11 @@ def perform( }, _job ) do - hrefs = - Enum.flat_map(attachments, fn attachment -> - Enum.map(attachment["url"], & &1["href"]) - end) - - # find all objects for copies of the attachments, name and actor doesn't matter here - hrefs + attachments + |> Enum.flat_map(fn item -> Enum.map(item["url"], & &1["href"]) end) |> fetch_objects |> prepare_objects(actor, Enum.map(attachments, & &1["name"])) - |> Enum.reduce({[], []}, fn {href, %{id: id, count: count}}, {ids, hrefs} -> - with 1 <- count do - {ids ++ [id], hrefs ++ [href]} - else - _ -> {ids ++ [id], hrefs} - end - end) + |> filter_objects |> do_clean {:ok, :success} @@ -73,7 +62,17 @@ defp delete_objects(_), do: :ok # we should delete 1 object for any given attachment, but don't delete # files if there are more than 1 object for it - def prepare_objects(objects, actor, names) do + 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 + + defp prepare_objects(objects, actor, names) do objects |> Enum.reduce(%{}, fn %{ id: id, @@ -98,7 +97,7 @@ def prepare_objects(objects, actor, names) do end) end - def fetch_objects(hrefs) do + defp fetch_objects(hrefs) do from(o in Object, where: fragment( From 1eb6cedaadee4e1ab3e0885b4e03a8dd17ba08ea Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Tue, 16 Jun 2020 13:08:27 +0200 Subject: [PATCH 358/492] ActivityPub: When restricting to media posts, only show 'Creates'. --- lib/pleroma/web/activity_pub/activity_pub.ex | 3 ++- .../controllers/account_controller_test.exs | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index c9dc6135c..efb8b81db 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -833,7 +833,8 @@ defp restrict_media(_query, %{only_media: _val, skip_preload: true}) 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 diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index 1ce97378d..2343a9d2d 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -350,9 +350,10 @@ test "unimplemented pinned statuses feature", %{conn: conn} 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 +365,13 @@ test "gets an users media", %{conn: conn} 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) From 4733f6a3371504ebb3eeb447d7c20d56c10b43bf Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Tue, 16 Jun 2020 13:09:28 +0200 Subject: [PATCH 359/492] Changelog: Add info about `only_media` changes. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2629bf84..eee442817 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [unreleased] ### Changed +- 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 <details> From 015f9258a9bd1430ab079f449b118b664c3b9664 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Tue, 16 Jun 2020 14:48:46 +0200 Subject: [PATCH 360/492] Transmogrifier: Extract user update handling tests. --- .../user_update_handling_test.exs | 154 +++++++++++++++++ test/web/activity_pub/transmogrifier_test.exs | 156 ------------------ 2 files changed, 154 insertions(+), 156 deletions(-) create mode 100644 test/web/activity_pub/transmogrifier/user_update_handling_test.exs 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..8e5d3b883 --- /dev/null +++ b/test/web/activity_pub/transmogrifier/user_update_handling_test.exs @@ -0,0 +1,154 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# 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 == "<p>Some bio</p>" + 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 = + 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 + 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 94d8552e8..b542bb7b8 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -401,162 +401,6 @@ test "it strips internal reactions" 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 == "<p>Some bio</p>" - 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) From 9a4fde97661595630ea840917ef83b4786f2e2d3 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sun, 31 May 2020 10:46:02 +0300 Subject: [PATCH 361/492] Mogrify args as custom tuples --- lib/mix/tasks/pleroma/config.ex | 10 +- lib/pleroma/config/config_db.ex | 274 ++++---- lib/pleroma/config/transfer_task.ex | 12 +- lib/pleroma/config/type/atom.ex | 22 + lib/pleroma/config/type/binary_value.ex | 23 + .../controllers/config_controller.ex | 34 +- .../web/admin_api/views/config_view.ex | 21 +- test/config/config_db_test.exs | 587 +++++++----------- test/config/transfer_task_test.exs | 94 +-- test/support/factory.ex | 17 +- test/tasks/config_test.exs | 41 +- test/upload/filter/mogrify_test.exs | 8 +- .../controllers/config_controller_test.exs | 256 +++++--- 13 files changed, 620 insertions(+), 779 deletions(-) create mode 100644 lib/pleroma/config/type/atom.ex create mode 100644 lib/pleroma/config/type/binary_value.ex diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 5c9ef6904..f1b3a8766 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -72,8 +72,7 @@ defp create(group, settings) 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 +130,9 @@ defp write_and_delete(config, file, delete?) 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/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index 2b43d4c36..39b37c42e 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.Config.Type.Atom) + field(:group, Pleroma.Config.Type.Atom) + field(:value, Pleroma.Config.Type.BinaryValue) field(:db, {:array, :string}, virtual: true, default: []) timestamps() @@ -51,10 +37,6 @@ def get_all_as_keyword 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 @@ def get_by_params(params), do: Repo.get_by(ConfigDB, params) @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 @@ def merge_group(group, key, old_value, new_value) 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,43 +130,39 @@ defp deep_merge(_key, value1, value2) 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]), 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) + 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 - {group, key} when is_list(key) -> - config_group == group and config_key in key - - {group, key} -> - config_group == group and config_key == key + 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 @@ -205,11 +172,10 @@ def delete(params) do 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 +191,32 @@ def delete(params) 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 +225,64 @@ defp do_convert({:proxy_url, {type, host, port}}) when is_tuple(host) 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 +291,51 @@ defp do_transform(%{"tuple" => [":partial_chain", entity]}) 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 is_module_name?(value) do + String.to_existing_atom("Elixir." <> value) + else + value + end + end defp parse_host("localhost"), do: :localhost @@ -387,25 +372,6 @@ defp find_valid_delimiter([delimiter | others], pattern, regex_delimiter) 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 Regex.match?(~r/^(Pleroma|Phoenix|Tesla|Quack|Ueberauth|Swoosh)\./, string) or 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 @@ def load_and_update_env(deleted_settings \\ [], restart_pleroma? \\ true) 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 @@ defp maybe_set_pleroma_last(apps) 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/config/type/atom.ex b/lib/pleroma/config/type/atom.ex new file mode 100644 index 000000000..387869284 --- /dev/null +++ b/lib/pleroma/config/type/atom.ex @@ -0,0 +1,22 @@ +defmodule Pleroma.Config.Type.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/config/type/binary_value.ex b/lib/pleroma/config/type/binary_value.ex new file mode 100644 index 000000000..17c5524a3 --- /dev/null +++ b/lib/pleroma/config/type/binary_value.ex @@ -0,0 +1,23 @@ +defmodule Pleroma.Config.Type.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/web/admin_api/controllers/config_controller.ex b/lib/pleroma/web/admin_api/controllers/config_controller.ex index d6e2019bc..7f60470cb 100644 --- a/lib/pleroma/web/admin_api/controllers/config_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/config_controller.ex @@ -33,7 +33,11 @@ def descriptions(conn, _params) do def show(conn, %{only_db: true}) do with :ok <- configurable_from_database() do configs = Pleroma.Repo.all(ConfigDB) - render(conn, "index.json", %{configs: configs}) + + render(conn, "index.json", %{ + configs: configs, + need_reboot: Restarter.Pleroma.need_reboot?() + }) end end @@ -61,17 +65,20 @@ def show(conn, _params) do value end - %{ - group: ConfigDB.convert(group), - key: ConfigDB.convert(key), - value: ConfigDB.convert(merged_value) + %ConfigDB{ + group: group, + key: key, + value: merged_value } |> Pleroma.Maps.put_if_present(:db, db) end) end) |> List.flatten() - json(conn, %{configs: merged, need_reboot: Restarter.Pleroma.need_reboot?()}) + render(conn, "index.json", %{ + configs: merged, + need_reboot: Restarter.Pleroma.need_reboot?() + }) end end @@ -91,24 +98,17 @@ def update(%{body_params: %{configs: configs}} = conn, _) do {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 + |> 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?(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) + |> Enum.any?(&Config.TransferTask.pleroma_need_restart?(&1.group, &1.key, &1.value)) if changed_reboot_settings?, do: Restarter.Pleroma.need_reboot() 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 - def render("index.json", %{configs: configs} = params) do - map = %{ - configs: render_many(configs, __MODULE__, "show.json", as: :config) - } + alias Pleroma.ConfigDB - if params[:need_reboot] do - Map.put(map, :need_reboot, true) - else - map - end + def render("index.json", %{configs: configs} = params) do + %{ + configs: render_many(configs, __MODULE__, "show.json", as: :config), + need_reboot: params[:need_reboot] + } 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/test/config/config_db_test.exs b/test/config/config_db_test.exs index 336de7359..a04575c6f 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 @@ test "get_all_as_keyword/0" 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: "new_value"} ] assert Repo.all(ConfigDB) |> length() == 1 @@ -65,16 +53,16 @@ test "common" 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 == "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 @@ test "partial update" 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 @@ test "deep merge" 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 @@ test "only full update for some keys" 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 @@ test "full update if value is not keyword" do insert(:config, group: ":tesla", key: ":adapter", - value: ConfigDB.to_binary(Tesla.Adapter.Hackney) + value: Tesla.Adapter.Hackney ) {:ok, _config} = @@ -154,20 +138,20 @@ test "full update if value is not keyword" 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 @@ test "only full update for some subkeys" 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 @@ test "full delete" 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 @@ test "partial subkeys delete" 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 @@ test "full delete if remaining value after subkeys deletion is empty list" 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,23 @@ test "list of mixed values" 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"] + assert ConfigDB.to_elixir_types([%{"tuple" => [":key", "value"]}]) == [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" => [":partial_chain", "&:hackney_connect.partial_chain/1"]} + ]) == [partial_chain: &:hackney_connect.partial_chain/1] 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, @@ -513,85 +405,55 @@ test "keyword" do 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 +463,73 @@ test "common keyword" 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/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 @@ test "transfer config values from db to env" 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 @@ test "transfer config values for 1 group and some keys" 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 @@ test "transfer config values with full subkey update" 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 @@ test "transfer config values with full subkey update" 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 @@ test "don't restart if no reboot time settings were changed" 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 @@ test "don't restart pleroma on reboot time key and subkey if there is false flag 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/support/factory.ex b/test/support/factory.ex index 6e3676aca..e517d5bc6 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -396,24 +396,17 @@ def registration_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/tasks/config_test.exs b/test/tasks/config_test.exs index 04bc947a9..e1bddfebf 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 @@ -49,24 +51,19 @@ test "filtered settings are migrated to db" do refute ConfigDB.get_by_params(%{group: ":pleroma", key: "Pleroma.Repo"}) refute ConfigDB.get_by_params(%{group: ":postgrex", key: ":json_library"}) - 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 +79,9 @@ test "config table is truncated before migration" 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 +94,8 @@ test "settings are migrated to file and deleted from db", %{temp_file: temp_file 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", @@ -163,7 +149,6 @@ test "load a settings with large values and pass to file", %{temp_file: temp_fil extended_nickname_format: true, multi_factor_authentication: [ totp: [ - # digits 6 or 8 digits: 6, period: 30 ], @@ -173,7 +158,7 @@ test "load a settings with large values and pass to file", %{temp_file: temp_fil ] ] ] - }) + ) Mix.Tasks.Pleroma.Config.run(["migrate_from_db", "--env", "temp", "-d"]) 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/web/admin_api/controllers/config_controller_test.exs b/test/web/admin_api/controllers/config_controller_test.exs index 780de8d18..064ef9bc7 100644 --- a/test/web/admin_api/controllers/config_controller_test.exs +++ b/test/web/admin_api/controllers/config_controller_test.exs @@ -57,12 +57,12 @@ test "with settings only in db", %{conn: conn} do ] } = json_response_and_validate_schema(conn, 200) - assert key1 == config1.key - assert key2 == config2.key + 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: ConfigDB.to_binary(name: "Some name")) + _config = insert(:config, key: ":instance", value: [name: "Some name"]) %{"configs" => configs} = conn @@ -83,7 +83,7 @@ test "merged default setting with db settings", %{conn: conn} do config3 = insert(:config, - value: ConfigDB.to_binary(k1: :v1, k2: :v2) + value: [k1: :v1, k2: :v2] ) %{"configs" => configs} = @@ -93,42 +93,45 @@ test "merged default setting with db settings", %{conn: conn} do 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 [config1.key, config2.key, config3.key] + group == ":pleroma" and key in keys end) assert length(received_configs) == 3 db_keys = config3.value - |> ConfigDB.from_binary() |> Keyword.keys() - |> ConfigDB.convert() + |> 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} -> - assert db in [[config1.key], [config2.key], db_keys] + db = MapSet.new(db) + assert MapSet.subset?(db, mapset_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) - ] + assert value in values 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]) - ) + insert(:config, + key: ":emoji", + 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]) - ) + insert(:config, + key: ":assets", + value: [mascots: [a: 1, b: 2], key: [a: 1]] + ) %{"configs" => configs} = conn @@ -137,14 +140,14 @@ test "subkeys with full update right merge", %{conn: conn} do vals = Enum.filter(configs, fn %{"group" => group, "key" => key} -> - group == ":pleroma" and key in [config1.key, config2.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.transform_with_out_binary(emoji["value"]) - assets_val = ConfigDB.transform_with_out_binary(assets["value"]) + 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] @@ -277,7 +280,8 @@ test "create new config setting in db", %{conn: conn} do "value" => %{"tuple" => ["string", "Pleroma.Captcha.NotReal", []]}, "db" => [":key5"] } - ] + ], + "need_reboot" => false } assert Application.get_env(:pleroma, :key1) == "value1" @@ -357,7 +361,8 @@ test "save configs setting without explicit key", %{conn: conn} do "value" => "https://hooks.slack.com/services/KEY", "db" => [":webhook_url"] } - ] + ], + "need_reboot" => false } assert Application.get_env(:quack, :level) == :info @@ -366,14 +371,14 @@ test "save configs setting without explicit key", %{conn: conn} do end test "saving config with partial update", %{conn: conn} do - config = insert(:config, key: ":key1", value: :erlang.term_to_binary(key1: 1, key2: 2)) + 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: config.group, key: config.key, value: [%{"tuple" => [":key3", 3]}]} + %{group: ":pleroma", key: ":key1", value: [%{"tuple" => [":key3", 3]}]} ] }) @@ -389,7 +394,8 @@ test "saving config with partial update", %{conn: conn} do ], "db" => [":key1", ":key2", ":key3"] } - ] + ], + "need_reboot" => false } end @@ -500,8 +506,7 @@ test "update setting which need reboot, don't change reboot flag until reboot", 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])) + insert(:config, key: :key1, value: [key1: 1, key2: [k1: 1, k2: 2]]) conn = conn @@ -509,8 +514,8 @@ test "saving config with nested merge", %{conn: conn} do |> post("/api/pleroma/admin/config", %{ configs: [ %{ - group: config.group, - key: config.key, + group: ":pleroma", + key: ":key1", value: [ %{"tuple" => [":key3", 3]}, %{ @@ -548,7 +553,8 @@ test "saving config with nested merge", %{conn: conn} do ], "db" => [":key1", ":key3", ":key2"] } - ] + ], + "need_reboot" => false } end @@ -588,7 +594,8 @@ test "saving special atoms", %{conn: conn} do ], "db" => [":ssl_options"] } - ] + ], + "need_reboot" => false } assert Application.get_env(:pleroma, :key1) == [ @@ -600,12 +607,11 @@ 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([]) - ) + insert(:config, + group: :logger, + key: :backends, + value: [] + ) Pleroma.Config.TransferTask.load_and_update_env([], false) @@ -617,8 +623,8 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do |> post("/api/pleroma/admin/config", %{ configs: [ %{ - group: config.group, - key: config.key, + group: ":logger", + key: ":backends", value: [":console"] } ] @@ -634,7 +640,8 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do ], "db" => [":backends"] } - ] + ], + "need_reboot" => false } assert Application.get_env(:logger, :backends) == [ @@ -643,19 +650,18 @@ test "saving full setting if value is in full_key_update list", %{conn: conn} do 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) - ) + 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: config.group, key: config.key, value: "Tesla.Adapter.Httpc"} + %{group: ":tesla", key: ":adapter", value: "Tesla.Adapter.Httpc"} ] }) @@ -667,7 +673,8 @@ test "saving full setting if value is not keyword", %{conn: conn} do "value" => "Tesla.Adapter.Httpc", "db" => [":adapter"] } - ] + ], + "need_reboot" => false } end @@ -677,13 +684,13 @@ test "update config setting & delete with fallback to default value", %{ token: token } do ueberauth = Application.get_env(:ueberauth, Ueberauth) - config1 = insert(:config, key: ":keyaa1") - config2 = insert(:config, key: ":keyaa2") + insert(:config, key: :keyaa1) + insert(:config, key: :keyaa2) config3 = insert(:config, - group: ":ueberauth", - key: "Ueberauth" + group: :ueberauth, + key: Ueberauth ) conn = @@ -691,8 +698,8 @@ test "update config setting & delete with fallback to default value", %{ |> put_req_header("content-type", "application/json") |> post("/api/pleroma/admin/config", %{ configs: [ - %{group: config1.group, key: config1.key, value: "another_value"}, - %{group: config2.group, key: config2.key, value: "another_value"} + %{group: ":pleroma", key: ":keyaa1", value: "another_value"}, + %{group: ":pleroma", key: ":keyaa2", value: "another_value"} ] }) @@ -700,22 +707,23 @@ test "update config setting & delete with fallback to default value", %{ "configs" => [ %{ "group" => ":pleroma", - "key" => config1.key, + "key" => ":keyaa1", "value" => "another_value", "db" => [":keyaa1"] }, %{ "group" => ":pleroma", - "key" => config2.key, + "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) == ConfigDB.from_binary(config3.value) + assert Application.get_env(:ueberauth, Ueberauth) == config3.value conn = build_conn() @@ -724,7 +732,7 @@ test "update config setting & delete with fallback to default value", %{ |> put_req_header("content-type", "application/json") |> post("/api/pleroma/admin/config", %{ configs: [ - %{group: config2.group, key: config2.key, delete: true}, + %{group: ":pleroma", key: ":keyaa2", delete: true}, %{ group: ":ueberauth", key: "Ueberauth", @@ -734,7 +742,8 @@ test "update config setting & delete with fallback to default value", %{ }) assert json_response_and_validate_schema(conn, 200) == %{ - "configs" => [] + "configs" => [], + "need_reboot" => false } assert Application.get_env(:ueberauth, Ueberauth) == ueberauth @@ -801,7 +810,8 @@ test "common config example", %{conn: conn} do ":name" ] } - ] + ], + "need_reboot" => false } end @@ -935,7 +945,8 @@ test "tuples with more than two values", %{conn: conn} do ], "db" => [":http"] } - ] + ], + "need_reboot" => false } end @@ -1000,7 +1011,8 @@ test "settings with nesting map", %{conn: conn} do ], "db" => [":key2", ":key3"] } - ] + ], + "need_reboot" => false } end @@ -1027,7 +1039,8 @@ test "value as map", %{conn: conn} do "value" => %{"key" => "some_val"}, "db" => [":key1"] } - ] + ], + "need_reboot" => false } end @@ -1077,16 +1090,16 @@ test "queues key as atom", %{conn: conn} do ":background" ] } - ] + ], + "need_reboot" => false } 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") - ) + insert(:config, + key: :keyaa1, + value: [subkey1: "val1", subkey2: "val2", subkey3: "val3"] + ) conn = conn @@ -1094,8 +1107,8 @@ test "delete part of settings by atom subkeys", %{conn: conn} do |> post("/api/pleroma/admin/config", %{ configs: [ %{ - group: config.group, - key: config.key, + group: ":pleroma", + key: ":keyaa1", subkeys: [":subkey1", ":subkey3"], delete: true } @@ -1110,7 +1123,8 @@ test "delete part of settings by atom subkeys", %{conn: conn} do "value" => [%{"tuple" => [":subkey2", "val2"]}], "db" => [":subkey2"] } - ] + ], + "need_reboot" => false } end @@ -1236,6 +1250,90 @@ test "doesn't set keys not in the whitelist", %{conn: conn} do 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 From 23decaab81b900bff0f6eacad7ea6a894239e4ce Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sun, 31 May 2020 12:38:24 +0300 Subject: [PATCH 362/492] fix for updated hackney warning: :hackney_connect.partial_chain/1 is undefined or private --- test/config/config_db_test.exs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/config/config_db_test.exs b/test/config/config_db_test.exs index a04575c6f..8d753e255 100644 --- a/test/config/config_db_test.exs +++ b/test/config/config_db_test.exs @@ -382,12 +382,6 @@ test "simple keyword" do assert ConfigDB.to_elixir_types([%{"tuple" => [":key", "value"]}]) == [key: "value"] end - test "keyword with partial_chain key" do - assert ConfigDB.to_elixir_types([ - %{"tuple" => [":partial_chain", "&:hackney_connect.partial_chain/1"]} - ]) == [partial_chain: &:hackney_connect.partial_chain/1] - end - test "keyword" do assert ConfigDB.to_elixir_types([ %{"tuple" => [":types", "Pleroma.PostgresTypes"]}, From e1603ac8fee2a660c3dc510dee5967e0fd1bbd98 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sun, 31 May 2020 13:25:04 +0300 Subject: [PATCH 363/492] fix attemps to merge map --- lib/pleroma/config/config_db.ex | 3 ++- test/config/config_db_test.exs | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index 39b37c42e..70be17ecf 100644 --- a/lib/pleroma/config/config_db.ex +++ b/lib/pleroma/config/config_db.ex @@ -135,7 +135,8 @@ def update_or_create(params) do with %ConfigDB{} = config <- ConfigDB.get_by_params(search_opts), {_, true, config} <- {:partial_update, can_be_partially_updated?(config), config}, - {_, true, config} <- {:can_be_merged, is_list(params[:value]), config} do + {_, 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 diff --git a/test/config/config_db_test.exs b/test/config/config_db_test.exs index 8d753e255..3895e2cda 100644 --- a/test/config/config_db_test.exs +++ b/test/config/config_db_test.exs @@ -43,7 +43,7 @@ test "common" do params = [ %{group: :pleroma, key: key2, value: "another_value"}, - %{group: :pleroma, key: config.key, value: "new_value"} + %{group: :pleroma, key: config.key, value: [a: 1, b: 2, c: "new_value"]} ] assert Repo.all(ConfigDB) |> length() == 1 @@ -55,7 +55,7 @@ test "common" do config1 = ConfigDB.get_by_params(%{group: config.group, key: config.key}) config2 = ConfigDB.get_by_params(%{group: :pleroma, key: key2}) - assert config1.value == "new_value" + assert config1.value == [a: 1, b: 2, c: "new_value"] assert config2.value == "another_value" end @@ -398,6 +398,10 @@ test "keyword" 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 assert ConfigDB.to_elixir_types([ %{"tuple" => [":uploader", "Pleroma.Uploaders.Local"]}, From 32c6576b600e2f24310f429f4b2391f95a5b5ba0 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sun, 31 May 2020 14:42:15 +0300 Subject: [PATCH 364/492] naming --- lib/pleroma/config/config_db.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index 70be17ecf..30bd51b05 100644 --- a/lib/pleroma/config/config_db.ex +++ b/lib/pleroma/config/config_db.ex @@ -331,7 +331,7 @@ def string_to_elixir_types("~r" <> _pattern = regex) do def string_to_elixir_types(":" <> atom), do: String.to_atom(atom) def string_to_elixir_types(value) do - if is_module_name?(value) do + if module_name?(value) do String.to_existing_atom("Elixir." <> value) else value @@ -373,8 +373,8 @@ defp find_valid_delimiter([delimiter | others], pattern, regex_delimiter) do 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 From aca6a7543ae97da2d1af8a6f9c547a0088d9e240 Mon Sep 17 00:00:00 2001 From: Steven Fuchs <steven.fuchs@dockyard.com> Date: Tue, 16 Jun 2020 13:18:29 +0000 Subject: [PATCH 365/492] Upgrade to Elixir 1.9 --- .gitlab-ci.yml | 2 +- elixir_buildpack.config | 4 ++-- mix.exs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aad28a2d8..bc7b289a2 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 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/mix.exs b/mix.exs index 03b060bc0..6040c994e 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ def project 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())], From 3c2cee33adcd79a76b192a66f6f2d3772e2fda99 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Tue, 16 Jun 2020 17:50:33 +0300 Subject: [PATCH 366/492] moving custom ecto types in context folders --- lib/pleroma/config/config_db.ex | 6 +++--- .../activity_pub/object_validators}/date_time.ex | 6 +++++- .../activity_pub/object_validators}/object_id.ex | 6 +++++- .../activity_pub/object_validators}/recipients.ex | 8 ++++++-- .../activity_pub/object_validators}/safe_text.ex | 2 +- .../activity_pub/object_validators}/uri.ex | 6 +++++- .../{config/type => ecto_type/config}/atom.ex | 6 +++++- .../type => ecto_type/config}/binary_value.ex | 6 +++++- lib/pleroma/signature.ex | 4 ++-- lib/pleroma/user.ex | 4 ++-- lib/pleroma/web/activity_pub/object_validator.ex | 4 ++-- .../object_validators/announce_validator.ex | 14 +++++++------- .../object_validators/chat_message_validator.ex | 12 ++++++------ .../create_chat_message_validator.ex | 10 +++++----- .../object_validators/create_note_validator.ex | 6 +++--- .../object_validators/delete_validator.ex | 14 +++++++------- .../object_validators/emoji_react_validator.ex | 8 ++++---- .../object_validators/like_validator.ex | 14 +++++++------- .../object_validators/note_validator.ex | 12 ++++++------ .../object_validators/undo_validator.ex | 8 ++++---- .../object_validators/url_object_validator.ex | 8 ++++++-- lib/pleroma/web/activity_pub/transmogrifier.ex | 4 ++-- .../object_validators/types/date_time_test.exs | 2 +- .../object_validators/types/object_id_test.exs | 2 +- .../object_validators/types/recipients_test.exs | 2 +- .../object_validators/types/safe_text_test.exs | 2 +- 26 files changed, 102 insertions(+), 74 deletions(-) rename lib/pleroma/{web/activity_pub/object_validators/types => ecto_type/activity_pub/object_validators}/date_time.ex (77%) rename lib/pleroma/{web/activity_pub/object_validators/types => ecto_type/activity_pub/object_validators}/object_id.ex (69%) rename lib/pleroma/{web/activity_pub/object_validators/types => ecto_type/activity_pub/object_validators}/recipients.ex (64%) rename lib/pleroma/{web/activity_pub/object_validators/types => ecto_type/activity_pub/object_validators}/safe_text.ex (85%) rename lib/pleroma/{web/activity_pub/object_validators/types => ecto_type/activity_pub/object_validators}/uri.ex (63%) rename lib/pleroma/{config/type => ecto_type/config}/atom.ex (66%) rename lib/pleroma/{config/type => ecto_type/config}/binary_value.ex (65%) diff --git a/lib/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index 30bd51b05..2f4eb8581 100644 --- a/lib/pleroma/config/config_db.ex +++ b/lib/pleroma/config/config_db.ex @@ -23,9 +23,9 @@ defmodule Pleroma.ConfigDB do ] schema "config" do - field(:key, Pleroma.Config.Type.Atom) - field(:group, Pleroma.Config.Type.Atom) - field(:value, Pleroma.Config.Type.BinaryValue) + 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() 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 <https://pleroma.social/> +# 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 <https://pleroma.social/> +# 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/web/activity_pub/object_validators/types/recipients.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/recipients.ex similarity index 64% rename from lib/pleroma/web/activity_pub/object_validators/types/recipients.ex rename to lib/pleroma/ecto_type/activity_pub/object_validators/recipients.ex index 408e0f6ee..205527a96 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/recipients.ex +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/recipients.ex @@ -1,7 +1,11 @@ -defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.Recipients do +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.Recipients do use Ecto.Type - alias Pleroma.Web.ActivityPub.ObjectValidators.Types.ObjectID + alias Pleroma.EctoType.ActivityPub.ObjectValidators.ObjectID def type, do: {:array, ObjectID} diff --git a/lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex b/lib/pleroma/ecto_type/activity_pub/object_validators/safe_text.ex similarity index 85% rename from lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex rename to lib/pleroma/ecto_type/activity_pub/object_validators/safe_text.ex index 95c948123..7f0405c7b 100644 --- a/lib/pleroma/web/activity_pub/object_validators/types/safe_text.ex +++ b/lib/pleroma/ecto_type/activity_pub/object_validators/safe_text.ex @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.SafeText do +defmodule Pleroma.EctoType.ActivityPub.ObjectValidators.SafeText do use Ecto.Type alias Pleroma.HTML 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 <https://pleroma.social/> +# 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/config/type/atom.ex b/lib/pleroma/ecto_type/config/atom.ex similarity index 66% rename from lib/pleroma/config/type/atom.ex rename to lib/pleroma/ecto_type/config/atom.ex index 387869284..df565d432 100644 --- a/lib/pleroma/config/type/atom.ex +++ b/lib/pleroma/ecto_type/config/atom.ex @@ -1,4 +1,8 @@ -defmodule Pleroma.Config.Type.Atom do +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.Config.Atom do use Ecto.Type def type, do: :atom diff --git a/lib/pleroma/config/type/binary_value.ex b/lib/pleroma/ecto_type/config/binary_value.ex similarity index 65% rename from lib/pleroma/config/type/binary_value.ex rename to lib/pleroma/ecto_type/config/binary_value.ex index 17c5524a3..bbd2608c5 100644 --- a/lib/pleroma/config/type/binary_value.ex +++ b/lib/pleroma/ecto_type/config/binary_value.ex @@ -1,4 +1,8 @@ -defmodule Pleroma.Config.Type.BinaryValue do +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.EctoType.Config.BinaryValue do use Ecto.Type def type, do: :term 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 @@ def key_id_to_actor_id(key_id) 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/user.ex b/lib/pleroma/user.ex index 52ac9052b..686ab0123 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 @@ -115,7 +115,7 @@ defmodule Pleroma.User do field(:is_admin, :boolean, default: false) field(:show_role, :boolean, default: true) field(:settings, :map, default: nil) - field(:uri, Types.Uri, 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) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index c01c5f780..3d699e8a5 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -10,6 +10,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do """ alias Pleroma.Object + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator @@ -17,7 +18,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do 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 @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()} @@ -120,7 +120,7 @@ def stringify_keys(object) when is_list(object) do 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 diff --git a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex index 40f861f47..6f757f49c 100644 --- a/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/announce_validator.ex @@ -5,9 +5,9 @@ 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.ObjectValidators.Types alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.ActivityPub.Visibility @@ -19,14 +19,14 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator 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, autogenerate: {Utils, :generate_context_id, []}) - field(:to, Types.Recipients, default: []) - field(:cc, Types.Recipients, default: []) - field(:published, Types.DateTime) + field(:to, ObjectValidators.Recipients, default: []) + field(:cc, ObjectValidators.Recipients, default: []) + field(:published, ObjectValidators.DateTime) end def cast_and_validate(data) do 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 index 138736f23..c481d79e0 100644 --- a/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/chat_message_validator.ex @@ -5,9 +5,9 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do use Ecto.Schema + alias Pleroma.EctoType.ActivityPub.ObjectValidators alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.AttachmentValidator - alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset import Pleroma.Web.ActivityPub.Transmogrifier, only: [fix_emoji: 1] @@ -16,12 +16,12 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator do @derive Jason.Encoder embedded_schema do - field(:id, Types.ObjectID, primary_key: true) - field(:to, Types.Recipients, default: []) + field(:id, ObjectValidators.ObjectID, primary_key: true) + field(:to, ObjectValidators.Recipients, default: []) field(:type, :string) - field(:content, Types.SafeText) - field(:actor, Types.ObjectID) - field(:published, Types.DateTime) + field(:content, ObjectValidators.SafeText) + field(:actor, ObjectValidators.ObjectID) + field(:published, ObjectValidators.DateTime) field(:emoji, :map, default: %{}) embeds_one(:attachment, AttachmentValidator) 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 index fc582400b..7269f9ff0 100644 --- 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 @@ -7,9 +7,9 @@ # - 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 - alias Pleroma.Web.ActivityPub.ObjectValidators.Types import Ecto.Changeset import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @@ -17,11 +17,11 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.CreateChatMessageValidator do @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, Types.Recipients, default: []) - field(:object, Types.ObjectID) + field(:to, ObjectValidators.Recipients, default: []) + field(:object, ObjectValidators.ObjectID) end def cast_and_apply(data) do diff --git a/lib/pleroma/web/activity_pub/object_validators/create_note_validator.ex b/lib/pleroma/web/activity_pub/object_validators/create_note_validator.ex index 926804ce7..316bd0c07 100644 --- a/lib/pleroma/web/activity_pub/object_validators/create_note_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 e5d08eb5c..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 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 @@ def fix_recipients(cng) 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..a10728ac6 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,7 +35,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do field(:like_count, :integer, default: 0) field(:announcement_count, :integer, default: 0) field(:inRepyTo, :string) - field(:uri, Types.Uri) + field(:uri, ObjectValidators.Uri) field(:likes, {:array, :string}, default: []) field(:announcements, {:array, :string}, default: []) 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/url_object_validator.ex b/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex index 47e231150..f64fac46d 100644 --- a/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/url_object_validator.ex @@ -1,14 +1,18 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + defmodule Pleroma.Web.ActivityPub.ObjectValidators.UrlObjectValidator 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(:type, :string) - field(:href, Types.Uri) + field(:href, ObjectValidators.Uri) field(:mediaType, :string) end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 985921aa0..851f474b8 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -8,6 +8,7 @@ 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 @@ -18,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 @@ -725,7 +725,7 @@ def handle_incoming( 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 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 c8911948e..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 @@ -3,7 +3,7 @@ # 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 index d4a574554..9c08606f6 100644 --- a/test/web/activity_pub/object_validators/types/safe_text_test.exs +++ b/test/web/activity_pub/object_validators/types/safe_text_test.exs @@ -5,7 +5,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.Types.SafeTextTest do use Pleroma.DataCase - alias Pleroma.Web.ActivityPub.ObjectValidators.Types.SafeText + alias Pleroma.EctoType.ActivityPub.ObjectValidators.SafeText test "it lets normal text go through" do text = "hey how are you" From ed189568f3c2c6fc6ae9ba4d676e95902b3019d1 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sat, 21 Mar 2020 09:47:05 +0300 Subject: [PATCH 367/492] moving mrf settings from instance to separate group --- CHANGELOG.md | 5 +- config/config.exs | 8 ++- config/description.exs | 64 +++++++++++-------- docs/configuration/cheatsheet.md | 45 +++++++------ docs/configuration/mrf.md | 14 ++-- lib/pleroma/config/config_db.ex | 8 ++- lib/pleroma/config/deprecation_warnings.ex | 44 +++++++++++++ lib/pleroma/web/activity_pub/mrf.ex | 4 +- .../web/activity_pub/mrf/simple_policy.ex | 28 ++++---- .../web/mastodon_api/views/instance_view.ex | 2 +- ...rf_config_move_from_instance_namespace.exs | 39 +++++++++++ test/config/deprecation_warnings_test.exs | 57 +++++++++++++++++ test/tasks/config_test.exs | 5 +- test/web/activity_pub/mrf/mrf_test.exs | 4 +- test/web/federator_test.exs | 4 +- test/web/node_info_test.exs | 46 ++++--------- 16 files changed, 256 insertions(+), 121 deletions(-) create mode 100644 priv/repo/migrations/20200323122421_mrf_config_move_from_instance_namespace.exs create mode 100644 test/config/deprecation_warnings_test.exs diff --git a/CHANGELOG.md b/CHANGELOG.md index d2629bf84..12e8d58e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [unreleased] - ### Changed - MFR policy to set global expiration for all local Create activities - OGP rich media parser merged with TwitterCard +- Configuration: `rewrite_policy` renamed to `policies` and moved from `instance` to `mrf` group. Old config namespace is deprecated. +- Configuration: `mrf_transparency` renamed to `transparency` and moved from `instance` to `mrf` group. Old config namespace is deprecated. +- Configuration: `mrf_transparency_exclusions` renamed to `transparency_exclusions` and moved from `instance` to `mrf` group. Old config namespace is deprecated. + <details> <summary>API Changes</summary> - **Breaking:** Emoji API: changed methods and renamed routes. diff --git a/config/config.exs b/config/config.exs index 6a7bb9e06..3d6336a66 100644 --- a/config/config.exs +++ b/config/config.exs @@ -209,7 +209,6 @@ Pleroma.Web.ActivityPub.Publisher ], allow_relay: true, - rewrite_policy: Pleroma.Web.ActivityPub.MRF.NoOpPolicy, public: true, quarantined_instances: [], managed_config: true, @@ -220,8 +219,6 @@ "text/markdown", "text/bbcode" ], - mrf_transparency: true, - mrf_transparency_exclusions: [], autofollowed_nicknames: [], max_pinned_statuses: 1, attachment_links: false, @@ -685,6 +682,11 @@ config :pleroma, Pleroma.Web.ApiSpec.CastAndValidate, strict: false +config :pleroma, :mrf, + policies: Pleroma.Web.ActivityPub.MRF.NoOpPolicy, + transparency: true, + transparency_exclusions: [] + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" diff --git a/config/description.exs b/config/description.exs index b21d7840c..2ab95e5ab 100644 --- a/config/description.exs +++ b/config/description.exs @@ -689,17 +689,6 @@ 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, @@ -742,23 +731,6 @@ "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, @@ -3325,5 +3297,41 @@ 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/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index fad67fc4d..e9af604e2 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -36,26 +36,10 @@ 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 certain 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)). - * `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Adds expiration to all local Create activities (see [`:mrf_activity_expiration`](#mrf_activity_expiration)). * `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. @@ -78,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. @@ -969,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/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/lib/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index 30bd51b05..c0f3fe888 100644 --- a/lib/pleroma/config/config_db.ex +++ b/lib/pleroma/config/config_db.ex @@ -54,13 +54,13 @@ def changeset(config, params \\ %{}) do defp create(params) do %ConfigDB{} - |> changeset(params) + |> changeset(params, transform?) |> Repo.insert() end defp update(%ConfigDB{} = config, %{value: value}) do config - |> changeset(%{value: value}) + |> changeset(%{value: value}, transform?) |> Repo.update() end @@ -167,7 +167,9 @@ defp only_full_update?(%ConfigDB{group: group, key: key}) do 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) diff --git a/lib/pleroma/config/deprecation_warnings.ex b/lib/pleroma/config/deprecation_warnings.ex index b68ded01f..0a6c724fb 100644 --- a/lib/pleroma/config/deprecation_warnings.ex +++ b/lib/pleroma/config/deprecation_warnings.ex @@ -3,9 +3,23 @@ # 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 Config.get([:mrf_hellthread, :threshold]) do Logger.warn(""" @@ -39,5 +53,35 @@ def mrf_user_allowlist do 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/web/activity_pub/mrf.ex b/lib/pleroma/web/activity_pub/mrf.ex index 5a4a76085..206d6af52 100644 --- a/lib/pleroma/web/activity_pub/mrf.ex +++ b/lib/pleroma/web/activity_pub/mrf.ex @@ -16,7 +16,7 @@ def filter(policies, %{} = object) do 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] @@ -51,7 +51,7 @@ def describe(policies) 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/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 @@ defp check_accept(%{host: actor_host} = _actor_info, object) 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 @@ defp check_media_removal( ) 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 @@ defp check_media_nsfw( } = 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 @@ defp check_media_nsfw(_actor_info, object), do: {:ok, object} 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 @@ defp check_ftl_removal(%{host: actor_host} = _actor_info, object) 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 @@ defp check_report_removal(_actor_info, object), do: {:ok, object} 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 @@ defp check_avatar_removal(_actor_info, object), do: {:ok, object} 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 @@ def filter(object), do: {:ok, object} @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/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index c498fe632..4f0ae4e8f 100644 --- a/lib/pleroma/web/mastodon_api/views/instance_view.ex +++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex @@ -78,7 +78,7 @@ def features 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/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..6f6094613 --- /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 + old_instance = ConfigDB.from_binary(config.value) + + mrf = + old_instance + |> 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.create( + %{group: ":pleroma", key: ":mrf", value: ConfigDB.to_binary(mrf)}, + false + ) + + new_instance = Keyword.drop(old_instance, @old_keys) + + if new_instance != [] do + {:ok, _} = ConfigDB.update(config, %{value: ConfigDB.to_binary(new_instance)}, false) + else + {:ok, _} = ConfigDB.delete(config) + end + end + end + end +end 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/tasks/config_test.exs b/test/tasks/config_test.exs index e1bddfebf..bae171074 100644 --- a/test/tasks/config_test.exs +++ b/test/tasks/config_test.exs @@ -120,14 +120,11 @@ test "load a settings with large values and pass to file", %{temp_file: temp_fil 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, @@ -174,7 +171,7 @@ test "load a settings with large values and pass to file", %{temp_file: temp_fil 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/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 @@ test "matches are case-insensitive" 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 @@ test "it works as expected with noop policy" 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/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 @@ test "it does not crash if MRF rejects the post" 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/node_info_test.exs b/test/web/node_info_test.exs index 00925caad..06b33607f 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -67,10 +67,10 @@ test "returns software.repository field in nodeinfo 2.1", %{conn: conn} 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 @@ test "returns fieldsLimits field", %{conn: conn} 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 @@ test "it returns the safe_dm_mentions feature if enabled", %{conn: conn} 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 @@ -156,14 +153,11 @@ test "it shows default features flags", %{conn: conn} 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 @@ -171,26 +165,17 @@ test "it shows MRF transparency data if enabled", %{conn: conn} 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 @@ -199,10 +184,5 @@ test "it performs exclusions from MRF transparency data if configured", %{conn: 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 From b66e6eb521c2901da119179016c99751cb5e6f95 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Tue, 16 Jun 2020 19:03:45 +0300 Subject: [PATCH 368/492] fixes for tests --- docs/configuration/storing_remote_media.md | 4 ++-- lib/pleroma/config/config_db.ex | 4 ++-- test/web/activity_pub/activity_pub_test.exs | 4 ++-- test/workers/cron/purge_expired_activities_worker_test.exs | 6 +----- 4 files changed, 7 insertions(+), 11 deletions(-) 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/lib/pleroma/config/config_db.ex b/lib/pleroma/config/config_db.ex index c0f3fe888..134116863 100644 --- a/lib/pleroma/config/config_db.ex +++ b/lib/pleroma/config/config_db.ex @@ -54,13 +54,13 @@ def changeset(config, params \\ %{}) do defp create(params) do %ConfigDB{} - |> changeset(params, transform?) + |> changeset(params) |> Repo.insert() end defp update(%ConfigDB{} = config, %{value: value}) do config - |> changeset(%{value: value}, transform?) + |> changeset(%{value: value}) |> Repo.update() end diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 7693f6400..1c684df1a 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -2055,11 +2055,11 @@ test "it just returns the input if the user has no following/follower addresses" end describe "global activity expiration" do - setup do: clear_config([:instance, :rewrite_policy]) + setup do: clear_config([:mrf, :policies]) test "creates an activity expiration for local Create activities" do Pleroma.Config.put( - [:instance, :rewrite_policy], + [:mrf, :policies], Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy ) diff --git a/test/workers/cron/purge_expired_activities_worker_test.exs b/test/workers/cron/purge_expired_activities_worker_test.exs index 6d2991a60..b1db59fdf 100644 --- a/test/workers/cron/purge_expired_activities_worker_test.exs +++ b/test/workers/cron/purge_expired_activities_worker_test.exs @@ -13,7 +13,6 @@ defmodule Pleroma.Workers.Cron.PurgeExpiredActivitiesWorkerTest do setup do clear_config([ActivityExpiration, :enabled]) - clear_config([:instance, :rewrite_policy]) end test "deletes an expiration activity" do @@ -42,10 +41,7 @@ test "deletes an expiration activity" do test "works with ActivityExpirationPolicy" do Pleroma.Config.put([ActivityExpiration, :enabled], true) - Pleroma.Config.put( - [:instance, :rewrite_policy], - Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy - ) + clear_config([:mrf, :policies], Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy) user = insert(:user) From 5c0e1039ce41a2717598992a590658d4d079451c Mon Sep 17 00:00:00 2001 From: rinpatch <rinpatch@sdf.org> Date: Tue, 16 Jun 2020 23:45:59 +0300 Subject: [PATCH 369/492] Chunk the notification type backfill migration Long-term we want that migration to be done entirely in SQL, but for now this is a hotfix to not cause OOMs on large databases. This is using a homegrown version of `Repo.stream`, it's worse in terms of performance than the upstream since it doesn't use the same prepared query for chunk queries, but unlike the upstream it supports preloads. --- .../migration_helper/notification_backfill.ex | 2 +- lib/pleroma/repo.ex | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/migration_helper/notification_backfill.ex b/lib/pleroma/migration_helper/notification_backfill.ex index 09647d12a..b3770307a 100644 --- a/lib/pleroma/migration_helper/notification_backfill.ex +++ b/lib/pleroma/migration_helper/notification_backfill.ex @@ -18,7 +18,7 @@ def fill_in_notification_types do ) query - |> Repo.all() + |> Repo.chunk_stream(100) |> Enum.each(fn notification -> type = notification.activity diff --git a/lib/pleroma/repo.ex b/lib/pleroma/repo.ex index f62138466..6d85d70bc 100644 --- a/lib/pleroma/repo.ex +++ b/lib/pleroma/repo.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Repo do adapter: Ecto.Adapters.Postgres, migration_timestamps: [type: :naive_datetime_usec] + import Ecto.Query require Logger defmodule Instrumenter do @@ -78,6 +79,33 @@ def check_migrations_applied!() do :ok end end + + 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} + + records -> + last_id = List.last(records).id + {records, last_id} + end + end, + fn _ -> :ok end + ) + end end defmodule Pleroma.Repo.UnappliedMigrationsError do From 55d8263c0040b32075b9bb90ab1d6693e627f6bf Mon Sep 17 00:00:00 2001 From: rinpatch <rinpatch@sdf.org> Date: Wed, 17 Jun 2020 02:27:28 +0300 Subject: [PATCH 370/492] Update OTP releases to official images of 1.10.3 This is necessary since we bumped required version of elixir to 1.9. The dlsym bug should be gone by now. --- .gitlab-ci.yml | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bc7b289a2..b4bd59b43 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -170,8 +170,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 @@ -208,8 +207,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 @@ -225,8 +223,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 @@ -238,8 +235,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 @@ -251,8 +247,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 @@ -265,7 +260,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 From 281ecd6b30a165843c5b6a1899894646dc25c0f9 Mon Sep 17 00:00:00 2001 From: rinpatch <rinpatch@sdf.org> Date: Wed, 17 Jun 2020 02:29:32 +0300 Subject: [PATCH 371/492] CHANGELOG.md: mention minimal elixir version update --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f291ad2a..3ee13904f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ 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` - MFR policy to set global expiration for all local Create activities - OGP rich media parser merged with TwitterCard From 02a5648febb8a508116c29e2271e1ade2ffafb2d Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Wed, 17 Jun 2020 09:15:35 +0300 Subject: [PATCH 372/492] fixed migration the settings to DB --- lib/mix/tasks/pleroma/config.ex | 1 + lib/pleroma/config/loader.ex | 1 - ...510135645_add_fts_index_to_objects_two.exs | 33 +++++++++++-------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index f1b3a8766..65691f9c1 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -52,6 +52,7 @@ def migrate_to_db(file_path \\ nil) do defp do_migrate_to_db(config_file) do if File.exists?(config_file) do + shell_info("Running migrate 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;") diff --git a/lib/pleroma/config/loader.ex b/lib/pleroma/config/loader.ex index 0f3ecf1ed..76559e70c 100644 --- a/lib/pleroma/config/loader.ex +++ b/lib/pleroma/config/loader.ex @@ -8,7 +8,6 @@ defmodule Pleroma.Config.Loader do Pleroma.Web.Endpoint, :env, :configurable_from_database, - :database, :swarm ] 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..79bde163d 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 @@ -2,24 +2,29 @@ defmodule Pleroma.Repo.Migrations.AddFtsIndexToObjectsTwo do use Ecto.Migration def up do - execute("create extension if not exists rum") - drop_if_exists index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts) - alter table(:objects) do - add(:fts_content, :tsvector) - end + if Pleroma.Config.get([:database, :rum_enabled]) do + execute("create extension if not exists rum") + drop_if_exists index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts) + alter table(:objects) do + add(:fts_content, :tsvector) + end - execute("CREATE FUNCTION objects_fts_update() RETURNS trigger AS $$ - begin + execute("CREATE FUNCTION objects_fts_update() RETURNS trigger AS $$ + begin 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');") + + execute("CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON objects + FOR EACH ROW EXECUTE PROCEDURE objects_fts_update()") + + execute("UPDATE objects SET updated_at = NOW()") + else + raise Ecto.MigrationError, + message: "Migration is not allowed. You can change this behavior by setting `database/rum_enabled` to true." 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');") - - execute("CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON objects - FOR EACH ROW EXECUTE PROCEDURE objects_fts_update()") - - execute("UPDATE objects SET updated_at = NOW()") end def down do From a77b0388f48084bd3a420855a232bf2e504f0bce Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Wed, 17 Jun 2020 10:31:06 +0300 Subject: [PATCH 373/492] credo fix --- lib/pleroma/web/activity_pub/object_validator.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 3d699e8a5..6a83a2c33 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -9,8 +9,8 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do the system. """ - alias Pleroma.Object alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.Object alias Pleroma.User alias Pleroma.Web.ActivityPub.ObjectValidators.AnnounceValidator alias Pleroma.Web.ActivityPub.ObjectValidators.ChatMessageValidator From abda3f2d92eda0888e018cea0a2fffb21d9e0a60 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Wed, 17 Jun 2020 10:47:20 +0300 Subject: [PATCH 374/492] suggestion for changelog --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12e8d58e6..6095cf139 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,9 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed - MFR policy to set global expiration for all local Create activities - OGP rich media parser merged with TwitterCard -- Configuration: `rewrite_policy` renamed to `policies` and moved from `instance` to `mrf` group. Old config namespace is deprecated. -- Configuration: `mrf_transparency` renamed to `transparency` and moved from `instance` to `mrf` group. Old config namespace is deprecated. -- Configuration: `mrf_transparency_exclusions` renamed to `transparency_exclusions` and moved from `instance` to `mrf` group. Old config namespace is deprecated. +- 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. <details> <summary>API Changes</summary> From 9a82de219c264f467b485316570c5425e3fe2f00 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Wed, 17 Jun 2020 10:50:05 +0300 Subject: [PATCH 375/492] formatting --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6095cf139..fab87b569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [unreleased] + ### Changed - MFR policy to set global expiration for all local Create activities - OGP rich media parser merged with TwitterCard From 90613348ed8078e1906f7ffd18eebfa1a3b7f25a Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:56:13 +0000 Subject: [PATCH 376/492] Apply suggestion to docs/API/admin_api.md --- docs/API/admin_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index 6659b605d..8a3d60187 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1253,7 +1253,7 @@ Loads json generated from `config/descriptions.exs`. - Authentication: required - Params: - - `urls` + - `urls` (array) - Response: From abfb1c756b62c24589d2881d77bf5974a80809d3 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:56:17 +0000 Subject: [PATCH 377/492] Apply suggestion to docs/API/admin_api.md --- docs/API/admin_api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index 8a3d60187..c7f56cf5f 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -1273,8 +1273,8 @@ Loads json generated from `config/descriptions.exs`. - Authentication: required - Params: - - `urls` - - `ban` + - `urls` (array) + - `ban` (boolean) - Response: From 74fd761637f737822d01aed945b6e0c75ced7008 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:56:30 +0000 Subject: [PATCH 378/492] Apply suggestion to lib/pleroma/web/media_proxy/invalidation.ex --- lib/pleroma/web/media_proxy/invalidation.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex index 83ff8589c..6da7eb720 100644 --- a/lib/pleroma/web/media_proxy/invalidation.ex +++ b/lib/pleroma/web/media_proxy/invalidation.ex @@ -32,6 +32,6 @@ defp do_purge(urls) do def prepare_urls(urls) do urls |> List.wrap() - |> Enum.map(&MediaProxy.url(&1)) + |> Enum.map(&MediaProxy.url/1) end end From 1b45bc7b2ac53e56a4868da7e2b5b198d16306ab Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:58:08 +0000 Subject: [PATCH 379/492] Apply suggestion to test/web/admin_api/controllers/media_proxy_cache_controller_test.exs --- .../admin_api/controllers/media_proxy_cache_controller_test.exs | 1 - 1 file changed, 1 deletion(-) 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 index 76a96f46f..ddaf39f14 100644 --- a/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs +++ b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -14,7 +14,6 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do setup do on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) - :ok end setup do From 793a53f1ec18a42f15f58494e40ed3c37d35f95c Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:58:16 +0000 Subject: [PATCH 380/492] Apply suggestion to test/web/admin_api/controllers/media_proxy_cache_controller_test.exs --- .../admin_api/controllers/media_proxy_cache_controller_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index ddaf39f14..81e20d001 100644 --- a/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs +++ b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -72,7 +72,7 @@ test "shows banned MediaProxy URLs", %{conn: conn} do end end - describe "DELETE /api/pleroma/admin/media_proxy_caches/delete" do + describe "POST /api/pleroma/admin/media_proxy_caches/delete" do test "deleted MediaProxy URLs from banned", %{conn: conn} do MediaProxy.put_in_deleted_urls([ "http://localhost:4001/media/a688346.jpg", From 6d33a3a51bb8ff0afdf7f4f9880f8f5c5f2dfebc Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:58:28 +0000 Subject: [PATCH 381/492] Apply suggestion to test/web/admin_api/controllers/media_proxy_cache_controller_test.exs --- .../admin_api/controllers/media_proxy_cache_controller_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 81e20d001..42a3c0dd8 100644 --- a/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs +++ b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -93,7 +93,7 @@ test "deleted MediaProxy URLs from banned", %{conn: conn} do end end - describe "PURGE /api/pleroma/admin/media_proxy_caches/purge" do + 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", From 11b22a42293ec2ac0e66897bf4b29b5363913c19 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:58:33 +0000 Subject: [PATCH 382/492] Apply suggestion to test/web/media_proxy/invalidations/http_test.exs --- test/web/media_proxy/invalidations/http_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/web/media_proxy/invalidations/http_test.exs b/test/web/media_proxy/invalidations/http_test.exs index 09e7ca0fb..9d181dd8b 100644 --- a/test/web/media_proxy/invalidations/http_test.exs +++ b/test/web/media_proxy/invalidations/http_test.exs @@ -7,7 +7,6 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do setup do on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) - :ok end test "logs hasn't error message when request is valid" do From 2991aae4c4e4ae430539c1e6fac53fb8a0c991e9 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:58:38 +0000 Subject: [PATCH 383/492] Apply suggestion to test/web/media_proxy/invalidations/script_test.exs --- test/web/media_proxy/invalidations/script_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/web/media_proxy/invalidations/script_test.exs b/test/web/media_proxy/invalidations/script_test.exs index c69cec07a..8e155b705 100644 --- a/test/web/media_proxy/invalidations/script_test.exs +++ b/test/web/media_proxy/invalidations/script_test.exs @@ -6,7 +6,6 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.ScriptTest do setup do on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) - :ok end test "it logger error when script not found" do From 078d687e6ed66f921d7f54114f2dc6bf4abbf237 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 12:58:50 +0000 Subject: [PATCH 384/492] Apply suggestion to test/web/media_proxy/media_proxy_controller_test.exs --- test/web/media_proxy/media_proxy_controller_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/web/media_proxy/media_proxy_controller_test.exs b/test/web/media_proxy/media_proxy_controller_test.exs index 2b6b25221..72da98a6a 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -12,7 +12,6 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do setup do on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) - :ok end test "it returns 404 when MediaProxy disabled", %{conn: conn} do From 44ce97a9c9e90d5906386d1b51dea144cd258c32 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 13:12:32 +0000 Subject: [PATCH 385/492] Apply suggestion to lib/pleroma/web/media_proxy/invalidations/script.ex --- lib/pleroma/web/media_proxy/invalidations/script.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy/invalidations/script.ex b/lib/pleroma/web/media_proxy/invalidations/script.ex index 0217b119d..b0f44e8e2 100644 --- a/lib/pleroma/web/media_proxy/invalidations/script.ex +++ b/lib/pleroma/web/media_proxy/invalidations/script.ex @@ -10,7 +10,7 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Script do require Logger @impl Pleroma.Web.MediaProxy.Invalidation - def purge(urls, opts \\ %{}) do + def purge(urls, opts \\ []) do args = urls |> List.wrap() From 9a371bf5f6245b0f372bec7af15e2f4fc41d4ab7 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 13:12:38 +0000 Subject: [PATCH 386/492] Apply suggestion to lib/pleroma/web/media_proxy/invalidations/script.ex --- lib/pleroma/web/media_proxy/invalidations/script.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy/invalidations/script.ex b/lib/pleroma/web/media_proxy/invalidations/script.ex index b0f44e8e2..d32ffc50b 100644 --- a/lib/pleroma/web/media_proxy/invalidations/script.ex +++ b/lib/pleroma/web/media_proxy/invalidations/script.ex @@ -18,7 +18,7 @@ def purge(urls, opts \\ []) do |> Enum.join(" ") opts - |> Keyword.get(:script_path, nil) + |> Keyword.get(:script_path) |> do_purge([args]) |> handle_result(urls) end From 96493da7bdab4ff4a51cbebf18df4127ddc47990 Mon Sep 17 00:00:00 2001 From: Maksim <parallel588@gmail.com> Date: Wed, 17 Jun 2020 13:14:01 +0000 Subject: [PATCH 387/492] Apply suggestion to test/web/media_proxy/invalidation_test.exs --- test/web/media_proxy/invalidation_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/web/media_proxy/invalidation_test.exs b/test/web/media_proxy/invalidation_test.exs index 3a9fa8c88..bf9af251c 100644 --- a/test/web/media_proxy/invalidation_test.exs +++ b/test/web/media_proxy/invalidation_test.exs @@ -13,7 +13,6 @@ defmodule Pleroma.Web.MediaProxy.InvalidationTest do setup do on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) - :ok end describe "Invalidation.Http" do From d4b5a9730e8fe7adf5a2eca15bf40fafff85f30d Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn <egor@kislitsyn.com> Date: Wed, 17 Jun 2020 18:47:59 +0400 Subject: [PATCH 388/492] Remove `poll` from `notification_type` OpenAPI spec --- lib/pleroma/web/api_spec/operations/notification_operation.ex | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex index c966b553a..41328b5f2 100644 --- a/lib/pleroma/web/api_spec/operations/notification_operation.ex +++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex @@ -183,7 +183,6 @@ defp notification_type do "favourite", "reblog", "mention", - "poll", "pleroma:emoji_reaction", "pleroma:chat_mention", "move", From 71a5d9bffb33d9424ea28900ea006678617e0096 Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Wed, 17 Jun 2020 12:54:02 -0500 Subject: [PATCH 389/492] Empty list as default --- lib/pleroma/web/media_proxy/invalidations/http.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/media_proxy/invalidations/http.ex b/lib/pleroma/web/media_proxy/invalidations/http.ex index 3694b56e8..bb81d8888 100644 --- a/lib/pleroma/web/media_proxy/invalidations/http.ex +++ b/lib/pleroma/web/media_proxy/invalidations/http.ex @@ -9,7 +9,7 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.Http do require Logger @impl Pleroma.Web.MediaProxy.Invalidation - def purge(urls, opts) do + def purge(urls, opts \\ []) do method = Keyword.get(opts, :method, :purge) headers = Keyword.get(opts, :headers, []) options = Keyword.get(opts, :options, []) From c08c9db0c137d36896910194a6dc50a391a8fee2 Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Wed, 17 Jun 2020 13:02:01 -0500 Subject: [PATCH 390/492] Remove misleading is_ prefix from boolean function --- lib/pleroma/web/media_proxy/media_proxy.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 59ca217ab..3dccd6b7f 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -37,15 +37,15 @@ def url(url) when is_nil(url) or url == "", do: nil def url("/" <> _ = url), do: url def url(url) do - if disabled?() or not is_url_proxiable?(url) do + if disabled?() or not url_proxiable?(url) do url else encode_url(url) end end - @spec is_url_proxiable?(String.t()) :: boolean() - def is_url_proxiable?(url) do + @spec url_proxiable?(String.t()) :: boolean() + def url_proxiable?(url) do if local?(url) or whitelisted?(url) do false else From 2731ea1334c2c91315465659a0874829cb9e1e11 Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Wed, 17 Jun 2020 13:13:55 -0500 Subject: [PATCH 391/492] Change references from "deleted_urls" to "banned_urls" as nothing is handled via media deletions anymore; all actions are manual operations by an admin to ban the url --- lib/pleroma/application.ex | 2 +- lib/pleroma/plugs/uploaded_media.ex | 10 ++++---- .../media_proxy_cache_controller.ex | 6 ++--- lib/pleroma/web/media_proxy/media_proxy.ex | 20 ++++++++-------- .../web/media_proxy/media_proxy_controller.ex | 4 ++-- .../media_proxy_cache_controller_test.exs | 24 +++++++++---------- test/web/media_proxy/invalidation_test.exs | 14 +++++------ .../media_proxy_controller_test.exs | 6 ++--- 8 files changed, 43 insertions(+), 43 deletions(-) diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index adebebc7a..4a21bf138 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -149,7 +149,7 @@ defp cachex_children do 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("deleted_urls", default_ttl: :timer.hours(24 * 30), limit: 5_000) + build_cachex("banned_urls", default_ttl: :timer.hours(24 * 30), limit: 5_000) ] end diff --git a/lib/pleroma/plugs/uploaded_media.ex b/lib/pleroma/plugs/uploaded_media.ex index 2f3fde002..40984cfc0 100644 --- a/lib/pleroma/plugs/uploaded_media.ex +++ b/lib/pleroma/plugs/uploaded_media.ex @@ -49,7 +49,7 @@ def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) do with uploader <- Keyword.fetch!(config, :uploader), proxy_remote = Keyword.get(config, :proxy_remote, false), {:ok, get_method} <- uploader.get_file(file), - false <- media_is_deleted(conn, get_method) do + false <- media_is_banned(conn, get_method) do get_media(conn, get_method, proxy_remote, opts) else _ -> @@ -61,13 +61,13 @@ def call(%{request_path: <<"/", @path, "/", file::binary>>} = conn, opts) do def call(conn, _opts), do: conn - defp media_is_deleted(%{request_path: path} = _conn, {:static_dir, _}) do - MediaProxy.in_deleted_urls(Pleroma.Web.base_url() <> path) + defp media_is_banned(%{request_path: path} = _conn, {:static_dir, _}) do + MediaProxy.in_banned_urls(Pleroma.Web.base_url() <> path) end - defp media_is_deleted(_, {:url, url}), do: MediaProxy.in_deleted_urls(url) + defp media_is_banned(_, {:url, url}), do: MediaProxy.in_banned_urls(url) - defp media_is_deleted(_, _), do: false + defp media_is_banned(_, _), do: false defp get_media(conn, {:static_dir, directory}, _, opts) do static_opts = 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 index e3fa0ac28..e2759d59f 100644 --- a/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/media_proxy_cache_controller.ex @@ -27,7 +27,7 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheController do def index(%{assigns: %{user: _}} = conn, params) do cursor = - :deleted_urls_cache + :banned_urls_cache |> :ets.table([{:traverse, {:select, Cachex.Query.create(true, :key)}}]) |> :qlc.cursor() @@ -47,7 +47,7 @@ def index(%{assigns: %{user: _}} = conn, params) do end def delete(%{assigns: %{user: _}, body_params: %{urls: urls}} = conn, _) do - MediaProxy.remove_from_deleted_urls(urls) + MediaProxy.remove_from_banned_urls(urls) render(conn, "index.json", urls: urls) end @@ -55,7 +55,7 @@ def purge(%{assigns: %{user: _}, body_params: %{urls: urls, ban: ban}} = conn, _ MediaProxy.Invalidation.purge(urls) if ban do - MediaProxy.put_in_deleted_urls(urls) + MediaProxy.put_in_banned_urls(urls) end render(conn, "index.json", urls: urls) diff --git a/lib/pleroma/web/media_proxy/media_proxy.ex b/lib/pleroma/web/media_proxy/media_proxy.ex index 3dccd6b7f..077fabe47 100644 --- a/lib/pleroma/web/media_proxy/media_proxy.ex +++ b/lib/pleroma/web/media_proxy/media_proxy.ex @@ -10,27 +10,27 @@ defmodule Pleroma.Web.MediaProxy do @base64_opts [padding: false] - @spec in_deleted_urls(String.t()) :: boolean() - def in_deleted_urls(url), do: elem(Cachex.exists?(:deleted_urls_cache, url(url)), 1) + @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_deleted_urls(urls) when is_list(urls) do - Cachex.execute!(:deleted_urls_cache, fn cache -> + 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_deleted_urls(url) when is_binary(url) do - Cachex.del(:deleted_urls_cache, url(url)) + def remove_from_banned_urls(url) when is_binary(url) do + Cachex.del(:banned_urls_cache, url(url)) end - def put_in_deleted_urls(urls) when is_list(urls) do - Cachex.execute!(:deleted_urls_cache, fn cache -> + 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_deleted_urls(url) when is_binary(url) do - Cachex.put(:deleted_urls_cache, url(url), true) + 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 diff --git a/lib/pleroma/web/media_proxy/media_proxy_controller.ex b/lib/pleroma/web/media_proxy/media_proxy_controller.ex index ff0158d83..9a64b0ef3 100644 --- a/lib/pleroma/web/media_proxy/media_proxy_controller.ex +++ b/lib/pleroma/web/media_proxy/media_proxy_controller.ex @@ -14,11 +14,11 @@ def remote(conn, %{"sig" => sig64, "url" => url64} = params) do with config <- Pleroma.Config.get([:media_proxy], []), true <- Keyword.get(config, :enabled, false), {:ok, url} <- MediaProxy.decode_url(sig64, url64), - {_, false} <- {:in_deleted_urls, MediaProxy.in_deleted_urls(url)}, + {_, false} <- {:in_banned_urls, MediaProxy.in_banned_urls(url)}, :ok <- filename_matches(params, conn.request_path, url) do ReverseProxy.call(conn, url, Keyword.get(config, :proxy_opts, @default_proxy_opts)) else - error when error in [false, {:in_deleted_urls, true}] -> + error when error in [false, {:in_banned_urls, true}] -> send_resp(conn, 404, Plug.Conn.Status.reason_phrase(404)) {:error, :invalid_signature} -> 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 index 42a3c0dd8..5ab6cb78a 100644 --- a/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs +++ b/test/web/admin_api/controllers/media_proxy_cache_controller_test.exs @@ -13,7 +13,7 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do setup do: clear_config([:media_proxy]) setup do - on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) end setup do @@ -34,14 +34,14 @@ defmodule Pleroma.Web.AdminAPI.MediaProxyCacheControllerTest do describe "GET /api/pleroma/admin/media_proxy_caches" do test "shows banned MediaProxy URLs", %{conn: conn} do - MediaProxy.put_in_deleted_urls([ + MediaProxy.put_in_banned_urls([ "http://localhost:4001/media/a688346.jpg", "http://localhost:4001/media/fb1f4d.jpg" ]) - MediaProxy.put_in_deleted_urls("http://localhost:4001/media/gb1f44.jpg") - MediaProxy.put_in_deleted_urls("http://localhost:4001/media/tb13f47.jpg") - MediaProxy.put_in_deleted_urls("http://localhost:4001/media/wb1f46.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 @@ -74,7 +74,7 @@ test "shows banned MediaProxy URLs", %{conn: conn} do describe "POST /api/pleroma/admin/media_proxy_caches/delete" do test "deleted MediaProxy URLs from banned", %{conn: conn} do - MediaProxy.put_in_deleted_urls([ + MediaProxy.put_in_banned_urls([ "http://localhost:4001/media/a688346.jpg", "http://localhost:4001/media/fb1f4d.jpg" ]) @@ -88,8 +88,8 @@ test "deleted MediaProxy URLs from banned", %{conn: conn} do |> json_response_and_validate_schema(200) assert response["urls"] == ["http://localhost:4001/media/a688346.jpg"] - refute MediaProxy.in_deleted_urls("http://localhost:4001/media/a688346.jpg") - assert MediaProxy.in_deleted_urls("http://localhost:4001/media/fb1f4d.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 @@ -114,8 +114,8 @@ test "perform invalidates cache of MediaProxy", %{conn: conn} do assert response["urls"] == urls - refute MediaProxy.in_deleted_urls("http://example.com/media/a688346.jpg") - refute MediaProxy.in_deleted_urls("http://example.com/media/fb1f4d.jpg") + refute MediaProxy.in_banned_urls("http://example.com/media/a688346.jpg") + refute MediaProxy.in_banned_urls("http://example.com/media/fb1f4d.jpg") end end @@ -137,8 +137,8 @@ test "perform invalidates cache of MediaProxy and adds url to banned", %{conn: c assert response["urls"] == urls - assert MediaProxy.in_deleted_urls("http://example.com/media/a688346.jpg") - assert MediaProxy.in_deleted_urls("http://example.com/media/fb1f4d.jpg") + 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 diff --git a/test/web/media_proxy/invalidation_test.exs b/test/web/media_proxy/invalidation_test.exs index bf9af251c..926ae74ca 100644 --- a/test/web/media_proxy/invalidation_test.exs +++ b/test/web/media_proxy/invalidation_test.exs @@ -12,7 +12,7 @@ defmodule Pleroma.Web.MediaProxy.InvalidationTest do setup do: clear_config([:media_proxy]) setup do - on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) end describe "Invalidation.Http" do @@ -23,7 +23,7 @@ test "perform request to clear cache" do Config.put([Invalidation.Http], method: :purge, headers: [{"x-refresh", 1}]) image_url = "http://example.com/media/example.jpg" - Pleroma.Web.MediaProxy.put_in_deleted_urls(image_url) + Pleroma.Web.MediaProxy.put_in_banned_urls(image_url) mock(fn %{ @@ -35,9 +35,9 @@ test "perform request to clear cache" do end) assert capture_log(fn -> - assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url) + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) assert Invalidation.purge([image_url]) == {:ok, [image_url]} - assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url) + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) end) =~ "Running cache purge: [\"#{image_url}\"]" end end @@ -50,13 +50,13 @@ test "run script to clear cache" do Config.put([Invalidation.Script], script_path: "purge-nginx") image_url = "http://example.com/media/example.jpg" - Pleroma.Web.MediaProxy.put_in_deleted_urls(image_url) + 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_deleted_urls(image_url) + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) assert Invalidation.purge([image_url]) == {:ok, [image_url]} - assert Pleroma.Web.MediaProxy.in_deleted_urls(image_url) + assert Pleroma.Web.MediaProxy.in_banned_urls(image_url) end) =~ "Running cache purge: [\"#{image_url}\"]" 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 72da98a6a..d61cef83b 100644 --- a/test/web/media_proxy/media_proxy_controller_test.exs +++ b/test/web/media_proxy/media_proxy_controller_test.exs @@ -11,7 +11,7 @@ defmodule Pleroma.Web.MediaProxy.MediaProxyControllerTest do setup do: clear_config([Pleroma.Web.Endpoint, :secret_key_base]) setup do - on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) end test "it returns 404 when MediaProxy disabled", %{conn: conn} do @@ -71,11 +71,11 @@ test "it performs ReverseProxy.call when signature valid", %{conn: conn} do end end - test "it returns 404 when url contains in deleted_urls cache", %{conn: conn} do + 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_deleted_urls("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 From 4044f24e2e4935757e038e7f06373ed1c9172560 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Thu, 18 Jun 2020 05:02:33 +0300 Subject: [PATCH 392/492] fix test --- lib/pleroma/web/media_proxy/invalidation.ex | 3 ++- test/web/media_proxy/invalidations/http_test.exs | 2 +- test/web/media_proxy/invalidations/script_test.exs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/media_proxy/invalidation.ex b/lib/pleroma/web/media_proxy/invalidation.ex index 6da7eb720..5808861e6 100644 --- a/lib/pleroma/web/media_proxy/invalidation.ex +++ b/lib/pleroma/web/media_proxy/invalidation.ex @@ -26,7 +26,8 @@ def purge(urls) do defp do_purge(urls) do provider = Config.get([:media_proxy, :invalidation, :provider]) - provider.purge(urls, Config.get(provider)) + options = Config.get(provider) + provider.purge(urls, options) end def prepare_urls(urls) do diff --git a/test/web/media_proxy/invalidations/http_test.exs b/test/web/media_proxy/invalidations/http_test.exs index 9d181dd8b..a1bef5237 100644 --- a/test/web/media_proxy/invalidations/http_test.exs +++ b/test/web/media_proxy/invalidations/http_test.exs @@ -6,7 +6,7 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.HttpTest do import Tesla.Mock setup do - on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) end test "logs hasn't error message when request is valid" do diff --git a/test/web/media_proxy/invalidations/script_test.exs b/test/web/media_proxy/invalidations/script_test.exs index 8e155b705..51833ab18 100644 --- a/test/web/media_proxy/invalidations/script_test.exs +++ b/test/web/media_proxy/invalidations/script_test.exs @@ -5,7 +5,7 @@ defmodule Pleroma.Web.MediaProxy.Invalidation.ScriptTest do import ExUnit.CaptureLog setup do - on_exit(fn -> Cachex.clear(:deleted_urls_cache) end) + on_exit(fn -> Cachex.clear(:banned_urls_cache) end) end test "it logger error when script not found" do From c9b5e3fedabd0b6ef3bb9e6108385ffa3857af54 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Thu, 18 Jun 2020 05:29:31 +0300 Subject: [PATCH 393/492] revert 'database' option to rejected keys --- lib/pleroma/config/loader.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pleroma/config/loader.ex b/lib/pleroma/config/loader.ex index 76559e70c..0f3ecf1ed 100644 --- a/lib/pleroma/config/loader.ex +++ b/lib/pleroma/config/loader.ex @@ -8,6 +8,7 @@ defmodule Pleroma.Config.Loader do Pleroma.Web.Endpoint, :env, :configurable_from_database, + :database, :swarm ] From e4c61f1741f32fec3201f7d9a8403bc1bc329710 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Thu, 18 Jun 2020 05:45:15 +0300 Subject: [PATCH 394/492] added test --- test/fixtures/config/temp.secret.exs | 2 ++ test/tasks/config_test.exs | 1 + 2 files changed, 3 insertions(+) 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 :pleroma, Pleroma.Repo, pool: Ecto.Adapters.SQL.Sandbox config :postgrex, :json_library, Poison + +config :pleroma, :database, rum_enabled: true diff --git a/test/tasks/config_test.exs b/test/tasks/config_test.exs index e1bddfebf..99038e544 100644 --- a/test/tasks/config_test.exs +++ b/test/tasks/config_test.exs @@ -50,6 +50,7 @@ test "filtered settings are migrated to db" 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 config1.value == [key: "value", key2: [Repo]] assert config2.value == [key: "value2", key2: ["Activity"]] From 3becdafd335f95d9320d287ecf9a55ea1b1765cd Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Thu, 18 Jun 2020 14:32:21 +0300 Subject: [PATCH 395/492] emoji packs pagination --- lib/pleroma/emoji/pack.ex | 19 ++++++++++++---- .../pleroma_emoji_pack_operation.ex | 14 ++++++++++++ .../controllers/emoji_pack_controller.ex | 4 ++-- .../emoji_pack_controller_test.exs | 22 +++++++++++++++++++ 4 files changed, 53 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 14a5185be..5660c4c9d 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -16,7 +16,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), @@ -120,8 +120,8 @@ def list_remote(url) do end end - @spec list_local() :: {:ok, map()} - def list_local do + @spec list_local(keyword()) :: {:ok, map()} + def list_local(opts) do with {:ok, results} <- list_packs_dir() do packs = results @@ -132,6 +132,17 @@ def list_local do end end) |> Enum.reject(&is_nil/1) + + packs = + case opts[:page] do + 1 -> + Enum.take(packs, opts[:page_size]) + + _ -> + packs + |> Enum.take(opts[:page] * opts[:page_size]) + |> Enum.take(-opts[:page_size]) + end |> Map.new(fn pack -> {pack.name, validate_pack(pack)} end) {:ok, packs} @@ -146,7 +157,7 @@ def get_archive(name) 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() 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..0d842382b 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 @@ def index_operation 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 statuses to return" + ) + ], responses: %{ 200 => emoji_packs_response() } 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 d1efdeb5d..5654b3fbe 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -37,13 +37,13 @@ def remote(conn, %{url: url}) 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 + with {:ok, packs} <- Pack.list_local(page: params.page, page_size: params.page_size) do json(conn, packs) else {:error, :create_dir, e} -> 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..aafca6359 100644 --- a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -39,6 +39,28 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do non_shared = resp["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) + + [pack1] = Map.keys(resp) + + resp = + conn + |> get("/api/pleroma/emoji/packs?page_size=1&page=2") + |> json_response_and_validate_schema(200) + + [pack2] = Map.keys(resp) + + resp = + conn + |> get("/api/pleroma/emoji/packs?page_size=1&page=3") + |> json_response_and_validate_schema(200) + + [pack3] = Map.keys(resp) + assert [pack1, pack2, pack3] |> Enum.uniq() |> length() == 3 end describe "GET /api/pleroma/emoji/packs/remote" do From 4975ed86bcca330373a68c9e6c6798a6b2167b14 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Thu, 18 Jun 2020 18:50:03 +0300 Subject: [PATCH 396/492] emoji pagination for pack show action --- docs/API/pleroma_api.md | 12 ++- lib/pleroma/emoji/pack.ex | 37 +++++---- .../pleroma_emoji_pack_operation.ex | 16 +++- .../controllers/emoji_pack_controller.ex | 4 +- .../emoji/test_pack/blank2.png | Bin 0 -> 95 bytes .../instance_static/emoji/test_pack/pack.json | 3 +- .../emoji/test_pack_nonshared/nonshared.zip | Bin 256 -> 548 bytes .../emoji/test_pack_nonshared/pack.json | 2 +- .../emoji_pack_controller_test.exs | 72 +++++++++++++----- 9 files changed, 104 insertions(+), 42 deletions(-) create mode 100644 test/instance_static/emoji/test_pack/blank2.png diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index 70d4755b7..d8d3ba85f 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -450,17 +450,25 @@ 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 +* Params: + * `page`: page number for packs (default 1) + * `page_size`: page size for packs (default 50) * Response: JSON, "ok" and 200 status and the JSON hashmap of pack name to pack contents ## `GET /api/pleroma/emoji/packs/:name` + ### Get pack.json for the pack + * Method `GET` * Authentication: not required -* Params: None +* Params: + * `page`: page number for files (default 1) + * `page_size`: page size for files (default 50) * Response: JSON, pack json with `files` and `pack` keys with 200 status or 404 if the pack does not exist ## `GET /api/pleroma/emoji/packs/:name/archive` diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 5660c4c9d..c033572c1 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -26,10 +26,27 @@ def create(name) 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.take(page * page_size) + |> Enum.take(-page_size) + 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() + |> paginate(opts[:page], opts[:page_size]) + + pack = Map.put(pack, :files, Map.take(pack.files, shortcodes)) + {:ok, validate_pack(pack)} end end @@ -132,17 +149,7 @@ def list_local(opts) do end end) |> Enum.reject(&is_nil/1) - - packs = - case opts[:page] do - 1 -> - Enum.take(packs, opts[:page_size]) - - _ -> - packs - |> Enum.take(opts[:page] * opts[:page_size]) - |> Enum.take(-opts[:page_size]) - end + |> paginate(opts[:page], opts[:page_size]) |> Map.new(fn pack -> {pack.name, validate_pack(pack)} end) {:ok, packs} @@ -307,7 +314,9 @@ defp downloadable?(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 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 0d842382b..e8abe654d 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 @@ -58,7 +58,21 @@ def show_operation 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: 50}, + "Number of statuses 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/pleroma_api/controllers/emoji_pack_controller.ex b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex index 5654b3fbe..078fb88dd 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -60,10 +60,10 @@ def index(conn, params) 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} -> 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 0000000000000000000000000000000000000000..8f50fa02340e7e09e562f86e00b6e4bd6ad1d565 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^4Is=2Bp6=1#-sr$rjj7PU<QV=$!9HqJPA)1$B+uf q<ORkOtcw#wdYS?axZDnEFfed5Ffe}4nR*bYhQZU-&t;ucLK6U?=oVoB literal 0 HcmV?d00001 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 148446c642ea24b494bc3e25ccd772faaf2f2a13..59bff37f0895f17fecf4285015c5dcd18fcc8b35 100644 GIT binary patch literal 548 zcmWIWW@Zs#-~hstas2)aP!JEKIT;ifl5!IBvh@n`(nCXd8Q6EphQ<a|ypHn$;?fFk z21b^zj0_Aw?F<aBc|H_Be>&+=QbNLmuU`r{nJ)1voZ(QBh}(T^38Ut+NecTD*xELo zOxJC&;q(_jK7s4l6V_uwYr2J9s%A0q?zqF3WnfTXVqj2rerA=xlFOH`o==?{>?F(( z;LXkvAKoY$0ki|;r~sVK<$^ia2*th8K(|H>q<a~eM3@l)jO-Us0K>qNMi7hW;12M{ gZ7e7tU|>n(dYG|91xtW8D;r2J6A*%Q#xsI=0P0(p8vp<R delta 152 zcmZ3&(!k^x;LXe;!oa}5!EiE;-#<RQQ8WU`iw9y(1{sE=oW#6ry@I^-&=5`r=3TO( zv8RBzw1S&~k>v$50|Stl=o%x-$Rx*%%Mgjlb&OIvtPtHOIvE%Oyjj_RHZd>)p+AtG I4dO5W0E3SliU0rr 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/web/pleroma_api/controllers/emoji_pack_controller_test.exs b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs index aafca6359..f6239cae5 100644 --- a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -31,7 +31,7 @@ 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 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"] @@ -354,7 +354,7 @@ test "for a pack with a fallback source", ctx do Map.put( new_data, "fallback-src-sha256", - "74409E2674DAA06C072729C6C8426C4CB3B7E0B85ED77792DB7A436E11D76DAF" + "1967BB4E42BCC34BCC12D57BE7811D3B7BE52F965BCE45C87BD377B9499CE11D" ) assert ctx[:admin_conn] @@ -420,7 +420,7 @@ test "don't rewrite old emoji", %{admin_conn: admin_conn} 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", @@ -429,7 +429,8 @@ test "don't rewrite old emoji", %{admin_conn: admin_conn} 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") @@ -453,7 +454,7 @@ test "rewrite old emoji with force option", %{admin_conn: admin_conn} 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", @@ -462,7 +463,8 @@ test "rewrite old emoji with force option", %{admin_conn: admin_conn} 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") @@ -470,14 +472,15 @@ test "rewrite old emoji with force option", %{admin_conn: admin_conn} 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") @@ -503,7 +506,7 @@ test "add file with not loaded pack", %{admin_conn: admin_conn} 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", @@ -557,7 +560,8 @@ test "new with shortcode as file with update", %{admin_conn: admin_conn} 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") @@ -571,7 +575,8 @@ test "new with shortcode as file with update", %{admin_conn: admin_conn} 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/") @@ -579,7 +584,10 @@ test "new with shortcode as file with update", %{admin_conn: admin_conn} 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/") @@ -603,7 +611,8 @@ test "new with shortcode from url", %{admin_conn: admin_conn} 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") @@ -624,15 +633,16 @@ test "new without shortcode", %{admin_conn: admin_conn} 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 @@ -640,12 +650,12 @@ test "update non existing emoji", %{admin_conn: admin_conn} 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 @@ -768,7 +778,7 @@ test "filesystem import", %{admin_conn: admin_conn, conn: conn} do describe "GET /api/pleroma/emoji/packs/:name" do test "shows pack.json", %{conn: conn} do assert %{ - "files" => %{"blank" => "blank.png"}, + "files" => files, "pack" => %{ "can-download" => true, "description" => "Test description", @@ -781,6 +791,26 @@ test "shows pack.json", %{conn: conn} 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 + } = + 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 + } = + 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 From 3e3f9253e6db17b691c7393ad7a5f89df84348ea Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Fri, 19 Jun 2020 10:17:24 +0300 Subject: [PATCH 397/492] adding overall count for packs and files --- docs/API/pleroma_api.md | 22 ++++++++++++-- lib/pleroma/emoji/pack.ex | 20 +++++++++---- .../controllers/emoji_pack_controller.ex | 4 +-- .../emoji_pack_controller_test.exs | 30 ++++++++++++------- 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index d8d3ba85f..e5bc29eb2 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -458,7 +458,17 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * Params: * `page`: page number for packs (default 1) * `page_size`: page size for packs (default 50) -* Response: JSON, "ok" and 200 status and the JSON hashmap of pack name to pack contents +* 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` @@ -469,7 +479,15 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * Params: * `page`: page number for files (default 1) * `page_size`: page size for files (default 50) -* Response: JSON, pack json with `files` and `pack` keys with 200 status or 404 if the pack does not exist +* 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 diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index c033572c1..2dca21c93 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(), @@ -137,10 +139,10 @@ def list_remote(url) do end end - @spec list_local(keyword()) :: {:ok, map()} + @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 @@ -149,10 +151,13 @@ def list_local(opts) 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 @@ -215,7 +220,12 @@ def load_pack(name) 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 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 078fb88dd..33ecd1f70 100644 --- a/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex @@ -43,8 +43,8 @@ def index(conn, params) do |> Pleroma.Config.get!() |> Path.join("emoji") - with {:ok, packs} <- Pack.list_local(page: params.page, page_size: params.page_size) 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 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 f6239cae5..91312c832 100644 --- a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -30,13 +30,14 @@ 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 resp["count"] == 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 @@ -45,21 +46,24 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do |> get("/api/pleroma/emoji/packs?page_size=1") |> json_response_and_validate_schema(200) - [pack1] = Map.keys(resp) + assert resp["count"] == 3 + [pack1] = Map.keys(resp["packs"]) resp = conn |> get("/api/pleroma/emoji/packs?page_size=1&page=2") |> json_response_and_validate_schema(200) - [pack2] = Map.keys(resp) + assert resp["count"] == 3 + [pack2] = Map.keys(resp["packs"]) resp = conn |> get("/api/pleroma/emoji/packs?page_size=1&page=3") |> json_response_and_validate_schema(200) - [pack3] = Map.keys(resp) + assert resp["count"] == 3 + [pack3] = Map.keys(resp["packs"]) assert [pack1, pack2, pack3] |> Enum.uniq() |> length() == 3 end @@ -683,7 +687,8 @@ test "creating and deleting a pack", %{admin_conn: admin_conn} do assert Jason.decode!(File.read!("#{@emoji_path}/test_created/pack.json")) == %{ "pack" => %{}, - "files" => %{} + "files" => %{}, + "files_count" => 0 } assert admin_conn @@ -741,14 +746,14 @@ test "filesystem import", %{admin_conn: admin_conn, conn: conn} 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") @@ -768,7 +773,7 @@ test "filesystem import", %{admin_conn: admin_conn, conn: conn} 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" @@ -779,6 +784,7 @@ test "filesystem import", %{admin_conn: admin_conn, conn: conn} do test "shows pack.json", %{conn: conn} do assert %{ "files" => files, + "files_count" => 2, "pack" => %{ "can-download" => true, "description" => "Test description", @@ -795,7 +801,8 @@ test "shows pack.json", %{conn: conn} do assert files == %{"blank" => "blank.png", "blank2" => "blank2.png"} assert %{ - "files" => files + "files" => files, + "files_count" => 2 } = conn |> get("/api/pleroma/emoji/packs/test_pack?page_size=1") @@ -804,7 +811,8 @@ test "shows pack.json", %{conn: conn} do assert files |> Map.keys() |> length() == 1 assert %{ - "files" => files + "files" => files, + "files_count" => 2 } = conn |> get("/api/pleroma/emoji/packs/test_pack?page_size=1&page=2") From 0c739b423aad4cc6baa3a59308200ca5a5060716 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Fri, 19 Jun 2020 12:31:55 +0300 Subject: [PATCH 398/492] changelog entry --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ee13904f..ee657de13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **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` @@ -34,6 +35,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - 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) + <details> <summary>API Changes</summary> - Mastodon API: Extended `/api/v1/instance`. From 02ca8a363f738ece7b605940690f6a538f6c2fa8 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Fri, 19 Jun 2020 14:46:38 +0300 Subject: [PATCH 399/492] default page size for files --- docs/API/pleroma_api.md | 2 +- .../web/api_spec/operations/pleroma_emoji_pack_operation.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/API/pleroma_api.md b/docs/API/pleroma_api.md index e5bc29eb2..b7eee5192 100644 --- a/docs/API/pleroma_api.md +++ b/docs/API/pleroma_api.md @@ -478,7 +478,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa * Authentication: not required * Params: * `page`: page number for files (default 1) - * `page_size`: page size for files (default 50) + * `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 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 e8abe654d..da7cc5154 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 @@ -69,7 +69,7 @@ def show_operation do Operation.parameter( :page_size, :query, - %Schema{type: :integer, default: 50}, + %Schema{type: :integer, default: 30}, "Number of statuses to return" ) ], From 5237a2df9f123f661de30a53193b7d9fec69ecae Mon Sep 17 00:00:00 2001 From: Ivan Tashkinov <ivantashkinov@gmail.com> Date: Fri, 19 Jun 2020 16:14:06 +0300 Subject: [PATCH 400/492] [#1873] Fixes missing :offset pagination param support. Added pagination support for hashtags search. --- lib/pleroma/pagination.ex | 6 ++++ lib/pleroma/web/api_spec/helpers.ex | 6 ++++ .../controllers/search_controller.ex | 31 ++++++++++++------- .../controllers/search_controller_test.exs | 16 ++++++++++ .../controllers/status_controller_test.exs | 2 +- 5 files changed, 48 insertions(+), 13 deletions(-) diff --git a/lib/pleroma/pagination.ex b/lib/pleroma/pagination.ex index 1b99e44f9..9a3795769 100644 --- a/lib/pleroma/pagination.ex +++ b/lib/pleroma/pagination.ex @@ -64,6 +64,12 @@ def fetch_paginated(query, params, :offset, table_binding) 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) 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 @@ def pagination_params 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/mastodon_api/controllers/search_controller.ex b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex index 3be0ca095..e50980122 100644 --- a/lib/pleroma/web/mastodon_api/controllers/search_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/search_controller.ex @@ -107,21 +107,21 @@ defp resource_search(_, "statuses", query, options) 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 -> %{name: tag, url: tags_path <> tag} end) end - defp resource_search(:v1, "hashtags", query, _options) do - prepare_tags(query) + defp resource_search(:v1, "hashtags", query, options) do + prepare_tags(query, options) end - defp prepare_tags(query, add_joined_tag \\ true) do + defp prepare_tags(query, options) do tags = query |> preprocess_uri_query() @@ -139,13 +139,20 @@ defp prepare_tags(query, add_joined_tag \\ true) do tags = Enum.map(tags, fn tag -> String.trim_leading(tag, "#") end) - if Enum.empty?(explicit_tags) && add_joined_tag do - tags - |> Kernel.++([joined_tag(tags)]) - |> Enum.uniq_by(&String.downcase/1) - else - tags - 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` diff --git a/test/web/mastodon_api/controllers/search_controller_test.exs b/test/web/mastodon_api/controllers/search_controller_test.exs index c605957b1..826f37fbc 100644 --- a/test/web/mastodon_api/controllers/search_controller_test.exs +++ b/test/web/mastodon_api/controllers/search_controller_test.exs @@ -151,6 +151,22 @@ test "constructs hashtags from search query", %{conn: conn} do ] 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"}) diff --git a/test/web/mastodon_api/controllers/status_controller_test.exs b/test/web/mastodon_api/controllers/status_controller_test.exs index 648e6f2ce..a98e939e8 100644 --- a/test/web/mastodon_api/controllers/status_controller_test.exs +++ b/test/web/mastodon_api/controllers/status_controller_test.exs @@ -1561,7 +1561,7 @@ test "favorites paginate correctly" do # Using the header for pagination works correctly [next, _] = get_resp_header(result, "link") |> hd() |> String.split(", ") - [_, max_id] = Regex.run(~r/max_id=(.*)>;/, next) + [_, max_id] = Regex.run(~r/max_id=([^&]+)/, next) assert max_id == third_favorite.id From abdb540d450b5e68ea452f78d865d63bca764a49 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Fri, 19 Jun 2020 15:30:30 +0200 Subject: [PATCH 401/492] ObjectValidators: Add basic UpdateValidator. --- lib/pleroma/web/activity_pub/builder.ex | 15 +++++++ .../web/activity_pub/object_validator.ex | 11 +++++ .../object_validators/update_validator.ex | 43 +++++++++++++++++++ .../activity_pub/object_validator_test.exs | 20 +++++++++ 4 files changed, 89 insertions(+) create mode 100644 lib/pleroma/web/activity_pub/object_validators/update_validator.ex diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 1aac62c69..135a5c431 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -123,6 +123,21 @@ def like(actor, object) 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 announce(User.t(), Object.t(), keyword()) :: {:ok, map(), keyword()} def announce(actor, object, options \\ []) do public? = Keyword.get(options, :public, false) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 6a83a2c33..804a9d06e 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -19,10 +19,21 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do alias Pleroma.Web.ActivityPub.ObjectValidators.EmojiReactValidator alias Pleroma.Web.ActivityPub.ObjectValidators.LikeValidator 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" => "Update"} = object, meta) do + with {:ok, object} <- + object + |> UpdateValidator.cast_and_validate() + |> Ecto.Changeset.apply_action(:insert) do + object = stringify_keys(object) + {:ok, object, meta} + end + end + def validate(%{"type" => "Undo"} = object, meta) do with {:ok, object} <- object 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..94d72491b --- /dev/null +++ b/lib/pleroma/web/activity_pub/object_validators/update_validator.ex @@ -0,0 +1,43 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# 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() + end + + def cast_and_validate(data) do + data + |> cast_data + |> validate_data + end +end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 31224abe0..adb56092d 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -622,4 +622,24 @@ test "returns an error if the actor can't announce the object", %{ 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 + end end From d54b0432eae74a830a0294cf48f23933a16382aa Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Fri, 19 Jun 2020 15:49:34 +0200 Subject: [PATCH 402/492] README: Add some troubleshooting info for compilation issues. --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 <https://github.com/angristan/docker-pleroma> or <https://glitch.sh/sn0w/pleroma-docker>. +### 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: <https://docs.pleroma.social> - Latest Git revision: <https://docs-develop.pleroma.social> From 75670a99e46a09f9bddc0959c680c2cb173e1f3b Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Fri, 19 Jun 2020 16:38:57 +0200 Subject: [PATCH 403/492] UpdateValidator: Only allow updates from the user themselves. --- .../object_validators/update_validator.ex | 16 ++++++++++++++++ test/web/activity_pub/object_validator_test.exs | 12 ++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/pleroma/web/activity_pub/object_validators/update_validator.ex b/lib/pleroma/web/activity_pub/object_validators/update_validator.ex index 94d72491b..b4ba5ede0 100644 --- a/lib/pleroma/web/activity_pub/object_validators/update_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/update_validator.ex @@ -33,6 +33,7 @@ def validate_data(cng) do |> 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 @@ -40,4 +41,19 @@ def cast_and_validate(data) do |> 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/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index adb56092d..770a8dcf8 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -641,5 +641,17 @@ test "returns an error if the actor can't announce the object", %{ 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 end From b63646169dbed68814bdb867c4b8b3c88a3d2360 Mon Sep 17 00:00:00 2001 From: Sergey Suprunenko <suprunenko.s@gmail.com> Date: Fri, 19 Jun 2020 21:18:07 +0200 Subject: [PATCH 404/492] Add support for bot field in update_credentials --- CHANGELOG.md | 1 + lib/pleroma/user.ex | 1 + .../controllers/account_controller.ex | 3 + .../update_credentials_test.exs | 67 +++++++++++++++++++ 4 files changed, 72 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ee13904f..8a8798e8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - 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 diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index f0ccc7c79..ae4f96aac 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -465,6 +465,7 @@ def update_changeset(struct, params \\ %{}) 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)}) diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index c38c2b895..adbbac624 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -177,6 +177,9 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p |> 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]) changeset = User.update_changeset(user, user_params) 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 76e6d603a..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 @@ -400,4 +400,71 @@ test "update fields when invalid request", %{conn: conn} 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 From ac0344dd24d520ab61e835b9caea97529f4c1dad Mon Sep 17 00:00:00 2001 From: Sergey Suprunenko <suprunenko.s@gmail.com> Date: Fri, 19 Jun 2020 21:19:00 +0200 Subject: [PATCH 405/492] Only accounts with Service actor_type are considered as bots --- lib/pleroma/web/mastodon_api/views/account_view.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex index 68beb69b8..6c40b8ccd 100644 --- a/lib/pleroma/web/mastodon_api/views/account_view.ex +++ b/lib/pleroma/web/mastodon_api/views/account_view.ex @@ -179,7 +179,7 @@ defp do_render("show.json", %{user: user} = opts) do 0 end - bot = user.actor_type in ["Application", "Service"] + bot = user.actor_type == "Service" emojis = Enum.map(user.emoji, fn {shortcode, raw_url} -> From 3d4cfc9c5f3969e08c32781385c86f310eba70a2 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Thu, 18 Jun 2020 19:32:03 +0200 Subject: [PATCH 406/492] Stop filling conversation field on incoming objects (legacy, unused) conversation field is still set for outgoing federation for compatibility. --- .../web/activity_pub/object_validators/note_validator.ex | 1 - lib/pleroma/web/activity_pub/transmogrifier.ex | 6 +++--- test/web/activity_pub/transmogrifier_test.exs | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) 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 a10728ac6..56b93dde8 100644 --- a/lib/pleroma/web/activity_pub/object_validators/note_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/note_validator.ex @@ -41,7 +41,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.NoteValidator do field(:announcements, {:array, :string}, default: []) # see if needed - field(:conversation, :string) field(:context_id, :string) end diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 851f474b8..1c60ef8f5 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -172,8 +172,8 @@ def fix_in_reply_to(%{"inReplyTo" => in_reply_to} = object, options) 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)}") @@ -207,7 +207,7 @@ def fix_context(object) do object |> Map.put("context", context) - |> Map.put("conversation", context) + |> Map.drop(["conversation"]) end def fix_attachments(%{"attachment" => attachment} = object) when is_list(attachment) do @@ -458,7 +458,7 @@ def handle_incoming( to: data["to"], object: object, actor: user, - context: object["conversation"], + context: object["context"], local: false, published: data["published"], additional: diff --git a/test/web/activity_pub/transmogrifier_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 94d8552e8..47d6e843a 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -1571,9 +1571,6 @@ test "returns modified object when allowed incoming reply", %{data: data} 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 From 1a704e1f1e0acb73cbfb49acc4f614dd01799c46 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sat, 20 Jun 2020 10:56:28 +0300 Subject: [PATCH 407/492] fix for packs pagination --- lib/pleroma/emoji/pack.ex | 6 +++--- .../emoji_pack_controller_test.exs | 20 ++++++++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 2dca21c93..787ff8141 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -32,8 +32,8 @@ defp paginate(entities, 1, page_size), do: Enum.take(entities, page_size) defp paginate(entities, page, page_size) do entities - |> Enum.take(page * page_size) - |> Enum.take(-page_size) + |> Enum.chunk_every(page_size) + |> Enum.at(page - 1) end @spec show(keyword()) :: {:ok, t()} | {:error, atom()} @@ -470,7 +470,7 @@ defp list_packs_dir 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} 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 91312c832..df58a5eb6 100644 --- a/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs +++ b/test/web/pleroma_api/controllers/emoji_pack_controller_test.exs @@ -31,6 +31,11 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do resp = conn |> get("/api/pleroma/emoji/packs") |> json_response_and_validate_schema(200) 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") @@ -47,7 +52,12 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do |> json_response_and_validate_schema(200) assert resp["count"] == 3 - [pack1] = Map.keys(resp["packs"]) + + packs = Map.keys(resp["packs"]) + + assert length(packs) == 1 + + [pack1] = packs resp = conn @@ -55,7 +65,9 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do |> json_response_and_validate_schema(200) assert resp["count"] == 3 - [pack2] = Map.keys(resp["packs"]) + packs = Map.keys(resp["packs"]) + assert length(packs) == 1 + [pack2] = packs resp = conn @@ -63,7 +75,9 @@ test "GET /api/pleroma/emoji/packs", %{conn: conn} do |> json_response_and_validate_schema(200) assert resp["count"] == 3 - [pack3] = Map.keys(resp["packs"]) + packs = Map.keys(resp["packs"]) + assert length(packs) == 1 + [pack3] = packs assert [pack1, pack2, pack3] |> Enum.uniq() |> length() == 3 end From 4cb7b1ebc6b255faae635f6138bf90264e84e1fb Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Sat, 20 Jun 2020 09:34:34 +0000 Subject: [PATCH 408/492] Apply suggestion to lib/mix/tasks/pleroma/config.ex --- lib/mix/tasks/pleroma/config.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mix/tasks/pleroma/config.ex b/lib/mix/tasks/pleroma/config.ex index 65691f9c1..d5129d410 100644 --- a/lib/mix/tasks/pleroma/config.ex +++ b/lib/mix/tasks/pleroma/config.ex @@ -52,7 +52,7 @@ def migrate_to_db(file_path \\ nil) do defp do_migrate_to_db(config_file) do if File.exists?(config_file) do - shell_info("Running migrate settings from file: #{Path.expand(config_file)}") + 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;") From 15ba5392584a2d4e8129a99e825f5025e57e6ebd Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Sat, 20 Jun 2020 11:39:06 +0200 Subject: [PATCH 409/492] =?UTF-8?q?cheatsheet.md:=20no=5Fattachment=5Flink?= =?UTF-8?q?s=20=E2=86=92=20attachment=5Flinks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/configuration/cheatsheet.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 6ebdab546..7e5f1cd29 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -60,7 +60,7 @@ To add configuration to your config file, you can copy it from the base config. 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`). From 0e789bc55fed24fd913d6bf1a5c6be135320b0c9 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Sat, 20 Jun 2020 09:39:50 +0000 Subject: [PATCH 410/492] Apply suggestion to lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex --- .../web/api_spec/operations/pleroma_emoji_pack_operation.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 da7cc5154..caa849721 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 @@ -44,7 +44,7 @@ def index_operation do :page_size, :query, %Schema{type: :integer, default: 50}, - "Number of statuses to return" + "Number of emoji packs to return" ) ], responses: %{ From c5863438ba9079a01a832fe48e203907fe5b37cd Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sat, 20 Jun 2020 13:53:57 +0300 Subject: [PATCH 411/492] proper error codes for error in adminFE --- docs/API/admin_api.md | 54 ++++++++++--------- .../controllers/admin_api_controller.ex | 29 +++++----- .../controllers/fallback_controller.ex | 6 +++ .../controllers/admin_api_controller_test.exs | 4 +- 4 files changed, 50 insertions(+), 43 deletions(-) diff --git a/docs/API/admin_api.md b/docs/API/admin_api.md index c7f56cf5f..b6fb43dcb 100644 --- a/docs/API/admin_api.md +++ b/docs/API/admin_api.md @@ -488,35 +488,39 @@ 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` +* 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: +* Responses: + +Status: 200 ```json {"status": "success"} ``` +Status: 400 + ```json {"errors": {"actor_type": "is invalid"}, @@ -525,8 +529,10 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret } ``` +Status: 404 + ```json -{"error": "Unable to update user."} +{"error": "Not found"} ``` ## `GET /api/pleroma/admin/reports` diff --git a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex index 5cbf0dd4f..db2413dfe 100644 --- a/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/admin_api_controller.ex @@ -111,8 +111,7 @@ def user_delete(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) action: "delete" }) - conn - |> json(nicknames) + json(conn, nicknames) end def user_follow(%{assigns: %{user: admin}} = conn, %{ @@ -131,8 +130,7 @@ def user_follow(%{assigns: %{user: admin}} = conn, %{ }) end - conn - |> json("ok") + json(conn, "ok") end def user_unfollow(%{assigns: %{user: admin}} = conn, %{ @@ -151,8 +149,7 @@ def user_unfollow(%{assigns: %{user: admin}} = conn, %{ }) end - conn - |> json("ok") + json(conn, "ok") end def users_create(%{assigns: %{user: admin}} = conn, %{"users" => users}) do @@ -191,8 +188,7 @@ def users_create(%{assigns: %{user: admin}} = conn, %{"users" => users}) do action: "create" }) - conn - |> json(res) + json(conn, res) {:error, id, changeset, _} -> res = @@ -363,8 +359,8 @@ defp maybe_parse_filters(filters) 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, %{ @@ -568,10 +564,10 @@ def update_user_credentials( {:error, changeset} -> errors = Map.new(changeset.errors, fn {key, {error, _}} -> {key, error} end) - json(conn, %{errors: errors}) + {:errors, errors} _ -> - json(conn, %{error: "Unable to update user."}) + {:error, :not_found} end end @@ -616,7 +612,7 @@ defp configurable_from_database do 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 @@ -630,7 +626,7 @@ def confirm_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames} action: "confirm_email" }) - conn |> json("") + json(conn, "") end def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" => nicknames}) do @@ -644,14 +640,13 @@ def resend_confirmation_email(%{assigns: %{user: admin}} = conn, %{"nicknames" = action: "resend_confirmation_email" }) - conn |> json("") + json(conn, "") end def stats(conn, _) do count = Stats.get_status_visibility_count() - conn - |> json(%{"status_visibility" => count}) + json(conn, %{"status_visibility" => count}) end defp page_params(params) do diff --git a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex index 82965936d..34d90db07 100644 --- a/lib/pleroma/web/admin_api/controllers/fallback_controller.ex +++ b/lib/pleroma/web/admin_api/controllers/fallback_controller.ex @@ -17,6 +17,12 @@ def call(conn, {:error, reason}) do |> 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) diff --git a/test/web/admin_api/controllers/admin_api_controller_test.exs b/test/web/admin_api/controllers/admin_api_controller_test.exs index e3d3ccb8d..3a3eb822d 100644 --- a/test/web/admin_api/controllers/admin_api_controller_test.exs +++ b/test/web/admin_api/controllers/admin_api_controller_test.exs @@ -1599,14 +1599,14 @@ test "changes actor type from permitted list", %{conn: conn, user: user} do assert patch(conn, "/api/pleroma/admin/users/#{user.nickname}/credentials", %{ "actor_type" => "Application" }) - |> json_response(200) == %{"errors" => %{"actor_type" => "is invalid"}} + |> 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(200) == %{"error" => "Unable to update user."} + |> json_response(404) == %{"error" => "Not found"} end end From b5f13af7ba66924f6aed448bd519f6becc269922 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Sat, 20 Jun 2020 10:59:08 +0000 Subject: [PATCH 412/492] Apply suggestion to lib/pleroma/web/api_spec/operations/pleroma_emoji_pack_operation.ex --- .../web/api_spec/operations/pleroma_emoji_pack_operation.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 caa849721..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 @@ -70,7 +70,7 @@ def show_operation do :page_size, :query, %Schema{type: :integer, default: 30}, - "Number of statuses to return" + "Number of emoji to return" ) ], responses: %{ From 35e9282ffdafd8a04d1c09ec5eff3f176bb389de Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 22 Jun 2020 10:35:11 +0200 Subject: [PATCH 413/492] HellthreadPolicy: Restrict to Notes and Articles. --- .../web/activity_pub/mrf/hellthread_policy.ex | 7 +++++-- .../mrf/hellthread_policy_test.exs | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) 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 @@ defp get_recipient_count(message) 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/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 From 9f7ee5dfa283f8db9a5fcb006630674263425ac8 Mon Sep 17 00:00:00 2001 From: Ilja <domainepublic@spectraltheorem.be> Date: Mon, 22 Jun 2020 11:41:22 +0200 Subject: [PATCH 414/492] Add include for the "Further reading" section * I added an include and use this include for the installation guides that already had this section * I added the "Further reading" section as well as te "Questions" section to the English guides that didn't have it yet * I added a first point "How Federation Works/Why is my Federated Timeline empty?" to link to lains blogpost about this because we still get this question a lot in the #pleroma support channel * I reordered the list a bit --- docs/installation/alpine_linux_en.md | 5 +---- docs/installation/arch_linux_en.md | 5 +---- docs/installation/debian_based_en.md | 5 +---- docs/installation/debian_based_jp.md | 5 +---- docs/installation/further_reading.include | 5 +++++ docs/installation/gentoo_en.md | 5 +---- docs/installation/netbsd_en.md | 8 ++++++++ docs/installation/openbsd_en.md | 8 ++++++++ docs/installation/otp_en.md | 5 +---- 9 files changed, 27 insertions(+), 24 deletions(-) create mode 100644 docs/installation/further_reading.include 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 <username> <your@emailaddress #### 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/installation/arch_linux_en.md b/docs/installation/arch_linux_en.md index 8370986ad..bf9cfb488 100644 --- a/docs/installation/arch_linux_en.md +++ b/docs/installation/arch_linux_en.md @@ -200,10 +200,7 @@ sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new <username> <your@emailaddress #### 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/installation/debian_based_en.md b/docs/installation/debian_based_en.md index 2c20d521a..8ae5044b5 100644 --- a/docs/installation/debian_based_en.md +++ b/docs/installation/debian_based_en.md @@ -186,10 +186,7 @@ sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new <username> <your@emailaddress #### 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/installation/debian_based_jp.md b/docs/installation/debian_based_jp.md index 1e5a9be91..42e91cda7 100644 --- a/docs/installation/debian_based_jp.md +++ b/docs/installation/debian_based_jp.md @@ -175,10 +175,7 @@ sudo -Hu pleroma MIX_ENV=prod mix pleroma.user new <username> <your@emailaddress #### その他の設定とカスタマイズ -* [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 !} ## 質問ある? diff --git a/docs/installation/further_reading.include b/docs/installation/further_reading.include new file mode 100644 index 000000000..46752c722 --- /dev/null +++ b/docs/installation/further_reading.include @@ -0,0 +1,5 @@ +* [How Federation Works/Why is my Federated Timeline empty?](https://blog.soykaf.com/post/how-federation-works/) +* [Backup your instance](../administration/backup.md) +* [Updating your instance](../administration/updating.md) +* [Hardening your instance](../configuration/hardening.md) +* [How to activate mediaproxy](../configuration/howto_mediaproxy.md) diff --git a/docs/installation/gentoo_en.md b/docs/installation/gentoo_en.md index 1e61373cc..32152aea7 100644 --- a/docs/installation/gentoo_en.md +++ b/docs/installation/gentoo_en.md @@ -283,10 +283,7 @@ If you opted to allow sudo for the `pleroma` user but would like to remove the a #### 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/installation/netbsd_en.md b/docs/installation/netbsd_en.md index 6a922a27e..3626acc69 100644 --- a/docs/installation/netbsd_en.md +++ b/docs/installation/netbsd_en.md @@ -196,3 +196,11 @@ incorrect timestamps. You should have ntpd running. ## Instances running NetBSD * <https://catgirl.science> + +#### 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 <username> <your@emailaddress> --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 86135cd20..e4f822d1c 100644 --- a/docs/installation/otp_en.md +++ b/docs/installation/otp_en.md @@ -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 From 31a4d42ce0470d74417279a855192294650cff97 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 22 Jun 2020 13:15:37 +0200 Subject: [PATCH 415/492] SideEffects: Handle user updating. --- lib/pleroma/web/activity_pub/side_effects.ex | 12 ++++++++++++ test/web/activity_pub/side_effects_test.exs | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 1a1cc675c..09fd7d7c9 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -20,6 +20,18 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do def handle(object, meta \\ []) + # Tasks this handles: + # Update the user + def handle(%{data: %{"type" => "Update", "object" => updated_object}} = object, meta) do + {: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() + + {:ok, object, meta} + end + # Tasks this handles: # - Add like to object # - Set up notification diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 6bbbaae87..1d7c2736b 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -64,6 +64,22 @@ test "it streams out notifications and streams" do 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 + end + describe "delete objects" do setup do user = insert(:user) From 9438f83f83305f101b9fed65f68a5b9fd622bcbb Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 22 Jun 2020 13:16:05 +0200 Subject: [PATCH 416/492] Transmogrifier: Handle `Update` with the pipeline. --- .../web/activity_pub/transmogrifier.ex | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 851f474b8..8165218ee 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -684,35 +684,12 @@ def handle_incoming(%{"type" => type} = data, _options) end def handle_incoming( - %{"type" => "Update", "object" => %{"type" => object_type} = object, "actor" => actor_id} = - data, + %{"type" => "Update"} = 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 + ) do + with {:ok, %User{}} <- ObjectValidator.fetch_actor(data), + {:ok, activity, _} <- Pipeline.common_pipeline(data, local: false) do + {:ok, activity} end end From 1e7ca2443011f65aa766c3ddd5cd1203e79db50b Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 22 Jun 2020 13:23:21 +0200 Subject: [PATCH 417/492] Update Handling Test: Fix for re-used update ids. --- .../transmogrifier/user_update_handling_test.exs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/web/activity_pub/transmogrifier/user_update_handling_test.exs b/test/web/activity_pub/transmogrifier/user_update_handling_test.exs index 8e5d3b883..64636656c 100644 --- a/test/web/activity_pub/transmogrifier/user_update_handling_test.exs +++ b/test/web/activity_pub/transmogrifier/user_update_handling_test.exs @@ -106,11 +106,13 @@ test "it works with custom profile fields" do Pleroma.Config.put([:instance, :max_remote_account_fields], 2) update_data = - put_in(update_data, ["object", "attachment"], [ + 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) @@ -121,7 +123,10 @@ test "it works with custom profile fields" do %{"name" => "foo1", "value" => "updated"} ] - update_data = put_in(update_data, ["object", "attachment"], []) + update_data = + update_data + |> put_in(["object", "attachment"], []) + |> Map.put("id", update_data["id"] <> ".") {:ok, _} = Transmogrifier.handle_incoming(update_data) From 4f5af68b3e96c5b5b62185f86af39fc2f8955e10 Mon Sep 17 00:00:00 2001 From: Ben Is <srsbzns@cock.li> Date: Fri, 19 Jun 2020 14:33:58 +0000 Subject: [PATCH 418/492] Added translation using Weblate (Italian) --- priv/gettext/it/LC_MESSAGES/errors.po | 578 ++++++++++++++++++++++++++ 1 file changed, 578 insertions(+) create mode 100644 priv/gettext/it/LC_MESSAGES/errors.po diff --git a/priv/gettext/it/LC_MESSAGES/errors.po b/priv/gettext/it/LC_MESSAGES/errors.po new file mode 100644 index 000000000..18ec03c83 --- /dev/null +++ b/priv/gettext/it/LC_MESSAGES/errors.po @@ -0,0 +1,578 @@ +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: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\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" + +## 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 "" + +## 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 "" From 68c812eb2ecbfb1d582925c15d90bd1bd4e62b4b Mon Sep 17 00:00:00 2001 From: Ben Is <srsbzns@cock.li> Date: Fri, 19 Jun 2020 14:35:01 +0000 Subject: [PATCH 419/492] Translated using Weblate (Italian) Currently translated at 0.9% (1 of 106 strings) Translation: Pleroma/Pleroma backend Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma/it/ --- priv/gettext/it/LC_MESSAGES/errors.po | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/priv/gettext/it/LC_MESSAGES/errors.po b/priv/gettext/it/LC_MESSAGES/errors.po index 18ec03c83..726be628b 100644 --- a/priv/gettext/it/LC_MESSAGES/errors.po +++ b/priv/gettext/it/LC_MESSAGES/errors.po @@ -3,14 +3,16 @@ 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: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" +"PO-Revision-Date: 2020-06-19 20:38+0000\n" +"Last-Translator: Ben Is <srsbzns@cock.li>\n" +"Language-Team: Italian <https://translate.pleroma.social/projects/pleroma/" +"pleroma/it/>\n" "Language: it\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,7 +25,7 @@ msgstr "" ## effect: edit them in PO (`.po`) files instead. ## From Ecto.Changeset.cast/4 msgid "can't be blank" -msgstr "" +msgstr "non può essere nullo" ## From Ecto.Changeset.unique_constraint/3 msgid "has already been taken" From e785cd5caeab2c610f12a9071cade31a6b4549a4 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 22 Jun 2020 13:59:45 +0200 Subject: [PATCH 420/492] ActivityPub: Remove `update` and switch to pipeline. --- lib/pleroma/web/activity_pub/activity_pub.ex | 22 -------- lib/pleroma/web/activity_pub/side_effects.ex | 18 +++++-- .../controllers/account_controller.ex | 53 +++++++++++-------- test/web/activity_pub/activity_pub_test.exs | 46 ---------------- test/web/activity_pub/side_effects_test.exs | 9 ++++ 5 files changed, 52 insertions(+), 96 deletions(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 3e4f3ad30..4cc9fe16c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -321,28 +321,6 @@ defp accept_or_reject(type, %{to: to, actor: actor, object: object} = params) do end end - @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] - - data = - %{ - "to" => to, - "cc" => cc, - "type" => "Update", - "actor" => actor, - "object" => object - } - |> Maps.put_if_present("id", activity_id) - - with {:ok, activity} <- insert(data, local), - _ <- notify_and_stream(activity), - :ok <- maybe_federate(activity) do - {:ok, activity} - end - end - @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, opts \\ []) do diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 09fd7d7c9..de143b8f0 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -21,13 +21,21 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do def handle(object, meta \\ []) # Tasks this handles: - # Update the user + # - 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 - {:ok, new_user_data} = ActivityPub.user_data_from_user_object(updated_object) + 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() + 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 diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index c38c2b895..f0499621a 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -20,6 +20,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do alias Pleroma.Plugs.RateLimiter alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Web.ActivityPub.Pipeline + alias Pleroma.Web.ActivityPub.Builder alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.ListView alias Pleroma.Web.MastodonAPI.MastodonAPI @@ -179,34 +181,39 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p |> Maps.put_if_present(:default_scope, params["source"]["privacy"]) |> Maps.put_if_present(:actor_type, params[:actor_type]) - changeset = User.update_changeset(user, user_params) - - with {:ok, user} <- User.update_and_set_cache(changeset) do - user - |> build_update_activity_params() - |> ActivityPub.update() - - render(conn, "show.json", user: user, for: user, with_pleroma_settings: true) + # 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 - # Hotfix, handling will be redone with the pipeline - defp build_update_activity_params(user) do - object = - Pleroma.Web.ActivityPub.UserView.render("user.json", user: user) - |> Map.delete("@context") - - %{ - local: true, - to: [user.follower_address], - cc: [], - object: object, - actor: user.ap_id - } - end - defp normalize_fields_attributes(fields) do if Enum.all?(fields, &is_tuple/1) do Enum.map(fields, fn {_, v} -> v end) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index 7693f6400..ce35c9605 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -1092,52 +1092,6 @@ test "it filters broken threads" 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) diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 1d7c2736b..12c9ef1da 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -78,6 +78,15 @@ test "it updates the user", %{user: user, update: update} do 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 From b05f795326b77edd881ffea2c004d7ca0ddd7df9 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Mon, 22 Jun 2020 14:02:29 +0200 Subject: [PATCH 421/492] Credo fixes --- .../web/mastodon_api/controllers/account_controller.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index f0499621a..d4605c518 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -20,8 +20,8 @@ defmodule Pleroma.Web.MastodonAPI.AccountController do alias Pleroma.Plugs.RateLimiter alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Builder + alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.CommonAPI alias Pleroma.Web.MastodonAPI.ListView alias Pleroma.Web.MastodonAPI.MastodonAPI @@ -186,8 +186,8 @@ def update_credentials(%{assigns: %{user: user}, body_params: params} = conn, _p # 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. - # + # 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 From a3b10a4f643d574b84ecee51fb891e26e7f0dbc2 Mon Sep 17 00:00:00 2001 From: Ilja <domainepublic@spectraltheorem.be> Date: Mon, 22 Jun 2020 14:13:30 +0200 Subject: [PATCH 422/492] Fix 1586 Docs: provide a index.md * I renamed the introduction.md to index.md * I moved over the FE parts to an index file in the FE repo (will do an MR in the FE repo to actually add it) * While I was at it, I also fixed some broken links --- docs/index.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 docs/index.md diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 000000000..fb9e32816 --- /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 <https://the-federation.info/pleroma> and <https://fediverse.network/pleroma>. + +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. <https://pleroma.soykaf.com>) 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. <https://pleroma.soycaf.com/web>) 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. From 1e089cdf2905309a5450e2acb32aa6b35a928c29 Mon Sep 17 00:00:00 2001 From: Ilja <domainepublic@spectraltheorem.be> Date: Mon, 22 Jun 2020 14:18:55 +0200 Subject: [PATCH 423/492] I forgot to git add some files, oops (should be squashed with MR) --- .../howto_theming_your_instance.md | 2 +- docs/dev.md | 2 +- docs/introduction.md | 65 ------------------- 3 files changed, 2 insertions(+), 67 deletions(-) delete mode 100644 docs/introduction.md 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/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/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 <http://distsn.org/pleroma-instances.html>. Information on all existing fediverse instances can be found at <https://fediverse.network/>. - -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. <https://pleroma.soykaf.com>) 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. <https://pleroma.soycaf.com/web>) 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. From 499324f7bee55de4e08647f71fd4adbfd4bd039f Mon Sep 17 00:00:00 2001 From: Ilja <domainepublic@spectraltheorem.be> Date: Mon, 22 Jun 2020 14:22:23 +0200 Subject: [PATCH 424/492] Removed a space that was too much --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index fb9e32816..1a90d0a8d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -23,4 +23,4 @@ If the Pleroma interface isn't your thing, or you're just trying something new b Just add a "/web" after your instance url (e.g. <https://pleroma.soycaf.com/web>) 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. +Remember, what you see is only the frontend part of Mastodon, the backend is still Pleroma. From b0a40fc2e42a186fc6bb383621f291411b2a81be Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Mon, 22 Jun 2020 17:27:49 +0300 Subject: [PATCH 425/492] added verify RUM settings before start app --- lib/pleroma/application.ex | 2 +- lib/pleroma/application_requirements.ex | 103 ++++++++++++++++++ lib/pleroma/repo.ex | 37 +------ ...510135645_add_fts_index_to_objects_two.exs | 39 +++---- test/application_requirements_test.exs | 67 ++++++++++++ test/repo_test.exs | 34 ------ 6 files changed, 189 insertions(+), 93 deletions(-) create mode 100644 lib/pleroma/application_requirements.ex create mode 100644 test/application_requirements_test.exs diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex index 9d3d92b38..c30e5aadf 100644 --- a/lib/pleroma/application.ex +++ b/lib/pleroma/application.ex @@ -39,7 +39,7 @@ def start(_type, _args) 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() diff --git a/lib/pleroma/application_requirements.ex b/lib/pleroma/application_requirements.ex new file mode 100644 index 000000000..3bba70b7b --- /dev/null +++ b/lib/pleroma/application_requirements.ex @@ -0,0 +1,103 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# 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) + + defp 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 + + defp check_migrations_applied!(result), do: result + + 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/repo.ex b/lib/pleroma/repo.ex index 6d85d70bc..f317e4d58 100644 --- a/lib/pleroma/repo.ex +++ b/lib/pleroma/repo.ex @@ -11,9 +11,7 @@ defmodule Pleroma.Repo do 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 @@ -51,35 +49,6 @@ def get_assoc(resource, association) 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" - ) - - raise Pleroma.Repo.UnappliedMigrationsError - end - end) - else - :ok - end - end - 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 @@ -107,7 +76,3 @@ def chunk_stream(query, chunk_size) do ) end end - -defmodule Pleroma.Repo.UnappliedMigrationsError do - defexception message: "Unapplied Migrations detected" -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 79bde163d..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 @@ -2,29 +2,24 @@ defmodule Pleroma.Repo.Migrations.AddFtsIndexToObjectsTwo do use Ecto.Migration def up do - if Pleroma.Config.get([:database, :rum_enabled]) do - execute("create extension if not exists rum") - drop_if_exists index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts) - alter table(:objects) do - add(:fts_content, :tsvector) - end - - execute("CREATE FUNCTION objects_fts_update() RETURNS trigger AS $$ - begin - 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');") - - execute("CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON objects - FOR EACH ROW EXECUTE PROCEDURE objects_fts_update()") - - execute("UPDATE objects SET updated_at = NOW()") - else - raise Ecto.MigrationError, - message: "Migration is not allowed. You can change this behavior by setting `database/rum_enabled` to true." + execute("create extension if not exists rum") + drop_if_exists index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts) + alter table(:objects) do + add(:fts_content, :tsvector) end + + execute("CREATE FUNCTION objects_fts_update() RETURNS trigger AS $$ + begin + 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');") + + execute("CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON objects + FOR EACH ROW EXECUTE PROCEDURE objects_fts_update()") + + execute("UPDATE objects SET updated_at = NOW()") end def down do diff --git a/test/application_requirements_test.exs b/test/application_requirements_test.exs new file mode 100644 index 000000000..0981fcdeb --- /dev/null +++ b/test/application_requirements_test.exs @@ -0,0 +1,67 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.RepoTest do + use Pleroma.DataCase + import ExUnit.CaptureLog + import Mock + + describe "check_rum!" do + setup_with_mocks([ + {Ecto.Migrator, [], + [ + with_repo: fn repo, fun -> passthrough([repo, fun]) end, + migrations: fn Pleroma.Repo -> [] 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) + + assert_raise Pleroma.ApplicationRequirements.VerifyError, + "Unapplied RUM Migrations detected", + fn -> + capture_log(&Pleroma.ApplicationRequirements.verify!/0) + end + 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.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/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 @@ test "return error if has not assoc " 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 From 7e6f43c0d7c625a03ee0216c2d9474253ef87b5a Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn <egor@kislitsyn.com> Date: Mon, 22 Jun 2020 19:03:04 +0400 Subject: [PATCH 426/492] Add `is_muted` to notifications --- .../mastodon_api/views/notification_view.ex | 8 ++--- .../views/notification_view_test.exs | 36 +++++++++++++++---- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/views/notification_view.ex b/lib/pleroma/web/mastodon_api/views/notification_view.ex index 3865be280..c97e6d32f 100644 --- a/lib/pleroma/web/mastodon_api/views/notification_view.ex +++ b/lib/pleroma/web/mastodon_api/views/notification_view.ex @@ -84,12 +84,7 @@ def render( # Note: :relationships contain user mutes (needed for :muted flag in :status) status_render_opts = %{relationships: opts[:relationships]} - - account = - AccountView.render( - "show.json", - %{user: actor, for: reading_user} - ) + account = AccountView.render("show.json", %{user: actor, for: reading_user}) response = %{ id: to_string(notification.id), @@ -97,6 +92,7 @@ def render( created_at: CommonAPI.Utils.to_masto_date(notification.inserted_at), account: account, pleroma: %{ + is_muted: User.mutes?(reading_user, actor), is_seen: notification.seen } } diff --git a/test/web/mastodon_api/views/notification_view_test.exs b/test/web/mastodon_api/views/notification_view_test.exs index 9c399b2df..8e0e58538 100644 --- a/test/web/mastodon_api/views/notification_view_test.exs +++ b/test/web/mastodon_api/views/notification_view_test.exs @@ -49,7 +49,7 @@ test "ChatMessage notification" do expected = %{ id: to_string(notification.id), - pleroma: %{is_seen: false}, + 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}), @@ -68,7 +68,7 @@ test "Mention notification" 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", %{ @@ -92,7 +92,7 @@ test "Favourite notification" 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}), @@ -112,7 +112,7 @@ test "Reblog notification" do 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}), @@ -130,7 +130,7 @@ test "Follow notification" 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) @@ -171,7 +171,7 @@ test "Move notification" 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}), @@ -196,7 +196,7 @@ test "EmojiReact notification" 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}), @@ -206,4 +206,26 @@ test "EmojiReact notification" 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 From b3a549e916c2a721da16f60e7665b6eb64d756dd Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn <egor@kislitsyn.com> Date: Mon, 22 Jun 2020 19:18:33 +0400 Subject: [PATCH 427/492] Update NotificationOperation spec --- .../web/api_spec/operations/notification_operation.ex | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/api_spec/operations/notification_operation.ex b/lib/pleroma/web/api_spec/operations/notification_operation.ex index 41328b5f2..f09be64cb 100644 --- a/lib/pleroma/web/api_spec/operations/notification_operation.ex +++ b/lib/pleroma/web/api_spec/operations/notification_operation.ex @@ -163,6 +163,13 @@ def notification 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 @@ def notification 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 From 8f6ba4b22f48dcd0256d6a9cf7259aa475895b84 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Mon, 22 Jun 2020 23:45:29 +0200 Subject: [PATCH 428/492] Add warning against parsing/reusing MastoFE settings blob --- lib/pleroma/web/masto_fe_controller.ex | 2 +- lib/pleroma/web/router.ex | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) 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 @@ def manifest(conn, _params) 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/router.ex b/lib/pleroma/web/router.ex index eda74a171..419aa55e4 100644 --- a/lib/pleroma/web/router.ex +++ b/lib/pleroma/web/router.ex @@ -467,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 From bf8310f3802c46e6305fcb3832bca297582990d9 Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Mon, 22 Jun 2020 17:35:02 -0500 Subject: [PATCH 429/492] Add missing default config value for :instance, instance_thumbnail Follows up on b7fc61e17b --- config/config.exs | 1 + 1 file changed, 1 insertion(+) diff --git a/config/config.exs b/config/config.exs index 4bf31f3fc..e0888fa9a 100644 --- a/config/config.exs +++ b/config/config.exs @@ -186,6 +186,7 @@ notify_email: "noreply@example.com", 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, From df5e048cbb7d349b34203ccba49a8f646e4d93a3 Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Mon, 22 Jun 2020 17:39:02 -0500 Subject: [PATCH 430/492] Do not need a function to provide fallback value with default defined in config.exs --- lib/pleroma/web/mastodon_api/views/instance_view.ex | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index c498fe632..c6b54e570 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 @@ def render("show.json", _) do streaming_api: Pleroma.Web.Endpoint.websocket_url() }, stats: Pleroma.Stats.get_stats(), - thumbnail: instance_thumbnail(), + thumbnail: Keyword.get(instance, :instance_thumbnail), languages: ["en"], registrations: Keyword.get(instance, :registrations_open), # Extra (not present in Mastodon): @@ -88,9 +88,4 @@ def federation do end |> Map.put(:enabled, Config.get([:instance, :federating])) end - - defp instance_thumbnail do - Pleroma.Config.get([:instance, :instance_thumbnail]) || - "#{Pleroma.Web.base_url()}/instance/thumbnail.jpeg" - end end From c116b6d6d6e4b12d9d751481926183f19cdb5248 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me> Date: Tue, 23 Jun 2020 04:42:44 +0200 Subject: [PATCH 431/492] ActivityPubController: Update upload_media @doc Small cherry-pick from https://git.pleroma.social/pleroma/pleroma/-/merge_requests/1810 --- lib/pleroma/web/activity_pub/activity_pub_controller.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/activity_pub_controller.ex b/lib/pleroma/web/activity_pub/activity_pub_controller.ex index f0b5c6e93..220c4fe52 100644 --- a/lib/pleroma/web/activity_pub/activity_pub_controller.ex +++ b/lib/pleroma/web/activity_pub/activity_pub_controller.ex @@ -514,7 +514,6 @@ defp ensure_user_keys_present_and_maybe_refresh_for_user(user, for_user) do {new_user, for_user} end - # TODO: Add support for "object" field @doc """ Endpoint based on <https://www.w3.org/wiki/SocialCG/ActivityPub/MediaUpload> @@ -525,6 +524,8 @@ defp ensure_user_keys_present_and_maybe_refresh_for_user(user, for_user) 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} <- From 2715c40e1d36cc844be1dd7d41a0c6a16ca5f7b7 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Tue, 23 Jun 2020 06:56:17 +0300 Subject: [PATCH 432/492] added tests --- lib/pleroma/application_requirements.ex | 8 +++-- test/application_requirements_test.exs | 48 +++++++++++++++++++++---- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/lib/pleroma/application_requirements.ex b/lib/pleroma/application_requirements.ex index 3bba70b7b..88575a498 100644 --- a/lib/pleroma/application_requirements.ex +++ b/lib/pleroma/application_requirements.ex @@ -24,7 +24,9 @@ def verify! do defp handle_result(:ok), do: :ok defp handle_result({:error, message}), do: raise(VerifyError, message: message) - defp check_migrations_applied!(:ok) do + # 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 @@ -58,8 +60,10 @@ defp check_migrations_applied!(:ok) do end end - defp check_migrations_applied!(result), do: result + 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 -> diff --git a/test/application_requirements_test.exs b/test/application_requirements_test.exs index 0981fcdeb..b8d073e11 100644 --- a/test/application_requirements_test.exs +++ b/test/application_requirements_test.exs @@ -2,25 +2,22 @@ # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.RepoTest do +defmodule Pleroma.ApplicationRequirementsTest do use Pleroma.DataCase import ExUnit.CaptureLog import Mock describe "check_rum!" do setup_with_mocks([ - {Ecto.Migrator, [], - [ - with_repo: fn repo, fun -> passthrough([repo, fun]) end, - migrations: fn Pleroma.Repo -> [] end - ]} + {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 + test "raises if rum is enabled and detects unapplied rum migrations" do Pleroma.Config.put([:database, :rum_enabled], true) assert_raise Pleroma.ApplicationRequirements.VerifyError, @@ -29,6 +26,43 @@ test "raises if rum is enabled and detects unapplied rum migrations" do capture_log(&Pleroma.ApplicationRequirements.verify!/0) end end + + test "raises if rum is disabled and detects rum migrations" do + Pleroma.Config.put([:database, :rum_enabled], false) + + with_mocks([ + { + Pleroma.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([ + { + Pleroma.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) + assert Pleroma.ApplicationRequirements.verify!() == :ok + end end describe "check_migrations_applied!" do From 84aa9c78dd314e93a5153e3584af38b8c218caed Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Tue, 23 Jun 2020 09:08:24 +0300 Subject: [PATCH 433/492] fix tests --- test/application_requirements_test.exs | 37 +++++++++++--------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/test/application_requirements_test.exs b/test/application_requirements_test.exs index b8d073e11..481cdfd73 100644 --- a/test/application_requirements_test.exs +++ b/test/application_requirements_test.exs @@ -7,6 +7,8 @@ defmodule Pleroma.ApplicationRequirementsTest do import ExUnit.CaptureLog import Mock + alias Pleroma.Repo + describe "check_rum!" do setup_with_mocks([ {Pleroma.ApplicationRequirements, [:passthrough], @@ -20,23 +22,19 @@ defmodule Pleroma.ApplicationRequirementsTest do test "raises if rum is enabled and detects unapplied rum migrations" do Pleroma.Config.put([:database, :rum_enabled], true) - assert_raise Pleroma.ApplicationRequirements.VerifyError, - "Unapplied RUM Migrations detected", - fn -> - capture_log(&Pleroma.ApplicationRequirements.verify!/0) - end + 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([ - { - Pleroma.Repo, - [:passthrough], - [exists?: fn _, _ -> true end] - } - ]) do + with_mocks([{Repo, [:passthrough], [exists?: fn _, _ -> true end]}]) do assert_raise Pleroma.ApplicationRequirements.VerifyError, "RUM Migrations detected", fn -> @@ -48,20 +46,17 @@ test "raises if rum is disabled and detects rum migrations" do test "doesn't do anything if rum enabled and applied migrations" do Pleroma.Config.put([:database, :rum_enabled], true) - with_mocks([ - { - Pleroma.Repo, - [:passthrough], - [exists?: fn _, _ -> true end] - } - ]) do + 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) - assert Pleroma.ApplicationRequirements.verify!() == :ok + + with_mocks([{Repo, [:passthrough], [exists?: fn _, _ -> false end]}]) do + assert Pleroma.ApplicationRequirements.verify!() == :ok + end end end @@ -70,7 +65,7 @@ test "doesn't do anything if rum disabled" do {Ecto.Migrator, [], [ with_repo: fn repo, fun -> passthrough([repo, fun]) end, - migrations: fn Pleroma.Repo -> + migrations: fn Repo -> [ {:up, 20_191_128_153_944, "fix_missing_following_count"}, {:up, 20_191_203_043_610, "create_report_notes"}, From 2737809bbf249696d06d4a351837a405d79d47e3 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Tue, 23 Jun 2020 11:03:32 +0200 Subject: [PATCH 434/492] An act of desperation. --- test/web/activity_pub/activity_pub_controller_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index e490a5744..6ea50fd96 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -665,7 +665,7 @@ test "it accepts announces with to as string instead of array", %{conn: conn} do |> post("/users/#{user.nickname}/inbox", data) assert "ok" == json_response(conn, 200) - ObanHelpers.perform(all_enqueued(worker: ReceiverWorker)) + ObanHelpers.perform_all() %Activity{} = activity = Activity.get_by_ap_id(data["id"]) assert "https://www.w3.org/ns/activitystreams#Public" in activity.recipients end From d93e01137b0682dd97b95b848f7b8656de89e3cf Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Tue, 23 Jun 2020 11:43:20 +0200 Subject: [PATCH 435/492] ActivityPubControllerTest: Testing changes. --- .../web/activity_pub/activity_pub_controller_test.exs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index 6ea50fd96..e5f801b22 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -648,11 +648,14 @@ test "it accepts messages with bcc as string instead of array", %{conn: conn, da 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" @@ -665,7 +668,7 @@ test "it accepts announces with to as string instead of array", %{conn: conn} do |> post("/users/#{user.nickname}/inbox", data) assert "ok" == json_response(conn, 200) - ObanHelpers.perform_all() + ObanHelpers.perform(all_enqueued(worker: ReceiverWorker)) %Activity{} = activity = Activity.get_by_ap_id(data["id"]) assert "https://www.w3.org/ns/activitystreams#Public" in activity.recipients end From adc199c6a8932f893bc1098acbf222e64cdb07d9 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Tue, 23 Jun 2020 12:04:51 +0200 Subject: [PATCH 436/492] ActivityPubControllerTest: Capture error log --- test/web/activity_pub/activity_pub_controller_test.exs | 1 + 1 file changed, 1 insertion(+) diff --git a/test/web/activity_pub/activity_pub_controller_test.exs b/test/web/activity_pub/activity_pub_controller_test.exs index e5f801b22..e722f7c04 100644 --- a/test/web/activity_pub/activity_pub_controller_test.exs +++ b/test/web/activity_pub/activity_pub_controller_test.exs @@ -536,6 +536,7 @@ test "accept follow activity", %{conn: conn} 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 From aee815b478aea5d74959c5a445c6c5d87f25168e Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Tue, 23 Jun 2020 12:37:05 +0200 Subject: [PATCH 437/492] ObjectValidator: Clarify type of object. --- lib/pleroma/web/activity_pub/object_validator.ex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 804a9d06e..2c657b467 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -24,13 +24,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do @spec validate(map(), keyword()) :: {:ok, map(), keyword()} | {:error, any()} def validate(object, meta) - def validate(%{"type" => "Update"} = object, meta) do - with {:ok, object} <- - object + def validate(%{"type" => "Update"} = update_activity, meta) do + with {:ok, update_activity} <- + update_activity |> UpdateValidator.cast_and_validate() |> Ecto.Changeset.apply_action(:insert) do - object = stringify_keys(object) - {:ok, object, meta} + update_activity = stringify_keys(update_activity) + {:ok, update_activity, meta} end end From 54039100fe05e8daf03274ea5c56ca8dab341e9b Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Tue, 23 Jun 2020 11:17:26 -0500 Subject: [PATCH 438/492] Remove reference to defunct distsn.org --- config/description.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/description.exs b/config/description.exs index f9523936a..bc781e4c8 100644 --- a/config/description.exs +++ b/config/description.exs @@ -979,7 +979,7 @@ key: :instance_thumbnail, type: :string, description: - "The instance thumbnail image. It will appear in [Pleroma Instances](http://distsn.org/pleroma-instances.html)", + "The instance thumbnail is the Mastodon landing page image and used by some apps to identify the instance.", suggestions: ["/instance/thumbnail.jpeg"] } ] From cb96c82f70e94e24bdf71e832db4548086f4e7c5 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Tue, 23 Jun 2020 20:18:27 +0300 Subject: [PATCH 439/492] moving to mrf namespace migration fix --- ...rf_config_move_from_instance_namespace.exs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 index 6f6094613..ef36c4eb7 100644 --- a/priv/repo/migrations/20200323122421_mrf_config_move_from_instance_namespace.exs +++ b/priv/repo/migrations/20200323122421_mrf_config_move_from_instance_namespace.exs @@ -5,13 +5,11 @@ defmodule Pleroma.Repo.Migrations.MrfConfigMoveFromInstanceNamespace do @old_keys [:rewrite_policy, :mrf_transparency, :mrf_transparency_exclusions] def change do - config = ConfigDB.get_by_params(%{group: ":pleroma", key: ":instance"}) + config = ConfigDB.get_by_params(%{group: :pleroma, key: :instance}) if config do - old_instance = ConfigDB.from_binary(config.value) - mrf = - old_instance + config.value |> Keyword.take(@old_keys) |> Keyword.new(fn {:rewrite_policy, policies} -> {:policies, policies} @@ -21,15 +19,17 @@ def change do if mrf != [] do {:ok, _} = - ConfigDB.create( - %{group: ":pleroma", key: ":mrf", value: ConfigDB.to_binary(mrf)}, - false - ) + %ConfigDB{} + |> ConfigDB.changeset(%{group: :pleroma, key: :mrf, value: mrf}) + |> Pleroma.Repo.insert() - new_instance = Keyword.drop(old_instance, @old_keys) + new_instance = Keyword.drop(config.value, @old_keys) if new_instance != [] do - {:ok, _} = ConfigDB.update(config, %{value: ConfigDB.to_binary(new_instance)}, false) + {:ok, _} = + config + |> ConfigDB.changeset(%{value: new_instance}) + |> Pleroma.Repo.update() else {:ok, _} = ConfigDB.delete(config) end From 721fc7c554425ccc7df693776c282c30e95ae2bb Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Wed, 24 Jun 2020 09:12:32 +0300 Subject: [PATCH 440/492] added wrapper Pleroma.HTTP for Tzdata.HTTPClient --- config/config.exs | 2 ++ lib/pleroma/http/http.ex | 8 ++++++-- lib/pleroma/http/tzdata.ex | 25 +++++++++++++++++++++++++ mix.exs | 2 +- mix.lock | 2 +- test/http/tzdata_test.exs | 35 +++++++++++++++++++++++++++++++++++ test/http_test.exs | 9 +++++++++ 7 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 lib/pleroma/http/tzdata.ex create mode 100644 test/http/tzdata_test.exs diff --git a/config/config.exs b/config/config.exs index a81ffcd3b..bd559c835 100644 --- a/config/config.exs +++ b/config/config.exs @@ -695,6 +695,8 @@ transparency: true, transparency_exclusions: [] +config :tzdata, :http_client, Pleroma.HTTP.Tzdata + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" 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 @@ def get(url, headers \\ [], options \\ []) 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 @@ def post(url, body, headers \\ [], options \\ []), 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 @@ def post(url, body, headers \\ [], options \\ []), `{: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 <https://pleroma.social/> +# 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/mix.exs b/mix.exs index 4d13e95d7..b638be541 100644 --- a/mix.exs +++ b/mix.exs @@ -117,7 +117,7 @@ defp oauth_deps 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"}, diff --git a/mix.lock b/mix.lock index 5383c2c6e..5ad49391d 100644 --- a/mix.lock +++ b/mix.lock @@ -110,7 +110,7 @@ "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.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"}, "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"}, diff --git a/test/http/tzdata_test.exs b/test/http/tzdata_test.exs new file mode 100644 index 000000000..4b37299cd --- /dev/null +++ b/test/http/tzdata_test.exs @@ -0,0 +1,35 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.HTTP.TzdaraTest 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") == { From 65f3eb333b001586771247ea9949e40bfec0a947 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Wed, 24 Jun 2020 08:50:33 +0000 Subject: [PATCH 441/492] Apply suggestion to test/http/tzdata_test.exs --- test/http/tzdata_test.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/http/tzdata_test.exs b/test/http/tzdata_test.exs index 4b37299cd..3e605d33b 100644 --- a/test/http/tzdata_test.exs +++ b/test/http/tzdata_test.exs @@ -2,7 +2,7 @@ # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/> # SPDX-License-Identifier: AGPL-3.0-only -defmodule Pleroma.HTTP.TzdaraTest do +defmodule Pleroma.HTTP.TzdataTest do use ExUnit.Case import Tesla.Mock From 35f6770436837e2e500971a54d51984bd059adfd Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Wed, 24 Jun 2020 13:29:08 +0200 Subject: [PATCH 442/492] StatusView: Add pleroma.parent_visible --- lib/pleroma/web/activity_pub/visibility.ex | 6 ++++-- .../web/mastodon_api/views/status_view.ex | 5 +++-- .../mastodon_api/views/status_view_test.exs | 19 ++++++++++++++++++- 3 files changed, 25 insertions(+), 5 deletions(-) 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 @@ def is_list?(_), do: false @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 @@ def visible_for_user?(%{data: %{"listMessage" => list_ap_id}} = activity, %User{ |> 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/mastodon_api/views/status_view.ex b/lib/pleroma/web/mastodon_api/views/status_view.ex index 2c49bedb3..6ee17f4dd 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 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity} 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 diff --git a/test/web/mastodon_api/views/status_view_test.exs b/test/web/mastodon_api/views/status_view_test.exs index 5cbadf0fc..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 @@ test "a note activity" do expires_at: nil, direct_conversation_id: nil, thread_muted: false, - emoji_reactions: [] + emoji_reactions: [], + parent_visible: false } } @@ -620,4 +621,20 @@ test "visibility/list" 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 From 637bae42b4ac59e54164f2b9545017b3f8d2960f Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Wed, 24 Jun 2020 13:31:42 +0200 Subject: [PATCH 443/492] Docs: Document added parent_visible field. --- docs/API/differences_in_mastoapi_responses.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index be3c802af..f6e8a6800 100644 --- a/docs/API/differences_in_mastoapi_responses.md +++ b/docs/API/differences_in_mastoapi_responses.md @@ -27,6 +27,7 @@ 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. ## Media Attachments From 79ee914bc2956f005c83046be53dbd38771d29ef Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Wed, 24 Jun 2020 13:32:14 +0200 Subject: [PATCH 444/492] Changelog: Add info about parent_visible field --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fc2231d1..cfffc279b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added +- StatusView: Add pleroma.parents_visible field. - 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` From 1702239428ea7e3b49fcf8985f1d2fbbadb020b5 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Wed, 24 Jun 2020 14:30:12 +0200 Subject: [PATCH 445/492] Changelog: Put info under API header. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfffc279b..f04e12ade 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added -- StatusView: Add pleroma.parents_visible field. - 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` @@ -43,6 +42,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). <details> <summary>API Changes</summary> +- 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. From 4c5fb831b3b59309a475a141eb73cc440533d0ff Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Wed, 24 Jun 2020 14:33:00 +0200 Subject: [PATCH 446/492] Status schema: Add parent_visible. --- lib/pleroma/web/api_spec/schemas/status.ex | 4 ++++ 1 file changed, 4 insertions(+) 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" } } }, From aae1af8cf1d860243eb8c8a642682441294967e1 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov <alex.strizhakov@gmail.com> Date: Wed, 24 Jun 2020 18:06:30 +0300 Subject: [PATCH 447/492] fix for emoji pagination in pack show --- lib/pleroma/emoji/pack.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pleroma/emoji/pack.ex b/lib/pleroma/emoji/pack.ex index 787ff8141..d076ae312 100644 --- a/lib/pleroma/emoji/pack.ex +++ b/lib/pleroma/emoji/pack.ex @@ -45,6 +45,7 @@ def show(opts) do shortcodes = pack.files |> Map.keys() + |> Enum.sort() |> paginate(opts[:page], opts[:page_size]) pack = Map.put(pack, :files, Map.take(pack.files, shortcodes)) From 67ab5805536ed64ca842998bfd4b3b0e63d13dd3 Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Wed, 24 Jun 2020 17:18:53 -0500 Subject: [PATCH 448/492] Filter outstanding follower requests from deactivated accounts --- lib/pleroma/following_relationship.ex | 1 + test/user_test.exs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/lib/pleroma/following_relationship.ex b/lib/pleroma/following_relationship.ex index 093b1f405..c2020d30a 100644 --- a/lib/pleroma/following_relationship.ex +++ b/lib/pleroma/following_relationship.ex @@ -124,6 +124,7 @@ def get_follow_requests(%User{id: id}) 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 diff --git a/test/user_test.exs b/test/user_test.exs index 311b6c683..9b66f3f51 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -199,6 +199,16 @@ test "doesn't return already accepted or duplicate follow requests" 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) From 439a1a0218fe032ac35bb2e84516a8a4bf8563b4 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov <parallel588@gmail.com> Date: Thu, 25 Jun 2020 07:12:29 +0300 Subject: [PATCH 449/492] added wrapper Pleroma.HTTP for ExAws.S3 --- config/config.exs | 2 ++ lib/pleroma/http/ex_aws.ex | 22 ++++++++++++++++ test/http/ex_aws_test.exs | 54 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 lib/pleroma/http/ex_aws.ex create mode 100644 test/http/ex_aws_test.exs diff --git a/config/config.exs b/config/config.exs index bd559c835..5aad26e95 100644 --- a/config/config.exs +++ b/config/config.exs @@ -697,6 +697,8 @@ config :tzdata, :http_client, Pleroma.HTTP.Tzdata +config :ex_aws, http_client: Pleroma.HTTP.ExAws + # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. import_config "#{Mix.env()}.exs" 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 <https://pleroma.social/> +# 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/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 <https://pleroma.social/> +# 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 From d137f934dfed199141ee7cb4215520b64e3ecb4f Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 10:54:00 +0200 Subject: [PATCH 450/492] Transmogrifier Test: Extract block handling. --- .../transmogrifier/block_handling_test.exs | 63 +++++++++++++++++++ test/web/activity_pub/transmogrifier_test.exs | 50 --------------- 2 files changed, 63 insertions(+), 50 deletions(-) create mode 100644 test/web/activity_pub/transmogrifier/block_handling_test.exs 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 <https://pleroma.social/> +# 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_test.exs b/test/web/activity_pub/transmogrifier_test.exs index 100821056..6a53fd3f0 100644 --- a/test/web/activity_pub/transmogrifier_test.exs +++ b/test/web/activity_pub/transmogrifier_test.exs @@ -445,56 +445,6 @@ test "it works for incoming follows to locked account" 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) From 89e5b2046bd15b3fead7a6194a2b9cecd2fedbd3 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 11:13:35 +0200 Subject: [PATCH 451/492] ObjectValidator: Basic `Block` support. --- lib/pleroma/web/activity_pub/builder.ex | 12 ++++++ .../web/activity_pub/object_validator.ex | 11 +++++ .../object_validators/block_validator.ex | 42 +++++++++++++++++++ .../activity_pub/object_validator_test.exs | 27 ++++++++++++ 4 files changed, 92 insertions(+) create mode 100644 lib/pleroma/web/activity_pub/object_validators/block_validator.ex diff --git a/lib/pleroma/web/activity_pub/builder.ex b/lib/pleroma/web/activity_pub/builder.ex index 135a5c431..cabc28de9 100644 --- a/lib/pleroma/web/activity_pub/builder.ex +++ b/lib/pleroma/web/activity_pub/builder.ex @@ -138,6 +138,18 @@ def update(actor, object) do }, []} 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) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 2c657b467..737c0fd64 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do 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 @@ -24,6 +25,16 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidator do @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) + {:ok, block_activity, meta} + end + end + def validate(%{"type" => "Update"} = update_activity, meta) do with {:ok, update_activity} <- update_activity 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 <https://pleroma.social/> +# 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/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index 770a8dcf8..e96552763 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -654,4 +654,31 @@ test "returns an error if the object can't be updated by the actor", %{ assert {:error, _cng} = ObjectValidator.validate(update, []) end end + + describe "blocks" do + setup do + user = insert(:user) + 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 From e38293c8f1adca40447ba39f4919b2b08bf0329a Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 11:33:54 +0200 Subject: [PATCH 452/492] Transmogrifier: Switch to pipeline for Blocks. --- lib/pleroma/web/activity_pub/side_effects.ex | 16 ++++++++++++ .../web/activity_pub/transmogrifier.ex | 22 +++------------- test/web/activity_pub/side_effects_test.exs | 25 +++++++++++++++++++ 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index de143b8f0..48350d2b3 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -20,6 +20,22 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do 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.unfollow(blocker, blocked) + User.block(blocker, blocked) + end + + {:ok, object, meta} + end + # Tasks this handles: # - Update the user # diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 4e318e89c..278fbbeab 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -673,7 +673,7 @@ def handle_incoming( end def handle_incoming(%{"type" => type} = data, _options) - when type in ["Like", "EmojiReact", "Announce"] do + 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 @@ -684,9 +684,10 @@ def handle_incoming(%{"type" => type} = data, _options) end def handle_incoming( - %{"type" => "Update"} = data, + %{"type" => type} = data, _options - ) do + ) + 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} @@ -765,21 +766,6 @@ def handle_incoming( 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", diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 12c9ef1da..5e883bb09 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -64,6 +64,31 @@ test "it streams out notifications and streams" do 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 + end + describe "update users" do setup do user = insert(:user) From 8cfb58a8c0a2ee0c69eb727cc810e8571289f813 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 11:44:04 +0200 Subject: [PATCH 453/492] AccountController: Extract blocking to CommonAPI. --- lib/pleroma/web/common_api/common_api.ex | 7 +++++++ .../web/mastodon_api/controllers/account_controller.ex | 3 +-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/common_api/common_api.ex b/lib/pleroma/web/common_api/common_api.ex index 04e081a8e..fd7149079 100644 --- a/lib/pleroma/web/common_api/common_api.ex +++ b/lib/pleroma/web/common_api/common_api.ex @@ -25,6 +25,13 @@ 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), diff --git a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex index 7a88a847c..b5008d69b 100644 --- a/lib/pleroma/web/mastodon_api/controllers/account_controller.ex +++ b/lib/pleroma/web/mastodon_api/controllers/account_controller.ex @@ -385,8 +385,7 @@ def unmute(%{assigns: %{user: muter, account: muted}} = conn, _params) 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}) From 44bb7cfccdf2c25ae641b4cffa8e5c7fdedc3f54 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 11:51:33 +0200 Subject: [PATCH 454/492] ActivityPub: Remove `block`. --- lib/pleroma/user.ex | 3 +- lib/pleroma/web/activity_pub/activity_pub.ex | 27 ----------- test/web/activity_pub/activity_pub_test.exs | 48 -------------------- test/web/activity_pub/side_effects_test.exs | 3 +- test/web/activity_pub/utils_test.exs | 16 ++----- 5 files changed, 5 insertions(+), 92 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 1d70a37ef..c3e2a89ad 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1527,8 +1527,7 @@ def perform(:blocks_import, %User{} = blocker, blocked_identifiers) 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 -> diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 7cd3eab39..05bd824f5 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -366,33 +366,6 @@ defp do_unfollow(follower, followed, activity_id, local) 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 and fetch_latest_follow(blocker, blocked) do - unfollow(blocker, blocked, nil, local) - end - - block_data = make_block_data(blocker, blocked, activity_id) - - with {: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( %{ diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index be7ab2ae4..575e0c5db 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -992,54 +992,6 @@ test "creates an undo activity for a pending follow request" 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) diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 5e883bb09..36792f015 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -267,8 +267,7 @@ test "when activation is required", %{delete: delete, user: user} do {: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, block} = CommonAPI.block(user, poster) {:ok, undo_data, _meta} = Builder.undo(user, like) {:ok, like_undo, _meta} = ActivityPub.persist(undo_data, local: true) diff --git a/test/web/activity_pub/utils_test.exs b/test/web/activity_pub/utils_test.exs index 15f03f193..2f9ecb5a3 100644 --- a/test/web/activity_pub/utils_test.exs +++ b/test/web/activity_pub/utils_test.exs @@ -27,16 +27,6 @@ test "fetches the latest Follow activity" 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 = %{ @@ -344,9 +334,9 @@ test "fetches last block activities" 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 From 84f9ca19568777861ff9520cbef09a0259efd536 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 12:03:14 +0200 Subject: [PATCH 455/492] Blocking: Don't federate if the options is set. --- .../web/activity_pub/object_validator.ex | 9 ++++ test/web/common_api/common_api_test.exs | 46 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/lib/pleroma/web/activity_pub/object_validator.ex b/lib/pleroma/web/activity_pub/object_validator.ex index 737c0fd64..bb6324460 100644 --- a/lib/pleroma/web/activity_pub/object_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validator.ex @@ -31,6 +31,15 @@ def validate(%{"type" => "Block"} = block_activity, meta) do |> 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 diff --git a/test/web/common_api/common_api_test.exs b/test/web/common_api/common_api_test.exs index 6bd26050e..fc3bb845d 100644 --- a/test/web/common_api/common_api_test.exs +++ b/test/web/common_api/common_api_test.exs @@ -25,6 +25,52 @@ 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]) From f585622f852f4204f8f8dcaa6626ed4cd025edfe Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 10:17:16 +0000 Subject: [PATCH 456/492] Apply suggestion to config/description.exs --- config/description.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/description.exs b/config/description.exs index bc781e4c8..5ed7f753e 100644 --- a/config/description.exs +++ b/config/description.exs @@ -979,7 +979,7 @@ key: :instance_thumbnail, type: :string, description: - "The instance thumbnail is the Mastodon landing page image and used by some apps to identify the instance.", + "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"] } ] From 04abee782b8745b21d0f9e58b27a805db6a94aa7 Mon Sep 17 00:00:00 2001 From: lain <lain@soykaf.club> Date: Thu, 25 Jun 2020 12:40:39 +0200 Subject: [PATCH 457/492] AntiSpamLinkPolicy: Exempt local users. --- .../activity_pub/mrf/anti_link_spam_policy.ex | 5 ++++- .../mrf/anti_link_spam_policy_test.exs | 16 ++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) 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 @@ defp contains_links?(_), do: false @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/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 @@ test "it allows posts without links" 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 @@ test "it disallows posts with links" 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 From 28d4e60f668ec5fa6c5be21ee28612d01b51a6a0 Mon Sep 17 00:00:00 2001 From: Alex Gleason <alex@alexgleason.me> Date: Thu, 25 Jun 2020 12:32:06 -0500 Subject: [PATCH 458/492] MastoAPI differences: Document not implemented features --- docs/API/differences_in_mastoapi_responses.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index be3c802af..7c3546f4f 100644 --- a/docs/API/differences_in_mastoapi_responses.md +++ b/docs/API/differences_in_mastoapi_responses.md @@ -234,3 +234,43 @@ Has these additional fields under the `pleroma` object: ## 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 From d9e462362823c9178e354ebe9b7c6761f94d387f Mon Sep 17 00:00:00 2001 From: Mark Felder <feld@FreeBSD.org> Date: Thu, 25 Jun 2020 14:55:00 -0500 Subject: [PATCH 459/492] Update AdminFE build --- priv/static/adminfe/{app.796ca6d4.css => app.6684eb28.css} | 0 .../{chunk-0558.af0d89cd.css => chunk-070d.d2dd6533.css} | 0 priv/static/adminfe/chunk-0cbc.60bba79b.css | 1 + priv/static/adminfe/chunk-143c.43ada4fc.css | 1 + priv/static/adminfe/chunk-1609.408dae86.css | 1 + priv/static/adminfe/chunk-176e.5d7d957b.css | 1 + priv/static/adminfe/chunk-22d2.813009b9.css | 1 - priv/static/adminfe/chunk-43ca.0de86b6d.css | 1 + .../{chunk-0961.d3692214.css => chunk-4e7e.5afe1978.css} | 0 priv/static/adminfe/chunk-5882.f65db7f2.css | 1 + priv/static/adminfe/chunk-6b68.0cc00484.css | 1 - .../{chunk-6e81.0e80d020.css => chunk-6e81.ca3b222f.css} | 0 priv/static/adminfe/chunk-7506.f01f6c2a.css | 1 + priv/static/adminfe/chunk-7637.941c4edb.css | 1 - .../{chunk-0778.d9e7180a.css => chunk-7c6b.d9e7180a.css} | 0 priv/static/adminfe/chunk-7e30.f2b9674a.css | 1 - priv/static/adminfe/chunk-970d.f59cca8c.css | 1 - .../{chunk-3384.d50ed383.css => chunk-c5f4.0827b1ce.css} | 2 +- priv/static/adminfe/chunk-commons.7f6d2d11.css | 1 + priv/static/adminfe/chunk-d38a.cabdc22e.css | 1 - priv/static/adminfe/chunk-e404.a56021ae.css | 1 + priv/static/adminfe/chunk-e458.6c0703cb.css | 1 - priv/static/adminfe/index.html | 2 +- priv/static/adminfe/static/js/app.0146039c.js | 2 -- priv/static/adminfe/static/js/app.0146039c.js.map | 1 - priv/static/adminfe/static/js/app.3fcec8f6.js | 2 ++ priv/static/adminfe/static/js/app.3fcec8f6.js.map | 1 + .../js/{chunk-0558.75954137.js => chunk-070d.7e10a520.js} | 4 ++-- ...{chunk-0558.75954137.js.map => chunk-070d.7e10a520.js.map} | 2 +- priv/static/adminfe/static/js/chunk-0778.b17650df.js.map | 1 - priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js | 2 ++ priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js.map | 1 + priv/static/adminfe/static/js/chunk-143c.fc1825bf.js | 2 ++ priv/static/adminfe/static/js/chunk-143c.fc1825bf.js.map | 1 + priv/static/adminfe/static/js/chunk-1609.98da6b01.js | 2 ++ priv/static/adminfe/static/js/chunk-1609.98da6b01.js.map | 1 + priv/static/adminfe/static/js/chunk-176e.c4995511.js | 2 ++ priv/static/adminfe/static/js/chunk-176e.c4995511.js.map | 1 + priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js | 2 -- priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map | 1 - priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js | 2 -- priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map | 1 - priv/static/adminfe/static/js/chunk-43ca.3debeff7.js | 2 ++ priv/static/adminfe/static/js/chunk-43ca.3debeff7.js.map | 1 + .../js/{chunk-0961.ef33e81b.js => chunk-4e7e.91b5e73a.js} | 4 ++-- ...{chunk-0961.ef33e81b.js.map => chunk-4e7e.91b5e73a.js.map} | 2 +- .../js/{chunk-7f9e.c49aa694.js => chunk-5118.7c48ad58.js} | 4 ++-- ...{chunk-7f9e.c49aa694.js.map => chunk-5118.7c48ad58.js.map} | 2 +- priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js | 2 ++ priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js.map | 1 + priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js | 2 -- priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map | 1 - .../js/{chunk-6e81.3733ace2.js => chunk-6e81.6efb01f4.js} | 2 +- ...{chunk-6e81.3733ace2.js.map => chunk-6e81.6efb01f4.js.map} | 2 +- priv/static/adminfe/static/js/chunk-7506.a3364e53.js | 2 ++ priv/static/adminfe/static/js/chunk-7506.a3364e53.js.map | 1 + priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js | 2 -- priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map | 1 - .../js/{chunk-0778.b17650df.js => chunk-7c6b.e63ae1da.js} | 4 ++-- priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js.map | 1 + priv/static/adminfe/static/js/chunk-7e30.ec42e302.js | 2 -- priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map | 1 - priv/static/adminfe/static/js/chunk-970d.2457e066.js | 2 -- priv/static/adminfe/static/js/chunk-970d.2457e066.js.map | 1 - priv/static/adminfe/static/js/chunk-c5f4.304479e7.js | 2 ++ priv/static/adminfe/static/js/chunk-c5f4.304479e7.js.map | 1 + priv/static/adminfe/static/js/chunk-commons.5a106955.js | 2 ++ priv/static/adminfe/static/js/chunk-commons.5a106955.js.map | 1 + priv/static/adminfe/static/js/chunk-d38a.a851004a.js | 2 -- priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map | 1 - priv/static/adminfe/static/js/chunk-e404.554bc2e3.js | 2 ++ priv/static/adminfe/static/js/chunk-e404.554bc2e3.js.map | 1 + priv/static/adminfe/static/js/chunk-e458.bb460d81.js | 2 -- priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map | 1 - priv/static/adminfe/static/js/runtime.5bae86dc.js | 2 ++ priv/static/adminfe/static/js/runtime.5bae86dc.js.map | 1 + priv/static/adminfe/static/js/runtime.b08eb412.js | 2 -- priv/static/adminfe/static/js/runtime.b08eb412.js.map | 1 - 78 files changed, 61 insertions(+), 53 deletions(-) rename priv/static/adminfe/{app.796ca6d4.css => app.6684eb28.css} (100%) rename priv/static/adminfe/{chunk-0558.af0d89cd.css => chunk-070d.d2dd6533.css} (100%) create mode 100644 priv/static/adminfe/chunk-0cbc.60bba79b.css create mode 100644 priv/static/adminfe/chunk-143c.43ada4fc.css create mode 100644 priv/static/adminfe/chunk-1609.408dae86.css create mode 100644 priv/static/adminfe/chunk-176e.5d7d957b.css delete mode 100644 priv/static/adminfe/chunk-22d2.813009b9.css create mode 100644 priv/static/adminfe/chunk-43ca.0de86b6d.css rename priv/static/adminfe/{chunk-0961.d3692214.css => chunk-4e7e.5afe1978.css} (100%) create mode 100644 priv/static/adminfe/chunk-5882.f65db7f2.css delete mode 100644 priv/static/adminfe/chunk-6b68.0cc00484.css rename priv/static/adminfe/{chunk-6e81.0e80d020.css => chunk-6e81.ca3b222f.css} (100%) create mode 100644 priv/static/adminfe/chunk-7506.f01f6c2a.css delete mode 100644 priv/static/adminfe/chunk-7637.941c4edb.css rename priv/static/adminfe/{chunk-0778.d9e7180a.css => chunk-7c6b.d9e7180a.css} (100%) delete mode 100644 priv/static/adminfe/chunk-7e30.f2b9674a.css delete mode 100644 priv/static/adminfe/chunk-970d.f59cca8c.css rename priv/static/adminfe/{chunk-3384.d50ed383.css => chunk-c5f4.0827b1ce.css} (76%) create mode 100644 priv/static/adminfe/chunk-commons.7f6d2d11.css delete mode 100644 priv/static/adminfe/chunk-d38a.cabdc22e.css create mode 100644 priv/static/adminfe/chunk-e404.a56021ae.css delete mode 100644 priv/static/adminfe/chunk-e458.6c0703cb.css delete mode 100644 priv/static/adminfe/static/js/app.0146039c.js delete mode 100644 priv/static/adminfe/static/js/app.0146039c.js.map create mode 100644 priv/static/adminfe/static/js/app.3fcec8f6.js create mode 100644 priv/static/adminfe/static/js/app.3fcec8f6.js.map rename priv/static/adminfe/static/js/{chunk-0558.75954137.js => chunk-070d.7e10a520.js} (98%) rename priv/static/adminfe/static/js/{chunk-0558.75954137.js.map => chunk-070d.7e10a520.js.map} (99%) delete mode 100644 priv/static/adminfe/static/js/chunk-0778.b17650df.js.map create mode 100644 priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js create mode 100644 priv/static/adminfe/static/js/chunk-0cbc.43ff796f.js.map create mode 100644 priv/static/adminfe/static/js/chunk-143c.fc1825bf.js create mode 100644 priv/static/adminfe/static/js/chunk-143c.fc1825bf.js.map create mode 100644 priv/static/adminfe/static/js/chunk-1609.98da6b01.js create mode 100644 priv/static/adminfe/static/js/chunk-1609.98da6b01.js.map create mode 100644 priv/static/adminfe/static/js/chunk-176e.c4995511.js create mode 100644 priv/static/adminfe/static/js/chunk-176e.c4995511.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js delete mode 100644 priv/static/adminfe/static/js/chunk-22d2.a0cf7976.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js delete mode 100644 priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map create mode 100644 priv/static/adminfe/static/js/chunk-43ca.3debeff7.js create mode 100644 priv/static/adminfe/static/js/chunk-43ca.3debeff7.js.map rename priv/static/adminfe/static/js/{chunk-0961.ef33e81b.js => chunk-4e7e.91b5e73a.js} (97%) rename priv/static/adminfe/static/js/{chunk-0961.ef33e81b.js.map => chunk-4e7e.91b5e73a.js.map} (99%) rename priv/static/adminfe/static/js/{chunk-7f9e.c49aa694.js => chunk-5118.7c48ad58.js} (99%) rename priv/static/adminfe/static/js/{chunk-7f9e.c49aa694.js.map => chunk-5118.7c48ad58.js.map} (99%) create mode 100644 priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js create mode 100644 priv/static/adminfe/static/js/chunk-5882.7cbc4c1b.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js delete mode 100644 priv/static/adminfe/static/js/chunk-6b68.fbc0f684.js.map rename priv/static/adminfe/static/js/{chunk-6e81.3733ace2.js => chunk-6e81.6efb01f4.js} (97%) rename priv/static/adminfe/static/js/{chunk-6e81.3733ace2.js.map => chunk-6e81.6efb01f4.js.map} (98%) create mode 100644 priv/static/adminfe/static/js/chunk-7506.a3364e53.js create mode 100644 priv/static/adminfe/static/js/chunk-7506.a3364e53.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js delete mode 100644 priv/static/adminfe/static/js/chunk-7637.8f5fb36e.js.map rename priv/static/adminfe/static/js/{chunk-0778.b17650df.js => chunk-7c6b.e63ae1da.js} (83%) create mode 100644 priv/static/adminfe/static/js/chunk-7c6b.e63ae1da.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-7e30.ec42e302.js delete mode 100644 priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-970d.2457e066.js delete mode 100644 priv/static/adminfe/static/js/chunk-970d.2457e066.js.map create mode 100644 priv/static/adminfe/static/js/chunk-c5f4.304479e7.js create mode 100644 priv/static/adminfe/static/js/chunk-c5f4.304479e7.js.map create mode 100644 priv/static/adminfe/static/js/chunk-commons.5a106955.js create mode 100644 priv/static/adminfe/static/js/chunk-commons.5a106955.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-d38a.a851004a.js delete mode 100644 priv/static/adminfe/static/js/chunk-d38a.a851004a.js.map create mode 100644 priv/static/adminfe/static/js/chunk-e404.554bc2e3.js create mode 100644 priv/static/adminfe/static/js/chunk-e404.554bc2e3.js.map delete mode 100644 priv/static/adminfe/static/js/chunk-e458.bb460d81.js delete mode 100644 priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map create mode 100644 priv/static/adminfe/static/js/runtime.5bae86dc.js create mode 100644 priv/static/adminfe/static/js/runtime.5bae86dc.js.map delete mode 100644 priv/static/adminfe/static/js/runtime.b08eb412.js delete mode 100644 priv/static/adminfe/static/js/runtime.b08eb412.js.map 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-143c.43ada4fc.css b/priv/static/adminfe/chunk-143c.43ada4fc.css new file mode 100644 index 000000000..b580e0699 --- /dev/null +++ b/priv/static/adminfe/chunk-143c.43ada4fc.css @@ -0,0 +1 @@ +.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-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-6b68.0cc00484.css b/priv/static/adminfe/chunk-6b68.0cc00484.css deleted file mode 100644 index 7061b3d03..000000000 --- a/priv/static/adminfe/chunk-6b68.0cc00484.css +++ /dev/null @@ -1 +0,0 @@ -.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 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-7e30.f2b9674a.css b/priv/static/adminfe/chunk-7e30.f2b9674a.css deleted file mode 100644 index a4a56712e..000000000 --- a/priv/static/adminfe/chunk-7e30.f2b9674a.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: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}.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-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>p[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}.description>p code[data-v-2b61d370]{display:inline;padding:2px 3px;font-size:14px}.description-container[data-v-2b61d370]{overflow-wrap:break-word;margin-bottom:0}.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}.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}.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%}.setting-label[data-v-2b61d370]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.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-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-3384.d50ed383.css b/priv/static/adminfe/chunk-c5f4.0827b1ce.css similarity index 76% rename from priv/static/adminfe/chunk-3384.d50ed383.css rename to priv/static/adminfe/chunk-c5f4.0827b1ce.css index 70ae2a26b..eb59ca31a 100644 --- a/priv/static/adminfe/chunk-3384.d50ed383.css +++ b/priv/static/adminfe/chunk-c5f4.0827b1ce.css @@ -1 +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}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 +.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.6c0703cb.css b/priv/static/adminfe/chunk-e458.6c0703cb.css deleted file mode 100644 index 6d2a5d996..000000000 --- a/priv/static/adminfe/chunk-e458.6c0703cb.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}.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/index.html b/priv/static/adminfe/index.html index 73e680115..c8f62d0c7 100644 --- a/priv/static/adminfe/index.html +++ b/priv/static/adminfe/index.html @@ -1 +1 @@ -<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=renderer content=webkit><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>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.0146039c.js b/priv/static/adminfe/static/js/app.0146039c.js deleted file mode 100644 index ab08475ad..000000000 --- a/priv/static/adminfe/static/js/app.0146039c.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 E(e,t){return k.apply(this,arguments)}function k(){return(k=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,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)}}},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 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: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 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_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 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)}}()}},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}},Ee=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);Ee.options.__file="SidebarItem.vue";var ke=Ee.exports,Se=n("zx4i"),_e=n.n(Se),Oe={components:{SidebarItem:ke},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,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 ze=Pe.exports,Me=document.body,Be={name:"Layout",components:{Navbar:ce,Sidebar:Ae,AppMain:ze,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 Ne=[""]||!1,Fe=Ne.includes("settings"),Ge={path:"/settings",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-7f9e"),n.e("chunk-7e30")]).then(n.bind(null,"YcIK"))},name:"Settings",meta:{title:"Settings",icon:"settings",noCache:!0}}]},Ye=Ne.includes("statuses"),$e={path:"/statuses",component:Ue,children:[{path:"index",component:function(){return Promise.all([n.e("chunk-df62"),n.e("ZhIB"),n.e("chunk-6b68"),n.e("chunk-e458")]).then(n.bind(null,"FtQ1"))},name:"Statuses",meta:{title:"Statuses",icon:"form",noCache:!0}}]},qe=Ne.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=Ne.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=Ne.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=Ne.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()(Fe?[]:[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),Et=n("QILm"),kt=n.n(Et);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 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]],kt()(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]?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.h)(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 zt(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 Nt.apply(this,arguments)}function Nt(){return(Nt=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 Ft(e,t,n){return Gt.apply(this,arguments)}function Gt(){return(Gt=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:qt(a)});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,zt(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)}}(),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,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,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,Ft(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,Ut({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,Yt({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 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 En(e,t,n){return kn.apply(this,arguments)}function kn(){return(kn=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 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)(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 zn(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)())}:{}},Nn={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,jn(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)}}()}},Fn={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,zn(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,En(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=Fn,$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:{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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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(qn.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 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:Nn,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,"c",function(){return g}),n.d(t,"a",function(){return w}),n.d(t,"d",function(){return y}),n.d(t,"e",function(){return x}),n.d(t,"f",function(){return S}),n.d(t,"g",function(){return O}),n.d(t,"h",function(){return L}),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(!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},{})},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},x=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]]=T(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},{})},T=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}},k=function(e,t){return!(":auto_linker"===e&&":opts"===t)},S=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},L=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:A(t[a],n[e][a])}})},A=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"},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!",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 x}),n.d(t,"h",function(){return E}),n.d(t,"i",function(){return S}),n.d(t,"j",function(){return O}),n.d(t,"k",function(){return A}),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 x(e,t){return T.apply(this,arguments)}function T(){return(T=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 k.apply(this,arguments)}function k(){return(k=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 S(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 L.apply(this,arguments)}function L(){return(L=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 A(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.0146039c.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/app.0146039c.js.map b/priv/static/adminfe/static/js/app.0146039c.js.map deleted file mode 100644 index 178715dc6..000000000 --- a/priv/static/adminfe/static/js/app.0146039c.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","instance","fetchStatusesByInstance","_fetchStatusesByInstance","_callee5","_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","ClearState","DeleteStatus","_DeleteStatus","FetchStatusesCount","_FetchStatusesCount","status_visibility","FetchStatusesByInstance","_FetchStatusesByInstance","FetchStatusesPageByInstance","_FetchStatusesPageByInstance","HandleGodmodeCheckboxChange","HandleLocalCheckboxChange","_ref11","HandleFilterChange","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","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","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","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.0146039c.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(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, 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 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 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 }\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 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 },\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 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/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,OA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","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.b2ebeeca.js b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js deleted file mode 100644 index 6a161a0c6..000000000 --- a/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.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},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:n.b}},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",{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);m.options.__file="SingleEmojiEditor.vue";var p=m.exports,u={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)}}()}},d=(a("IVv3"),Object(r.a)(u,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));d.options.__file="NewEmojiUploader.vue";var h={components:{SingleEmojiEditor:p,NewEmojiUploader:d.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})}}},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,shortcode: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)},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")})}}},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,shortcode: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: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));b.options.__file="RemoteEmojiPack.vue";var j=b.exports,_=a("mSNy"),$={components:{LocalEmojiPack:f,RebootButton:a("rIUS").a,RemoteEmojiPack:j},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")})},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)}}},y=(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));y.options.__file="index.vue";t.default=y.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.b2ebeeca.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map b/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map deleted file mode 100644 index b08db9d6e..000000000 --- a/priv/static/adminfe/static/js/chunk-3384.b2ebeeca.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/views/emojiPacks/index.vue?fe9e","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?575e","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?1029","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","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","keys","files","length","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","$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__","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.b2ebeeca.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=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=55568dc6&\"\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,shortcode){return _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=127f1724&\"\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,shortcode){return _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=250c3227&\"\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-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":"6GAAA,uGCA0MA,GCmK1MC,YAAAC,eAAA,GACAC,KAFA,WAGA,OACAC,OACAC,QACAC,UAAAC,KAAAC,cAAAC,QAAA,UAGAC,cACAC,OAAA,EACAC,UAAA,IAEAC,gBACAR,MAAA,GACAS,KAAA,IAEAC,0BAAA,EACAC,yBAAA,IAGAC,SAAAC,OACAC,OAAAC,EAAA,EAAAD,EACA,cAEAE,cAJA,WAKA,OAAAd,KAAAe,UAAA,gBAEAC,WAPA,WAQA,SAAAC,OAAAL,OAAAM,EAAA,EAAAN,CAAAZ,KAAAmB,UAAA,kBAAAF,OAAAjB,KAAAoB,SAAAC,QAEAN,UAVA,WAWA,kBAAAf,KAAAsB,OAAAC,MAAAC,IAAAC,QAEAC,QAbA,WAcA,OAAA1B,KAAAsB,OAAAC,MAAAI,QAAAD,SAEAN,SAhBA,WAiBA,OAAApB,KAAAsB,OAAAC,MAAAI,QAAAP,UAEAQ,OAnBA,WAoBA,OAAA5B,KAAAsB,OAAAC,MAAAI,QAAAE,gBAGAC,QA5CA,WA6CA9B,KAAAsB,OAAAS,SAAA,eACA/B,KAAAsB,OAAAS,SAAA,cACA/B,KAAAsB,OAAAS,SAAA,sBAEAC,SACAC,kBADA,WAEAjC,KAAAS,yBAAA,EACAT,KAAAQ,0BAAA,EACAR,KAAAsB,OAAAS,SAAA,kBACA/B,KAAAkC,MAAA5B,eAAAR,MAAA,GACAE,KAAAkC,MAAA5B,eAAAC,KAAA,IAEA4B,YARA,WASAnC,KAAAsB,OAAAS,SAAA,sBAAA/B,KAAAkC,MAAA/B,eAEAiC,mBAXA,eAAAC,EAAAC,IAAAC,EAAAC,EAAAC,KAAA,SAAAC,IAAA,IAAAC,EAAA3C,KAAA,OAAAuC,EAAAC,EAAAI,KAAA,SAAAC,GAAA,cAAAA,EAAAC,KAAAD,EAAAE,MAAA,OAYA/C,KAAAgD,MAAA,eAAAC,SAAA,eAAAC,EAAAZ,IAAAC,EAAAC,EAAAC,KAAA,SAAAU,EAAAC,GAAA,OAAAb,EAAAC,EAAAI,KAAA,SAAAS,GAAA,cAAAA,EAAAP,KAAAO,EAAAN,MAAA,WACAK,EADA,CAAAC,EAAAN,KAAA,eAAAM,EAAAN,KAAA,EAEAJ,EAAArB,OAAAS,SAAA,qBAAAY,EAAAT,MAAA5B,gBAFA,OAGAqC,EAAAV,oBAHAoB,EAAAN,KAAA,sBAKAJ,EAAAW,UACAC,KAAA,QACAC,QAAAb,EAAAc,GAAA,6BAPAJ,EAAAK,OAAA,UASA,GATA,wBAAAL,EAAAM,SAAAR,MAAA,gBAAAS,GAAA,OAAAV,EAAAW,MAAA7D,KAAA8D,YAAA,IAZA,wBAAAjB,EAAAc,SAAAjB,EAAA1C,SAAA,yBAAAqC,EAAAwB,MAAA7D,KAAA8D,YAAA,GAyBAC,kBAzBA,SAyBA1C,GACArB,KAAAsB,OAAAS,SAAA,cAAAV,IAEApB,cA5BA,SA4BA+D,EAAAC,EAAAC,GACA,WAAAD,EACAC,EAAA,IAAAC,MAAAnE,KAAAyD,GAAA,6BACAzD,KAAAoE,WAAAH,GAGAC,IAFAA,EAAA,IAAAC,MAAAnE,KAAAyD,GAAA,gCAKAW,WArCA,SAqCAtE,GAEA,MADA,wIACAuE,KAAAvE,8BClPAwE,EAAgB1D,OAAA2D,EAAA,EAAA3D,CACdnB,EHTF,WAA0B,IAAA+E,EAAAxE,KAAayE,EAAAD,EAAAE,eAA0BC,EAAAH,EAAAI,MAAAD,IAAAF,EAAwB,OAAAE,EAAA,OAAiBE,YAAA,sBAAgCF,EAAA,OAAYE,YAAA,6BAAuCF,EAAA,MAAAH,EAAAM,GAAAN,EAAAO,GAAAP,EAAAf,GAAA,4BAAAe,EAAAM,GAAA,KAAAH,EAAA,qBAAAH,EAAAM,GAAA,KAAAH,EAAA,OAAsHE,YAAA,sBAAgCF,EAAA,aAAkBE,YAAA,sBAAAG,IAAsCC,MAAA,SAAAC,GAAyBV,EAAAhE,0BAAA,MAAsCmE,EAAA,QAAAA,EAAA,KAAqBE,YAAA,sBAAgCL,EAAAM,GAAA,aAAAN,EAAAO,GAAAP,EAAAf,GAAA,8CAAAe,EAAAM,GAAA,KAAAH,EAAA,aAA8GE,YAAA,mBAAAG,IAAmCC,MAAA,SAAAC,GAAyBV,EAAA/D,yBAAA,MAAqCkE,EAAA,QAAAA,EAAA,KAAqBE,YAAA,yBAAmCL,EAAAM,GAAA,aAAAN,EAAAO,GAAAP,EAAAf,GAAA,mDAAAe,EAAAM,GAAA,KAAAH,EAAA,aAAmHQ,OAAOC,QAAAZ,EAAAhE,yBAAA6E,cAAA,EAAAC,MAAAd,EAAAf,GAAA,6BAAA8B,eAAA,2BAA+IP,IAAKQ,iBAAA,SAAAN,GAAkCV,EAAAhE,yBAAA0E,MAAsCP,EAAA,WAAgBc,IAAA,eAAAN,OAA0BO,MAAAlB,EAAArE,aAAAwF,cAAAnB,EAAA1D,cAAA8E,cAAA,MAA2EjB,EAAA,gBAAqBQ,OAAOU,MAAArB,EAAAf,GAAA,qBAAkCkB,EAAA,mBAAwBQ,OAAOW,IAAA,EAAAC,KAAAvB,EAAAzD,UAAA,iBAAAR,KAAA,UAAkEmF,OAAQzB,MAAAO,EAAArE,aAAA,OAAA+D,SAAA,SAAA8B,GAAyDxB,EAAAyB,KAAAzB,EAAArE,aAAA,SAAA6F,IAA0CE,WAAA,0BAAmC,GAAA1B,EAAAM,GAAA,KAAAH,EAAA,gBAAqCQ,OAAOU,MAAArB,EAAAf,GAAA,wBAAqCkB,EAAA,kBAAuBE,YAAA,YAAAM,OAA+BgB,YAAA3B,EAAAf,GAAA,oBAAAF,KAAA,OAAAhD,KAAA,OAAA6F,eAAA,cAAiGV,OAAQzB,MAAAO,EAAArE,aAAA,UAAA+D,SAAA,SAAA8B,GAA4DxB,EAAAyB,KAAAzB,EAAArE,aAAA,YAAA6F,IAA6CE,WAAA,6BAAsC,OAAA1B,EAAAM,GAAA,KAAAH,EAAA,QAAiCQ,OAAOkB,KAAA,UAAgBA,KAAA,WAAe1B,EAAA,aAAkBE,YAAA,uBAAAG,IAAuCC,MAAAT,EAAAvC,qBAA+BuC,EAAAM,GAAAN,EAAAO,GAAAP,EAAAf,GAAA,sBAAAe,EAAAM,GAAA,KAAAH,EAAA,aAAyEQ,OAAO5B,KAAA,WAAiByB,IAAKC,MAAAT,EAAArC,eAAyBqC,EAAAM,GAAAN,EAAAO,GAAAP,EAAAf,GAAA,0BAAAe,EAAAM,GAAA,eAAAN,EAAApD,SAAAuD,EAAA,WAAAA,EAAA,OAA+GE,YAAA,WAAAM,OAA8BkB,KAAA,UAAgBA,KAAA,WAAe1B,EAAA,QAAAH,EAAAM,GAAAN,EAAAO,GAAAP,EAAAf,GAAA,8BAAAe,EAAAM,GAAA,KAAAH,EAAA,WAA0FE,YAAA,iBAAAM,OAAoCQ,cAAA,UAAsBhB,EAAA,gBAAqBQ,OAAOU,MAAArB,EAAAf,GAAA,yBAAsCkB,EAAA,WAAgBQ,OAAOmB,KAAA9B,EAAAxD,WAAAuF,WAAA,EAAAC,OAAA,YAA2DhC,EAAAM,GAAA,iBAAAN,EAAAO,GAAAP,EAAAxD,YAAA,sBAAAwD,EAAAM,GAAA,KAAAH,EAAA,gBAAsGQ,OAAOU,MAAArB,EAAAf,GAAA,oBAAiCe,EAAAM,GAAA,eAAAN,EAAAO,GAAAP,EAAApD,SAAAC,OAAA,gBAAAmD,EAAAM,GAAA,KAAAH,EAAA,gBAAkGQ,OAAOU,MAAArB,EAAAf,GAAA,qBAAkCe,EAAAM,GAAA,eAAAN,EAAAO,GAAAP,EAAApD,SAAAhB,QAAA,gBAAAoE,EAAAM,GAAA,KAAAH,EAAA,gBAAmGQ,OAAOU,MAAArB,EAAAf,GAAA,wBAAqCe,EAAAM,GAAA,eAAAN,EAAAO,GAAAP,EAAApD,SAAAf,WAAA,qCAAAmE,EAAAiC,MAAA,GAAAjC,EAAAM,GAAA,KAAAH,EAAA,aAAuIQ,OAAOC,QAAAZ,EAAA/D,wBAAA4E,cAAA,EAAAC,MAAAd,EAAAf,GAAA,4BAAA8B,eAAA,2BAA6IP,IAAKQ,iBAAA,SAAAN,GAAkCV,EAAA/D,wBAAAyE,MAAqCP,EAAA,OAAAA,EAAA,KAAoBE,YAAA,SAAmBL,EAAAM,GAAAN,EAAAO,GAAAP,EAAAf,GAAA,mCAAAe,EAAAM,GAAA,KAAAH,EAAA,WAAoFc,IAAA,iBAAAN,OAA4BO,MAAAlB,EAAAlE,eAAAT,MAAA2E,EAAA3E,MAAA8F,cAAAnB,EAAA1D,cAAA8E,cAAA,MAA+FjB,EAAA,gBAAqBQ,OAAOU,MAAArB,EAAAf,GAAA,iBAAAiD,KAAA,WAAgD/B,EAAA,YAAiBQ,OAAO5E,KAAA,QAAAgD,KAAA,QAAAoD,UAAA,IAA6CjB,OAAQzB,MAAAO,EAAAlE,eAAA,MAAA4D,SAAA,SAAA8B,GAA0DxB,EAAAyB,KAAAzB,EAAAlE,eAAA,QAAA0F,IAA2CE,WAAA,2BAAoC,GAAA1B,EAAAM,GAAA,KAAAH,EAAA,gBAAqCQ,OAAOU,MAAArB,EAAAf,GAAA,gBAAAiD,KAAA,UAA8C/B,EAAA,YAAiBQ,OAAO5E,KAAA,QAAcmF,OAAQzB,MAAAO,EAAAlE,eAAA,KAAA4D,SAAA,SAAA8B,GAAyDxB,EAAAyB,KAAAzB,EAAAlE,eAAA,OAAA0F,IAA0CE,WAAA,0BAAmC,WAAA1B,EAAAM,GAAA,KAAAH,EAAA,QAAqCQ,OAAOkB,KAAA,UAAgBA,KAAA,WAAe1B,EAAA,aAAkBK,IAAIC,MAAAT,EAAAvC,qBAA+BuC,EAAAM,GAAAN,EAAAO,GAAAP,EAAAf,GAAA,sBAAAe,EAAAM,GAAA,KAAAH,EAAA,aAAyEQ,OAAO5B,KAAA,WAAiByB,IAAKC,MAAAT,EAAApC,sBAAgCoC,EAAAM,GAAAN,EAAAO,GAAAP,EAAAf,GAAA,4BAAAe,EAAAM,GAAA,KAAAH,EAAA,YAA8EiC,aAAarG,KAAA,UAAAsG,QAAA,YAAA5C,MAAAO,EAAA,QAAA0B,WAAA,YAA4ErB,YAAA,qBAAAM,OAA0CvF,KAAA4E,EAAA5C,OAAAkF,gBAAkCJ,KAAA,OAAAK,MAAA,gBAAmCvC,EAAA,UAAAG,EAAA,mBAAwCQ,OAAOU,MAAArB,EAAAf,GAAA,cAAAuD,YAAA,KAAAN,KAAA,KAAAO,SAAA,MAAyEzC,EAAAiC,KAAAjC,EAAAM,GAAA,KAAAH,EAAA,mBAA6CQ,OAAOU,MAAArB,EAAAf,GAAA,iBAAAuD,YAAAxC,EAAAzD,UAAA,QAAA2F,KAAA,WAAsFlC,EAAAM,GAAA,KAAAN,EAAA,UAAAG,EAAA,mBAAoDQ,OAAOU,MAAArB,EAAAf,GAAA,qBAAAyD,MAAA,SAAAC,eAAA,SAAAH,YAAA,MAAAN,KAAA,aAAAO,SAAA,MAAkIzC,EAAAiC,KAAAjC,EAAAM,GAAA,KAAAH,EAAA,mBAA6CQ,OAAOU,MAAArB,EAAAf,GAAA,kBAAAyD,MAAA,SAAAC,eAAA,SAAAH,YAAA,KAAAN,KAAA,UAAAO,SAAA,MAA2HzC,EAAAM,GAAA,KAAAN,EAAA,UAAAG,EAAA,mBAAoDQ,OAAOU,MAAArB,EAAAf,GAAA,gBAAAyD,MAAA,SAAAC,eAAA,SAAAH,YAAA,KAAAN,KAAA,UAAwGlC,EAAAiC,KAAAjC,EAAAM,GAAA,KAAAH,EAAA,mBAA6CQ,OAAOU,MAAArB,EAAAf,GAAA,gBAAAuD,YAAAxC,EAAAzD,UAAA,MAAAmG,MAAA,SAAAC,eAAA,SAAAT,KAAA,OAAAO,SAAA,IAAwIG,YAAA5C,EAAA6C,KAAsBC,IAAA,UAAAC,GAAA,SAAAC,GAAiC,OAAA7C,EAAA,UAAqBQ,OAAO5B,KAAAiE,EAAAC,IAAAC,KAAA,mBAAAC,sBAAA,MAAuEnD,EAAAM,GAAA,eAAAN,EAAAO,GAAAyC,EAAAC,IAAAC,KAAAlD,EAAAf,GAAA,gBAAAe,EAAAf,GAAA,0CAAwHe,EAAAM,GAAA,KAAAH,EAAA,mBAAoCQ,OAAOU,MAAArB,EAAAf,GAAA,mBAAAuD,YAAAxC,EAAAzD,UAAA,OAAAmG,MAAA,SAAAC,eAAA,UAAgHC,YAAA5C,EAAA6C,KAAsBC,IAAA,UAAAC,GAAA,SAAAC,GAAiC,OAAA7C,EAAA,aAAwBQ,OAAO5B,KAAA,OAAAwC,KAAA,SAA6B6B,UAAW3C,MAAA,SAAAC,GAAyB,OAAAV,EAAAT,kBAAAyD,EAAAC,IAAApG,WAAgDmD,EAAAM,GAAA,eAAAN,EAAAO,GAAAP,EAAAf,GAAA,2CAA8E,YGY/0M,EACA,KACA,KACA,MAIAa,EAAAuD,QAAAC,OAAA,YACeC,EAAA,QAAAzD,6CCpBf,IAAA0D,EAAAC,EAAA,QAAAA,EAAAC,EAAAF,GAAud","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-7e30.ec42e302.js b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js deleted file mode 100644 index 0a0e1ca34..000000000 --- a/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js +++ /dev/null @@ -1,2 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-7e30"],{"+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"),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",":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"]}},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+")),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),j=i("J4zp"),M=i.n(j),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 M()(e,1)[0][":url"]},getMimeType:function(t){var e=Object.values(t);return M()(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,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})}}},I=(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));I.options.__file="ProxyUrlInput.vue";var E=I.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 N=z.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}))}}},B=(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));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:""},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:E,PruneInput:K,RateLimitInput:N,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")||":args"===this.setting.key)},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)})}}},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(" "),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: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(" "),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: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)}}()}},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: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(" "),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: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(" "),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: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)(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,jt={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"])||{}},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)}}()}},Mt=(i("KFE3"),Object(m.a)(jt,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));Mt.options.__file="Http.vue";var Tt=Mt.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(" "),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: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)}}()}},It=(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));It.options.__file="JobQueue.vue";var Et=It.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(" "),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: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)}}()}},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 Nt=zt.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(" "),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: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(" "),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:"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}},[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: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,fe={components:{ActivityPub:dt,Authentication:mt,AutoLinker:vt,Captcha:kt,Esshd:wt,Frontend:$t,Gopher:Ut,Http:Tt,Instance:Wt,JobQueue:Et,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}}))},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){},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){},y7KD:function(t,e,i){"use strict";var s=i("YKHE");i.n(s).a}}]); -//# sourceMappingURL=chunk-7e30.ec42e302.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map b/priv/static/adminfe/static/js/chunk-7e30.ec42e302.js.map deleted file mode 100644 index bc47158ea..000000000 --- a/priv/static/adminfe/static/js/chunk-7e30.ec42e302.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/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?2907","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?7bc9","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?4f2a","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?82b9","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/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/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","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__","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_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-7e30.ec42e302.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=411d006e&\"\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\":\"\"},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=73a4e7f2&\"\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=641b2402&\"\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=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=03c3fd9d&\"\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:\"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&\"","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!./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-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.bb460d81.js b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js deleted file mode 100644 index a08717166..000000000 --- a/priv/static/adminfe/static/js/chunk-e458.bb460d81.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=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(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")},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(t){void 0===this.selectedUsers.find(function(s){return t.id===s.id})&&(this.selectedUsers=[].concat(n()(this.selectedUsers),[t]))},normalizedCount:function(t){return u()(t).format("0a")}}},d=(e("QOJ7"),e("KHd+")),h=Object(d.a)(l,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",{staticClass:"direct-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.direct"))+": "+t._s(t.normalizedCount(t.statusVisibility.direct))+"\n ")]),t._v(" "),e("el-button",{staticClass:"private-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.private"))+": "+t._s(t.normalizedCount(t.statusVisibility.private))+"\n ")]),t._v(" "),e("el-button",{staticClass:"public-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.public"))+": "+t._s(t.normalizedCount(t.statusVisibility.public))+"\n ")]),t._v(" "),e("el-button",{staticClass:"unlisted-button",attrs:{plain:""}},[t._v("\n "+t._s(t.$t("statuses.unlisted"))+": "+t._s(t.normalizedCount(t.statusVisibility.unlisted))+"\n ")])],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);h.options.__file="index.vue";s.default=h.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.bb460d81.js.map \ No newline at end of file diff --git a/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map b/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map deleted file mode 100644 index 89f05fb99..000000000 --- a/priv/static/adminfe/static/js/chunk-e458.bb460d81.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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/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","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","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","$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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A,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,UAA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","file":"static/js/chunk-e458.bb460d81.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&\"","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.5bae86dc.js b/priv/static/adminfe/static/js/runtime.5bae86dc.js new file mode 100644 index 000000000..e5fb1554b --- /dev/null +++ b/priv/static/adminfe/static/js/runtime.5bae86dc.js @@ -0,0 +1,2 @@ +!function(e){function n(n){for(var t,r,a=n[0],f=n[1],h=n[2],i=0,l=[];i Date: Fri, 26 Jun 2020 05:33:59 +0200 Subject: [PATCH 460/492] nodeinfo: Fix MRF transparency --- lib/pleroma/web/nodeinfo/nodeinfo.ex | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/lib/pleroma/web/nodeinfo/nodeinfo.ex b/lib/pleroma/web/nodeinfo/nodeinfo.ex index d26b7c938..f7ab6d86a 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo.ex @@ -6,30 +6,19 @@ defmodule Pleroma.Web.Nodeinfo.Nodeinfo do alias Pleroma.Config alias Pleroma.Stats alias Pleroma.User - alias Pleroma.Web.ActivityPub.MRF 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() - quarantined = Config.get([:instance, :quarantined_instances], []) - staff_accounts = User.all_superusers() |> Enum.map(fn u -> u.ap_id end) - federation_response = - if Config.get([:instance, :mrf_transparency]) do - {:ok, data} = MRF.describe() - - data - |> Map.merge(%{quarantined_instances: quarantined}) - else - %{} - end - |> Map.put(:enabled, Config.get([:instance, :federating])) + federation = InstanceView.federation() features = [ @@ -86,7 +75,7 @@ def get_nodeinfo("2.0") do enabled: false }, staffAccounts: staff_accounts, - federation: federation_response, + federation: federation, pollLimits: Config.get([:instance, :poll_limits]), postFormats: Config.get([:instance, :allowed_post_formats]), uploadLimits: %{ From c3383d4fab6181d9f605a6058805333611534398 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 26 Jun 2020 11:58:40 +0200 Subject: [PATCH 461/492] BlockValidator: Restore old behavior for incoming blocks. --- .../object_validators/block_validator.ex | 13 +++++++++++++ lib/pleroma/web/activity_pub/side_effects.ex | 1 - test/web/activity_pub/object_validator_test.exs | 8 +++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/activity_pub/object_validators/block_validator.ex b/lib/pleroma/web/activity_pub/object_validators/block_validator.ex index 1dde77198..1989585b7 100644 --- a/lib/pleroma/web/activity_pub/object_validators/block_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/block_validator.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator do use Ecto.Schema alias Pleroma.EctoType.ActivityPub.ObjectValidators + alias Pleroma.User import Ecto.Changeset import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @@ -32,6 +33,7 @@ def validate_data(cng) do |> validate_inclusion(:type, ["Block"]) |> validate_actor_presence() |> validate_actor_presence(field_name: :object) + |> validate_block_acceptance() end def cast_and_validate(data) do @@ -39,4 +41,15 @@ def cast_and_validate(data) do |> cast_data |> validate_data end + + def validate_block_acceptance(cng) do + actor = get_field(cng, :actor) |> User.get_cached_by_ap_id() + + if actor.local || Pleroma.Config.get([:activitypub, :unfollow_blocked], true) do + cng + else + cng + |> add_error(:actor, "Not accepting remote blocks") + end + end end diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 48350d2b3..5cc2eb378 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -29,7 +29,6 @@ def handle( ) do with %User{} = blocker <- User.get_cached_by_ap_id(blocking_user), %User{} = blocked <- User.get_cached_by_ap_id(blocked_user) do - User.unfollow(blocker, blocked) User.block(blocker, blocked) end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index e96552763..a3d43ef3c 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -657,7 +657,7 @@ test "returns an error if the object can't be updated by the actor", %{ describe "blocks" do setup do - user = insert(:user) + user = insert(:user, local: false) blocked = insert(:user) {:ok, valid_block, []} = Builder.block(user, blocked) @@ -680,5 +680,11 @@ test "returns an error if we don't know the blocked user", %{ assert {:error, _cng} = ObjectValidator.validate(block, []) end + + test "returns an error if don't accept remote blocks", %{valid_block: valid_block} do + clear_config([:activitypub, :unfollow_blocked], false) + + assert {:error, _cng} = ObjectValidator.validate(valid_block, []) + end end end From 15a8b703185c685fc3d25a381fcb9dee522c78bf Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 26 Jun 2020 12:06:00 +0200 Subject: [PATCH 462/492] User: Don't unfollow on block when the relevant setting is set. --- lib/pleroma/user.ex | 3 ++- .../object_validators/block_validator.ex | 13 ------------- test/web/activity_pub/object_validator_test.exs | 6 ------ test/web/activity_pub/side_effects_test.exs | 16 ++++++++++++++++ 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index c3e2a89ad..9d5c61e79 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1309,7 +1309,8 @@ def block(%User{} = blocker, %User{} = blocked) 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) diff --git a/lib/pleroma/web/activity_pub/object_validators/block_validator.ex b/lib/pleroma/web/activity_pub/object_validators/block_validator.ex index 1989585b7..1dde77198 100644 --- a/lib/pleroma/web/activity_pub/object_validators/block_validator.ex +++ b/lib/pleroma/web/activity_pub/object_validators/block_validator.ex @@ -6,7 +6,6 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.BlockValidator do use Ecto.Schema alias Pleroma.EctoType.ActivityPub.ObjectValidators - alias Pleroma.User import Ecto.Changeset import Pleroma.Web.ActivityPub.ObjectValidators.CommonValidations @@ -33,7 +32,6 @@ def validate_data(cng) do |> validate_inclusion(:type, ["Block"]) |> validate_actor_presence() |> validate_actor_presence(field_name: :object) - |> validate_block_acceptance() end def cast_and_validate(data) do @@ -41,15 +39,4 @@ def cast_and_validate(data) do |> cast_data |> validate_data end - - def validate_block_acceptance(cng) do - actor = get_field(cng, :actor) |> User.get_cached_by_ap_id() - - if actor.local || Pleroma.Config.get([:activitypub, :unfollow_blocked], true) do - cng - else - cng - |> add_error(:actor, "Not accepting remote blocks") - end - end end diff --git a/test/web/activity_pub/object_validator_test.exs b/test/web/activity_pub/object_validator_test.exs index a3d43ef3c..f38bf7e08 100644 --- a/test/web/activity_pub/object_validator_test.exs +++ b/test/web/activity_pub/object_validator_test.exs @@ -680,11 +680,5 @@ test "returns an error if we don't know the blocked user", %{ assert {:error, _cng} = ObjectValidator.validate(block, []) end - - test "returns an error if don't accept remote blocks", %{valid_block: valid_block} do - clear_config([:activitypub, :unfollow_blocked], false) - - assert {:error, _cng} = ObjectValidator.validate(valid_block, []) - end end end diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index 36792f015..af27c34b4 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -87,6 +87,22 @@ test "it unfollows and blocks", %{user: user, blocked: blocked, block: block} do 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 From 7ed229641667f52dd82eb7c388ea28e79e09e507 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 26 Jun 2020 13:04:15 +0200 Subject: [PATCH 463/492] Nodeinfo: Add chat information back in. --- lib/pleroma/web/nodeinfo/nodeinfo.ex | 30 +--------------------------- test/web/node_info_test.exs | 3 ++- 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/lib/pleroma/web/nodeinfo/nodeinfo.ex b/lib/pleroma/web/nodeinfo/nodeinfo.ex index f7ab6d86a..47fa46376 100644 --- a/lib/pleroma/web/nodeinfo/nodeinfo.ex +++ b/lib/pleroma/web/nodeinfo/nodeinfo.ex @@ -19,35 +19,7 @@ def get_nodeinfo("2.0") do |> Enum.map(fn u -> u.ap_id end) federation = InstanceView.federation() - - features = - [ - "pleroma_api", - "mastodon_api", - "mastodon_api_streaming", - "polls", - "pleroma_explicit_addressing", - "shareable_emoji_packs", - "multifetch", - "pleroma:api/v1/notifications:include_types_filter", - if Config.get([:media_proxy, :enabled]) do - "media_proxy" - end, - if Config.get([:gopher, :enabled]) do - "gopher" - end, - if Config.get([:chat, :enabled]) do - "chat" - end, - if Config.get([:instance, :allow_relay]) do - "relay" - end, - if Config.get([:instance, :safe_dm_mentions]) do - "safe_dm_mentions" - end, - "pleroma_emoji_reactions" - ] - |> Enum.filter(& &1) + features = InstanceView.features() %{ version: "2.0", diff --git a/test/web/node_info_test.exs b/test/web/node_info_test.exs index 8b3b6177d..06b33607f 100644 --- a/test/web/node_info_test.exs +++ b/test/web/node_info_test.exs @@ -142,7 +142,8 @@ test "it shows default features flags", %{conn: conn} 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?( From 4a7a34ae8c2ad12b2b9903c1d70bfe85d10af49e Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 26 Jun 2020 14:47:38 +0200 Subject: [PATCH 464/492] Preloading: Return correct data for statusnet stuff. --- lib/pleroma/web/preload/status_net.ex | 9 +++++---- test/web/preload/status_net_test.exs | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/pleroma/web/preload/status_net.ex b/lib/pleroma/web/preload/status_net.ex index 367442d5c..810ad512b 100644 --- a/lib/pleroma/web/preload/status_net.ex +++ b/lib/pleroma/web/preload/status_net.ex @@ -4,7 +4,7 @@ defmodule Pleroma.Web.Preload.Providers.StatusNet do alias Pleroma.Web.Preload.Providers.Provider - alias Pleroma.Web.TwitterAPI.UtilView + alias Pleroma.Web.TwitterAPI.UtilController @behaviour Provider @config_url :"/api/statusnet/config.json" @@ -16,9 +16,10 @@ def generate_terms(_params) do end defp build_config_tag(acc) do - instance = Pleroma.Config.get(:instance) - info_data = UtilView.status_net_config(instance) + resp = + Plug.Test.conn(:get, @config_url |> to_string()) + |> UtilController.config(nil) - Map.put(acc, @config_url, info_data) + Map.put(acc, @config_url, resp.resp_body) end end diff --git a/test/web/preload/status_net_test.exs b/test/web/preload/status_net_test.exs index ab6823a7e..2cdc82930 100644 --- a/test/web/preload/status_net_test.exs +++ b/test/web/preload/status_net_test.exs @@ -9,6 +9,7 @@ defmodule Pleroma.Web.Preload.Providers.StatusNetTest do setup do: {:ok, StatusNet.generate_terms(nil)} test "it renders the info", %{"/api/statusnet/config.json": info} do - assert info =~ "Pleroma" + assert {:ok, res} = Jason.decode(info) + assert res["site"] end end From a2002ebb6393d53030d5fc565bae90f3fedd48a8 Mon Sep 17 00:00:00 2001 From: lain Date: Fri, 26 Jun 2020 14:48:23 +0200 Subject: [PATCH 465/492] Preloading: Fix nodeinfo url. --- lib/pleroma/web/preload/instance.ex | 2 +- test/web/preload/instance_test.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/preload/instance.ex b/lib/pleroma/web/preload/instance.ex index 0b6fd3313..3b95fe403 100644 --- a/lib/pleroma/web/preload/instance.ex +++ b/lib/pleroma/web/preload/instance.ex @@ -10,7 +10,7 @@ defmodule Pleroma.Web.Preload.Providers.Instance do @behaviour Provider @instance_url :"/api/v1/instance" @panel_url :"/instance/panel.html" - @nodeinfo_url :"/nodeinfo/2.0" + @nodeinfo_url :"/nodeinfo/2.0.json" @impl Provider def generate_terms(_params) do diff --git a/test/web/preload/instance_test.exs b/test/web/preload/instance_test.exs index 42a0d87bc..51b9dc549 100644 --- a/test/web/preload/instance_test.exs +++ b/test/web/preload/instance_test.exs @@ -25,7 +25,7 @@ test "it renders the panel", %{"/instance/panel.html": panel} do ) end - test "it renders the node_info", %{"/nodeinfo/2.0": nodeinfo} do + test "it renders the node_info", %{"/nodeinfo/2.0.json": nodeinfo} do %{ metadata: metadata, version: "2.0" From 1566543bec70e6497df77ed83bf4d3cc39c116eb Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Fri, 26 Jun 2020 20:10:47 +0200 Subject: [PATCH 466/492] object/fetcher: Pass full Transmogrifier error --- lib/pleroma/object/fetcher.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 @@ def fetch_object_from_id(id, options \\ []) do {:transmogrifier, {:error, {:reject, nil}}} -> {:reject, nil} - {:transmogrifier, _} -> - {:error, "Transmogrifier failure."} + {:transmogrifier, _} = e -> + {:error, e} {:object, data, nil} -> reinject_object(%Object{}, data) From 0313520cd2164e8abe671c7a0663246366ee30e9 Mon Sep 17 00:00:00 2001 From: lain Date: Sat, 27 Jun 2020 12:18:37 +0200 Subject: [PATCH 467/492] Config: Reduce default preloaders to configuration endpoints. Fetching the timeline is a bit heavy to do by default. --- config/config.exs | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/config.exs b/config/config.exs index 5b1c576e7..9b550920c 100644 --- a/config/config.exs +++ b/config/config.exs @@ -437,8 +437,6 @@ config :pleroma, Pleroma.Web.Preload, providers: [ Pleroma.Web.Preload.Providers.Instance, - Pleroma.Web.Preload.Providers.User, - Pleroma.Web.Preload.Providers.Timelines, Pleroma.Web.Preload.Providers.StatusNet ] From efb5d64e5089ab59d8304f49f7c92fcab6e00b86 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Mon, 29 Jun 2020 02:39:26 +0200 Subject: [PATCH 468/492] differences_in_mastoapi_responses: Update account fields --- docs/API/differences_in_mastoapi_responses.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/API/differences_in_mastoapi_responses.md b/docs/API/differences_in_mastoapi_responses.md index 7c3546f4f..c100ae83b 100644 --- a/docs/API/differences_in_mastoapi_responses.md +++ b/docs/API/differences_in_mastoapi_responses.md @@ -51,11 +51,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 @@ -66,6 +69,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 From 9f51b03eed85d4a3ea24e1d449fcb4969f299096 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Mon, 29 Jun 2020 03:31:33 +0200 Subject: [PATCH 469/492] ApiSpec.Schemas.Account: import description from differences_in_mastoapi_responses --- lib/pleroma/web/api_spec/schemas/account.ex | 83 +++++++++++++++++---- 1 file changed, 67 insertions(+), 16 deletions(-) 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" + } } } } From a19f8778afddb7f504b08cedde752e37da52dc96 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 29 Jun 2020 11:06:20 +0200 Subject: [PATCH 470/492] User preloader: Put user info at correct key --- lib/pleroma/web/preload/user.ex | 11 ++++++----- test/web/preload/user_test.exs | 14 +++++++------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/pleroma/web/preload/user.ex b/lib/pleroma/web/preload/user.ex index 3a244845b..7fef0a4ac 100644 --- a/lib/pleroma/web/preload/user.ex +++ b/lib/pleroma/web/preload/user.ex @@ -3,11 +3,12 @@ # 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 :"/api/v1/accounts" + @account_url_base :"/api/v1/accounts" @impl Provider def generate_terms(%{user: user}) do @@ -16,10 +17,10 @@ def generate_terms(%{user: user}) do def generate_terms(_params), do: %{} - def build_accounts_tag(acc, nil), do: acc - - def build_accounts_tag(acc, user) do + def build_accounts_tag(acc, %User{} = user) do account_data = AccountView.render("show.json", %{user: user, for: user}) - Map.put(acc, @account_url, account_data) + Map.put(acc, :"#{@account_url_base}/#{user.id}", account_data) end + + def build_accounts_tag(acc, _), do: acc end diff --git a/test/web/preload/user_test.exs b/test/web/preload/user_test.exs index 99232cdfa..68d69d977 100644 --- a/test/web/preload/user_test.exs +++ b/test/web/preload/user_test.exs @@ -9,13 +9,11 @@ defmodule Pleroma.Web.Preload.Providers.UserTest do describe "returns empty when user doesn't exist" do test "nil user specified" do - refute User.generate_terms(%{user: nil}) - |> Map.has_key?("/api/v1/accounts") + assert User.generate_terms(%{user: nil}) == %{} end test "missing user specified" do - refute User.generate_terms(%{user: :not_a_user}) - |> Map.has_key?("/api/v1/accounts") + assert User.generate_terms(%{user: :not_a_user}) == %{} end end @@ -23,11 +21,13 @@ test "missing user specified" do setup do user = insert(:user) - {:ok, User.generate_terms(%{user: user})} + terms = User.generate_terms(%{user: user}) + %{terms: terms, user: user} end - test "account is rendered", %{"/api/v1/accounts": accounts} do - assert %{acct: user, username: user} = accounts + 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 From 8630a6c7f52a68ab32025b1c80a6398599908c68 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 29 Jun 2020 11:41:00 +0200 Subject: [PATCH 471/492] Preloaders: Use strings as keys. --- lib/pleroma/web/preload/instance.ex | 6 +++--- lib/pleroma/web/preload/status_net.ex | 2 +- lib/pleroma/web/preload/timelines.ex | 2 +- lib/pleroma/web/preload/user.ex | 4 ++-- test/web/preload/instance_test.exs | 6 +++--- test/web/preload/status_net_test.exs | 2 +- test/web/preload/timeline_test.exs | 2 +- test/web/preload/user_test.exs | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/pleroma/web/preload/instance.ex b/lib/pleroma/web/preload/instance.ex index 3b95fe403..b34d7cf37 100644 --- a/lib/pleroma/web/preload/instance.ex +++ b/lib/pleroma/web/preload/instance.ex @@ -8,9 +8,9 @@ defmodule Pleroma.Web.Preload.Providers.Instance do alias Pleroma.Web.Preload.Providers.Provider @behaviour Provider - @instance_url :"/api/v1/instance" - @panel_url :"/instance/panel.html" - @nodeinfo_url :"/nodeinfo/2.0.json" + @instance_url "/api/v1/instance" + @panel_url "/instance/panel.html" + @nodeinfo_url "/nodeinfo/2.0.json" @impl Provider def generate_terms(_params) do diff --git a/lib/pleroma/web/preload/status_net.ex b/lib/pleroma/web/preload/status_net.ex index 810ad512b..9b62f87a2 100644 --- a/lib/pleroma/web/preload/status_net.ex +++ b/lib/pleroma/web/preload/status_net.ex @@ -7,7 +7,7 @@ defmodule Pleroma.Web.Preload.Providers.StatusNet do alias Pleroma.Web.TwitterAPI.UtilController @behaviour Provider - @config_url :"/api/statusnet/config.json" + @config_url "/api/statusnet/config.json" @impl Provider def generate_terms(_params) do diff --git a/lib/pleroma/web/preload/timelines.ex b/lib/pleroma/web/preload/timelines.ex index e531b8960..57de04051 100644 --- a/lib/pleroma/web/preload/timelines.ex +++ b/lib/pleroma/web/preload/timelines.ex @@ -8,7 +8,7 @@ defmodule Pleroma.Web.Preload.Providers.Timelines do alias Pleroma.Web.Preload.Providers.Provider @behaviour Provider - @public_url :"/api/v1/timelines/public" + @public_url "/api/v1/timelines/public" @impl Provider def generate_terms(params) do diff --git a/lib/pleroma/web/preload/user.ex b/lib/pleroma/web/preload/user.ex index 7fef0a4ac..b3d2e9b8d 100644 --- a/lib/pleroma/web/preload/user.ex +++ b/lib/pleroma/web/preload/user.ex @@ -8,7 +8,7 @@ defmodule Pleroma.Web.Preload.Providers.User do alias Pleroma.Web.Preload.Providers.Provider @behaviour Provider - @account_url_base :"/api/v1/accounts" + @account_url_base "/api/v1/accounts" @impl Provider def generate_terms(%{user: user}) do @@ -19,7 +19,7 @@ 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) + Map.put(acc, "#{@account_url_base}/#{user.id}", account_data) end def build_accounts_tag(acc, _), do: acc diff --git a/test/web/preload/instance_test.exs b/test/web/preload/instance_test.exs index 51b9dc549..5bb6c5981 100644 --- a/test/web/preload/instance_test.exs +++ b/test/web/preload/instance_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Web.Preload.Providers.InstanceTest do setup do: {:ok, Instance.generate_terms(nil)} - test "it renders the info", %{"/api/v1/instance": info} do + test "it renders the info", %{"/api/v1/instance" => info} do assert %{ description: description, email: "admin@example.com", @@ -18,14 +18,14 @@ test "it renders the info", %{"/api/v1/instance": info} do assert String.equivalent?(description, "Pleroma: An efficient and flexible fediverse server") end - test "it renders the panel", %{"/instance/panel.html": panel} do + test "it renders the panel", %{"/instance/panel.html" => panel} do assert String.contains?( panel, "

    Welcome to Pleroma!

    " ) end - test "it renders the node_info", %{"/nodeinfo/2.0.json": nodeinfo} do + test "it renders the node_info", %{"/nodeinfo/2.0.json" => nodeinfo} do %{ metadata: metadata, version: "2.0" diff --git a/test/web/preload/status_net_test.exs b/test/web/preload/status_net_test.exs index 2cdc82930..df7acdb11 100644 --- a/test/web/preload/status_net_test.exs +++ b/test/web/preload/status_net_test.exs @@ -8,7 +8,7 @@ defmodule Pleroma.Web.Preload.Providers.StatusNetTest do setup do: {:ok, StatusNet.generate_terms(nil)} - test "it renders the info", %{"/api/statusnet/config.json": info} do + test "it renders the info", %{"/api/statusnet/config.json" => info} do assert {:ok, res} = Jason.decode(info) assert res["site"] end diff --git a/test/web/preload/timeline_test.exs b/test/web/preload/timeline_test.exs index da6a3aded..fea95a6a4 100644 --- a/test/web/preload/timeline_test.exs +++ b/test/web/preload/timeline_test.exs @@ -9,7 +9,7 @@ defmodule Pleroma.Web.Preload.Providers.TimelineTest do alias Pleroma.Web.CommonAPI alias Pleroma.Web.Preload.Providers.Timelines - @public_url :"/api/v1/timelines/public" + @public_url "/api/v1/timelines/public" describe "unauthenticated timeliness when restricted" do setup do diff --git a/test/web/preload/user_test.exs b/test/web/preload/user_test.exs index 68d69d977..83f065e27 100644 --- a/test/web/preload/user_test.exs +++ b/test/web/preload/user_test.exs @@ -26,7 +26,7 @@ test "missing user specified" do end test "account is rendered", %{terms: terms, user: user} do - account = terms[:"/api/v1/accounts/#{user.id}"] + account = terms["/api/v1/accounts/#{user.id}"] assert %{acct: user, username: user} = account end end From e64d08439ea171f1090e0bfa927f3c83cb9522b0 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 29 Jun 2020 12:40:23 +0200 Subject: [PATCH 472/492] UpdateCredentialsTest: Add test for removing profile images. --- .../update_credentials_test.exs | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) 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 f67d294ba..31f0edf97 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 @@ -216,10 +216,20 @@ test "updates the user's avatar", %{user: user, conn: conn} do filename: "an_image.jpg" } - conn = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) + res = + conn + |> patch("/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) - assert user_response = json_response_and_validate_schema(conn, 200) + assert user_response = json_response_and_validate_schema(res, 200) assert user_response["avatar"] != User.avatar_url(user) + + # Also removes it + res = + conn + |> patch("/api/v1/accounts/update_credentials", %{"avatar" => nil}) + + assert user_response = json_response_and_validate_schema(res, 200) + assert user_response["avatar"] == User.avatar_url(user) end test "updates the user's banner", %{user: user, conn: conn} do @@ -229,10 +239,21 @@ test "updates the user's banner", %{user: user, conn: conn} do filename: "an_image.jpg" } - conn = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header}) + res = + conn + |> patch("/api/v1/accounts/update_credentials", %{"header" => new_header}) - assert user_response = json_response_and_validate_schema(conn, 200) + assert user_response = json_response_and_validate_schema(res, 200) assert user_response["header"] != User.banner_url(user) + + # Also removes it + + res = + conn + |> patch("/api/v1/accounts/update_credentials", %{"header" => nil}) + + assert user_response = json_response_and_validate_schema(res, 200) + assert user_response["header"] == User.banner_url(user) end test "updates the user's background", %{conn: conn} do @@ -242,13 +263,25 @@ test "updates the user's background", %{conn: conn} do filename: "an_image.jpg" } - conn = - patch(conn, "/api/v1/accounts/update_credentials", %{ + res = + conn + |> patch("/api/v1/accounts/update_credentials", %{ "pleroma_background_image" => new_header }) - assert user_response = json_response_and_validate_schema(conn, 200) + assert user_response = json_response_and_validate_schema(res, 200) assert user_response["pleroma"]["background_image"] + + # Also removes it + + res = + conn + |> patch("/api/v1/accounts/update_credentials", %{ + "pleroma_background_image" => nil + }) + + assert user_response = json_response_and_validate_schema(res, 200) + refute user_response["pleroma"]["background_image"] end test "requires 'write:accounts' permission" do From 6512ef6879a5f857f02479da1bad7242e916d918 Mon Sep 17 00:00:00 2001 From: Alexander Strizhakov Date: Mon, 29 Jun 2020 15:25:57 +0300 Subject: [PATCH 473/492] excluding attachment links from RichMedia --- lib/pleroma/html.ex | 2 +- test/html_test.exs | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 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 @@ def extract_first_external_url(object, content) 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/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 @@ test "does not crash when there is an HTML entity in a link" 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 From dc60b1ee583e59ab1a6808700b45992a41fecd8f Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Mon, 29 Jun 2020 16:22:54 +0300 Subject: [PATCH 474/492] updated swoosh --- mix.exs | 5 ++++- mix.lock | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mix.exs b/mix.exs index b638be541..e2ab53bde 100644 --- a/mix.exs +++ b/mix.exs @@ -159,7 +159,10 @@ defp deps 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}, diff --git a/mix.lock b/mix.lock index 5ad49391d..4f2777fa7 100644 --- a/mix.lock +++ b/mix.lock @@ -104,9 +104,9 @@ "sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "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"}, From 979f02ec947443835f480d13bd1dbcf521743a71 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Mon, 29 Jun 2020 17:33:00 +0400 Subject: [PATCH 475/492] Fix CastAndValidate plug --- lib/pleroma/web/api_spec/cast_and_validate.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 @@ def call(%{private: %{open_api_spex: private_data}} = conn, %{ |> List.first() _ -> - nil + "application/json" end private_data = Map.put(private_data, :operation_id, operation_id) From 3aa04b81c4d558dfa8d3c35ab7db6041671ac121 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Mon, 29 Jun 2020 19:47:04 +0400 Subject: [PATCH 476/492] Test default "content-type" for CastAndValidate --- test/web/mastodon_api/controllers/account_controller_test.exs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/web/mastodon_api/controllers/account_controller_test.exs b/test/web/mastodon_api/controllers/account_controller_test.exs index ebfcedd01..260ad2306 100644 --- a/test/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/web/mastodon_api/controllers/account_controller_test.exs @@ -780,7 +780,6 @@ test "with notifications", %{conn: conn} 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) From 90083a754dc0bfe0c8a04fbaa3e78f68a848035e Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 29 Jun 2020 17:48:18 +0200 Subject: [PATCH 477/492] Notifications: Never return `nil` in the notification list. --- lib/pleroma/notification.ex | 1 + test/notification_test.exs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 9ee9606be..58dcf880a 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -367,6 +367,7 @@ defp do_create_notifications(%Activity{} = activity, options) do do_send = do_send && user in enabled_receivers create_notification(activity, user, do_send) end) + |> Enum.filter(& &1) {:ok, notifications} end diff --git a/test/notification_test.exs b/test/notification_test.exs index 526f43fab..5389dabca 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -21,7 +21,19 @@ defmodule Pleroma.NotificationTest do alias Pleroma.Web.Push alias Pleroma.Web.Streamer + # TODO: Test there's no nil notifications + 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) From c01f4ca07f3a3e47fb6532c55128c427fbc1f77e Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 29 Jun 2020 17:52:56 +0200 Subject: [PATCH 478/492] Notification: Remove TODO. --- test/notification_test.exs | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/notification_test.exs b/test/notification_test.exs index 5389dabca..6add3f7eb 100644 --- a/test/notification_test.exs +++ b/test/notification_test.exs @@ -21,8 +21,6 @@ defmodule Pleroma.NotificationTest do alias Pleroma.Web.Push alias Pleroma.Web.Streamer - # TODO: Test there's no nil notifications - describe "create_notifications" do test "never returns nil" do user = insert(:user) From 09c5991f82e91878a940f5957ac993e1fca72545 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 29 Jun 2020 16:04:14 +0000 Subject: [PATCH 479/492] Apply suggestion to lib/pleroma/notification.ex --- lib/pleroma/notification.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex index 58dcf880a..2ef1a80c5 100644 --- a/lib/pleroma/notification.ex +++ b/lib/pleroma/notification.ex @@ -367,7 +367,7 @@ defp do_create_notifications(%Activity{} = activity, options) do do_send = do_send && user in enabled_receivers create_notification(activity, user, do_send) end) - |> Enum.filter(& &1) + |> Enum.reject(&is_nil/1) {:ok, notifications} end From 27542f19c60589d8deb5d9d7a59d2019b75026fa Mon Sep 17 00:00:00 2001 From: normandy Date: Tue, 30 Jun 2020 03:12:30 +0000 Subject: [PATCH 480/492] Use correct PostgreSQL version command in bug template --- .gitlab/issue_templates/Bug.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 2382a2a1511e1042d960946aacfde7a49fac9dd0 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 30 Jun 2020 11:35:54 +0200 Subject: [PATCH 481/492] Preload: Load the correct instance panel --- lib/pleroma/web/preload/instance.ex | 3 ++- test/fixtures/preload_static/instance/panel.html | 1 + test/web/preload/instance_test.exs | 11 +++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/preload_static/instance/panel.html diff --git a/lib/pleroma/web/preload/instance.ex b/lib/pleroma/web/preload/instance.ex index 0b6fd3313..5c6e33e47 100644 --- a/lib/pleroma/web/preload/instance.ex +++ b/lib/pleroma/web/preload/instance.ex @@ -6,6 +6,7 @@ defmodule Pleroma.Web.Preload.Providers.Instance do alias Pleroma.Web.MastodonAPI.InstanceView alias Pleroma.Web.Nodeinfo.Nodeinfo alias Pleroma.Web.Preload.Providers.Provider + alias Pleroma.Plugs.InstanceStatic @behaviour Provider @instance_url :"/api/v1/instance" @@ -27,7 +28,7 @@ defp build_info_tag(acc) do end defp build_panel_tag(acc) do - instance_path = Path.join(:code.priv_dir(:pleroma), "static/instance/panel.html") + instance_path = InstanceStatic.file_path(@panel_url |> to_string()) if File.exists?(instance_path) do panel_data = File.read!(instance_path) 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/web/preload/instance_test.exs b/test/web/preload/instance_test.exs index 42a0d87bc..df150d7be 100644 --- a/test/web/preload/instance_test.exs +++ b/test/web/preload/instance_test.exs @@ -25,6 +25,17 @@ test "it renders the panel", %{"/instance/panel.html": panel} do ) 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": nodeinfo} do %{ metadata: metadata, From 8b7055e25e76565cd3376c0b5dda5e54d24881f0 Mon Sep 17 00:00:00 2001 From: lain Date: Tue, 30 Jun 2020 11:55:58 +0200 Subject: [PATCH 482/492] Credo fixes --- lib/pleroma/web/preload/instance.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/preload/instance.ex b/lib/pleroma/web/preload/instance.ex index 3d16f290b..50d1f3382 100644 --- a/lib/pleroma/web/preload/instance.ex +++ b/lib/pleroma/web/preload/instance.ex @@ -3,10 +3,10 @@ # 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 - alias Pleroma.Plugs.InstanceStatic @behaviour Provider @instance_url "/api/v1/instance" From d69af7f74290a67c9201782b7d4bafa29b6e0bd8 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Tue, 30 Jun 2020 11:50:53 -0500 Subject: [PATCH 483/492] Rename user.settings column This is used exclusively by MastoFE/GlitchFE now --- lib/pleroma/user.ex | 6 +++--- lib/pleroma/web/views/masto_fe_view.ex | 2 +- .../20200630162024_rename_user_settings_col.exs | 11 +++++++++++ test/web/masto_fe_controller_test.exs | 2 +- 4 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 priv/repo/migrations/20200630162024_rename_user_settings_col.exs diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 9d5c61e79..8a54546d6 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -115,7 +115,7 @@ 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(: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) @@ -2118,8 +2118,8 @@ def mascot_update(user, url) 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/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 @@ def initial_state(token, user, custom_emojis) 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/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/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 @@ test "put settings", %{conn: conn} 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 From df2d6564d5cf7ad292a784c69ce17f9f37db993a Mon Sep 17 00:00:00 2001 From: Angelina Filippova Date: Wed, 1 Jul 2020 03:01:15 +0300 Subject: [PATCH 484/492] Add labels, update descriptions and labels --- config/description.exs | 149 +++++++++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 57 deletions(-) diff --git a/config/description.exs b/config/description.exs index ded30e204..b34961c49 100644 --- a/config/description.exs +++ b/config/description.exs @@ -40,12 +40,13 @@ 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 @@ }, %{ key: :proxy_opts, + label: "Proxy Options", type: :keyword, description: "Options for Pleroma.ReverseProxy", suggestions: [ @@ -85,6 +87,7 @@ }, %{ key: :http, + label: "HTTP", type: :keyword, description: "HTTP options", children: [ @@ -479,6 +482,7 @@ %{ group: :pleroma, key: :uri_schemes, + label: "URI Schemes", type: :group, description: "URI schemes related settings", children: [ @@ -651,17 +655,17 @@ 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, @@ -679,7 +683,7 @@ 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 ] @@ -801,6 +805,7 @@ }, %{ 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." <> @@ -840,7 +845,7 @@ %{ 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, @@ -904,6 +909,7 @@ children: [ %{ key: :totp, + label: "TOTP settings", type: :keyword, description: "TOTP settings", suggestions: [digits: 6, period: 30], @@ -920,7 +926,7 @@ 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." } ] }, @@ -934,7 +940,7 @@ key: :number, type: :integer, suggestions: [5], - description: "number of backup codes to generate." + description: "Number of backup codes to generate." }, %{ key: :length, @@ -974,6 +980,7 @@ group: :logger, type: :group, key: :ex_syslogger, + label: "ExSyslogger", description: "ExSyslogger-related settings", children: [ %{ @@ -992,7 +999,7 @@ %{ 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"] }, %{ @@ -1006,6 +1013,7 @@ group: :logger, type: :group, key: :console, + label: "Console Logger", description: "Console logger settings", children: [ %{ @@ -1017,7 +1025,7 @@ %{ 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"] }, %{ @@ -1030,6 +1038,7 @@ %{ group: :quack, type: :group, + label: "Quack Logger", description: "Quack-related settings", children: [ %{ @@ -1140,19 +1149,19 @@ 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, @@ -1164,7 +1173,7 @@ key: :hideSitename, label: "Hide Sitename", type: :boolean, - description: "Hides instance name from PleromaFE banner." + description: "Hides instance name from PleromaFE banner" }, %{ key: :hideUserStats, @@ -1209,14 +1218,14 @@ label: "NSFW Censor Image", type: :string, description: - "URL of the image to use for hiding NSFW media attachments in the timeline.", + "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"] }, %{ @@ -1245,14 +1254,14 @@ key: :sidebarRight, label: "Sidebar on Right", type: :boolean, - description: "Change alignment of sidebar and panels to the right." + 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, @@ -1310,7 +1319,7 @@ 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", @@ -1334,7 +1343,7 @@ %{ key: :default_user_avatar, type: :string, - description: "URL of the default user avatar.", + description: "URL of the default user avatar", suggestions: ["/images/avi.png"] } ] @@ -1344,7 +1353,7 @@ 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, @@ -1381,7 +1390,7 @@ %{ group: :pleroma, key: :mrf_simple, - label: "MRF simple", + label: "MRF Simple", type: :group, description: "Message Rewrite Facility", children: [ @@ -1461,7 +1470,7 @@ %{ 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." <> @@ -1484,7 +1493,7 @@ 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: [ %{ @@ -1503,7 +1512,7 @@ %{ group: :pleroma, key: :mrf_hellthread, - label: "MRF hellthread", + label: "MRF Hellthread", type: :group, description: "Block messages with too much mentions", children: [ @@ -1527,7 +1536,7 @@ %{ 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: [ @@ -1557,14 +1566,14 @@ %{ 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"] } ] @@ -1572,7 +1581,7 @@ %{ group: :pleroma, key: :mrf_vocabulary, - label: "MRF vocabulary", + label: "MRF Vocabulary", type: :group, description: "Filter messages which belong to certain activity vocabularies", children: [ @@ -1580,14 +1589,14 @@ 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"] } ] @@ -1617,6 +1626,7 @@ }, %{ 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.", @@ -1649,6 +1659,7 @@ }, %{ key: :proxy_opts, + label: "Proxy Options", type: :keyword, description: "Options for Pleroma.ReverseProxy", suggestions: [ @@ -1676,6 +1687,7 @@ }, %{ key: :http, + label: "HTTP", type: :keyword, description: "HTTP options", children: [ @@ -1771,6 +1783,7 @@ }, %{ key: :ip, + label: "IP", type: :tuple, description: "IP address to bind to", suggestions: [{0, 0, 0, 0}] @@ -1784,7 +1797,7 @@ %{ key: :dstport, type: :integer, - description: "Port advertised in urls (optional, defaults to port)", + description: "Port advertised in URLs (optional, defaults to port)", suggestions: [9999] } ] @@ -1792,6 +1805,7 @@ %{ group: :pleroma, key: :activitypub, + label: "ActivityPub", type: :group, description: "ActivityPub-related settings", children: [ @@ -1814,7 +1828,7 @@ 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, @@ -1827,6 +1841,7 @@ %{ group: :pleroma, key: :http_security, + label: "HTTP security", type: :group, description: "HTTP security settings", children: [ @@ -1865,7 +1880,7 @@ 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"] } ] @@ -1873,9 +1888,10 @@ %{ 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, @@ -1942,6 +1958,7 @@ }, %{ 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", @@ -1949,7 +1966,7 @@ %{ key: :admin_token, type: :string, - description: "Token", + description: "Admin token", suggestions: ["We recommend a secure random string or UUID"] } ] @@ -2114,24 +2131,24 @@ 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"] }, %{ @@ -2159,31 +2176,32 @@ %{ 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] }, %{ @@ -2194,7 +2212,7 @@ %{ 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.)" } ] }, @@ -2240,6 +2258,7 @@ }, %{ group: :pleroma, + label: "Pleroma Authenticator", type: :group, description: "Authenticator", children: [ @@ -2253,6 +2272,7 @@ %{ 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" <> @@ -2339,6 +2359,7 @@ }, %{ 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\"", @@ -2354,11 +2375,12 @@ 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." }, %{ @@ -2370,6 +2392,7 @@ }, %{ 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" <> @@ -2378,6 +2401,7 @@ }, %{ 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." <> @@ -2506,7 +2530,7 @@ %{ key: :enabled, type: :boolean, - description: "enables new users admin digest email when `true`", + description: "Enables new users admin digest email when `true`", suggestions: [false] } ] @@ -2514,6 +2538,7 @@ %{ group: :pleroma, key: :oauth2, + label: "OAuth2", type: :group, description: "Configure OAuth 2 provider capabilities", children: [ @@ -2532,7 +2557,7 @@ %{ 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." } ] }, @@ -2616,6 +2641,7 @@ }, %{ 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}]] @@ -2629,6 +2655,7 @@ }, %{ 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", @@ -2644,6 +2671,7 @@ }, %{ group: :esshd, + label: "ESSHD", type: :group, description: "Before enabling this you must add :esshd to mix.exs as one of the extra_applications " <> @@ -2682,8 +2710,9 @@ }, %{ group: :mime, + label: "Mime Types", type: :group, - description: "Mime types", + description: "Mime Types settings", children: [ %{ key: :types, @@ -2742,6 +2771,7 @@ %{ group: :pleroma, key: :http, + label: "HTTP", type: :group, description: "HTTP settings", children: [ @@ -2790,6 +2820,7 @@ %{ group: :pleroma, key: :markup, + label: "Markup Settings", type: :group, children: [ %{ @@ -2831,7 +2862,7 @@ %{ 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: [ @@ -2887,6 +2918,7 @@ }, %{ group: :cors_plug, + label: "CORS plug config", type: :group, children: [ %{ @@ -2959,6 +2991,7 @@ %{ 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.", @@ -2981,9 +3014,10 @@ %{ 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, @@ -3001,18 +3035,18 @@ %{ 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: ["..."] } ] @@ -3022,6 +3056,7 @@ %{ group: :pleroma, key: :mrf_object_age, + label: "MRF Object Age", type: :group, description: "Rejects or delists posts based on their age when received.", children: [ @@ -3064,13 +3099,13 @@ %{ 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] } ] From 691742e62d36831d31ba5623bb0fc5f91d77960a Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 1 Jul 2020 08:51:56 +0000 Subject: [PATCH 485/492] Revert "Merge branch 'avatar-removing' into 'develop'" This reverts merge request !2701 --- .../update_credentials_test.exs | 47 +++---------------- 1 file changed, 7 insertions(+), 40 deletions(-) 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 31f0edf97..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 @@ -216,20 +216,10 @@ test "updates the user's avatar", %{user: user, conn: conn} do filename: "an_image.jpg" } - res = - conn - |> patch("/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) + conn = patch(conn, "/api/v1/accounts/update_credentials", %{"avatar" => new_avatar}) - assert user_response = json_response_and_validate_schema(res, 200) + assert user_response = json_response_and_validate_schema(conn, 200) assert user_response["avatar"] != User.avatar_url(user) - - # Also removes it - res = - conn - |> patch("/api/v1/accounts/update_credentials", %{"avatar" => nil}) - - assert user_response = json_response_and_validate_schema(res, 200) - assert user_response["avatar"] == User.avatar_url(user) end test "updates the user's banner", %{user: user, conn: conn} do @@ -239,21 +229,10 @@ test "updates the user's banner", %{user: user, conn: conn} do filename: "an_image.jpg" } - res = - conn - |> patch("/api/v1/accounts/update_credentials", %{"header" => new_header}) + conn = patch(conn, "/api/v1/accounts/update_credentials", %{"header" => new_header}) - assert user_response = json_response_and_validate_schema(res, 200) + assert user_response = json_response_and_validate_schema(conn, 200) assert user_response["header"] != User.banner_url(user) - - # Also removes it - - res = - conn - |> patch("/api/v1/accounts/update_credentials", %{"header" => nil}) - - assert user_response = json_response_and_validate_schema(res, 200) - assert user_response["header"] == User.banner_url(user) end test "updates the user's background", %{conn: conn} do @@ -263,25 +242,13 @@ test "updates the user's background", %{conn: conn} do filename: "an_image.jpg" } - res = - conn - |> patch("/api/v1/accounts/update_credentials", %{ + conn = + patch(conn, "/api/v1/accounts/update_credentials", %{ "pleroma_background_image" => new_header }) - assert user_response = json_response_and_validate_schema(res, 200) + assert user_response = json_response_and_validate_schema(conn, 200) assert user_response["pleroma"]["background_image"] - - # Also removes it - - res = - conn - |> patch("/api/v1/accounts/update_credentials", %{ - "pleroma_background_image" => nil - }) - - assert user_response = json_response_and_validate_schema(res, 200) - refute user_response["pleroma"]["background_image"] end test "requires 'write:accounts' permission" do From 8ae572d5aef1fcad87522ae00b431135345dcd73 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 1 Jul 2020 11:47:45 +0200 Subject: [PATCH 486/492] Fixtures: Pretty print. --- .../baptiste.gelex.xyz-article.json | 228 +++++++++++++++++- .../fixtures/tesla_mock/peertube.moe-vid.json | 188 ++++++++++++++- 2 files changed, 414 insertions(+), 2 deletions(-) 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 +} From ce92e6e5ce24a68bedd744c01cc1a99f01c4fa91 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 1 Jul 2020 11:48:51 +0200 Subject: [PATCH 487/492] Fetcher: Work when we can't get the OP. --- .../web/activity_pub/transmogrifier.ex | 7 +- .../fetch_mocks/104410921027210069.json | 72 +++++++++++++++++++ .../fetch_mocks/9wTkLEnuq47B25EehM.json | 59 +++++++++++++++ test/fixtures/fetch_mocks/eal.json | 43 +++++++++++ test/fixtures/fetch_mocks/tuxcrafting.json | 59 +++++++++++++++ test/object/fetcher_test.exs | 40 +++++++++++ 6 files changed, 275 insertions(+), 5 deletions(-) create mode 100644 test/fixtures/fetch_mocks/104410921027210069.json create mode 100644 test/fixtures/fetch_mocks/9wTkLEnuq47B25EehM.json create mode 100644 test/fixtures/fetch_mocks/eal.json create mode 100644 test/fixtures/fetch_mocks/tuxcrafting.json diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex index 278fbbeab..bc6fc4bd8 100644 --- a/lib/pleroma/web/activity_pub/transmogrifier.ex +++ b/lib/pleroma/web/activity_pub/transmogrifier.ex @@ -446,12 +446,9 @@ def handle_incoming( 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 = %{ 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/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]) From fedfe8f7d6f78d77e9cbaf70fa8a9e8df38463f7 Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 1 Jul 2020 12:26:07 +0200 Subject: [PATCH 488/492] ActivityPub: Handle clashing nicknames for the same ap id If we get a new user (identified by ap_id) that would have the same nickname as an existing user, give the existing user a nickname that is prepended with the user id, as this will never clash. This can happen when a user switches server software and that soft- ware generates ap ids in a different way. --- lib/pleroma/web/activity_pub/activity_pub.ex | 12 ++++++++++ test/user_test.exs | 25 ++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index 05bd824f5..94117202c 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1371,6 +1371,16 @@ def fetch_and_prepare_user_from_ap_id(ap_id) do 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) @@ -1383,6 +1393,8 @@ def make_user_from_ap_id(ap_id) 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() diff --git a/test/user_test.exs b/test/user_test.exs index 9b66f3f51..7126bb539 100644 --- a/test/user_test.exs +++ b/test/user_test.exs @@ -597,6 +597,31 @@ test "updates an existing user, if stale" 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) From 61fe94d698a6f73e7a3f6224ed4be93b30ba0e54 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 2 Jul 2020 09:33:50 +0200 Subject: [PATCH 489/492] SideEffects: Refactor. --- lib/pleroma/web/activity_pub/side_effects.ex | 6 ++++- test/web/activity_pub/side_effects_test.exs | 23 ++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index 5cc2eb378..c84af68f4 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -13,6 +13,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub + alias Pleroma.Activity.Ir.Topics alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.Push @@ -97,7 +98,10 @@ def handle(%{data: %{"type" => "Announce"}} = object, meta) do if !User.is_internal_user?(user) do Notification.create_notifications(object) - ActivityPub.stream_out(object) + + object + |> Topics.get_activity_topics() + |> Streamer.stream(object) end {:ok, object, meta} diff --git a/test/web/activity_pub/side_effects_test.exs b/test/web/activity_pub/side_effects_test.exs index af27c34b4..2649b060a 100644 --- a/test/web/activity_pub/side_effects_test.exs +++ b/test/web/activity_pub/side_effects_test.exs @@ -589,10 +589,29 @@ test "creates a notification", %{announce: announce, poster: poster} do end test "it streams out the announce", %{announce: announce} do - with_mock Pleroma.Web.ActivityPub.ActivityPub, [:passthrough], stream_out: fn _ -> nil end 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.ActivityPub.ActivityPub.stream_out(announce)) + assert called( + Pleroma.Web.Streamer.stream(["user", "list", "public", "public:local"], announce) + ) + + assert called(Pleroma.Web.Push.send(:_)) end end end From 311b7c19d0a34654b785116fe22823132d5a9284 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 2 Jul 2020 09:50:26 +0200 Subject: [PATCH 490/492] Streamer: Align announce streaming with polling. --- lib/pleroma/web/streamer/streamer.ex | 1 + test/web/streamer/streamer_test.exs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex index d1d2c9b9c..73ee3e1e1 100644 --- a/lib/pleroma/web/streamer/streamer.ex +++ b/lib/pleroma/web/streamer/streamer.ex @@ -116,6 +116,7 @@ def filtered_by_user?(%User{} = user, %Activity{} = item) 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), diff --git a/test/web/streamer/streamer_test.exs b/test/web/streamer/streamer_test.exs index 245f6e63f..dfe341b34 100644 --- a/test/web/streamer/streamer_test.exs +++ b/test/web/streamer/streamer_test.exs @@ -116,6 +116,18 @@ test "it streams boosts of the user in the 'user' stream", %{user: user} do 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) From ce9b7c0e0f1f4759979fb4690021f2f11c408ac0 Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 2 Jul 2020 09:54:48 +0200 Subject: [PATCH 491/492] Changelog: Update with stream changes. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b6928dcd..335d29195 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). 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.
    From bad08f34caf0f037b5d6e724628a222fe65b751b Mon Sep 17 00:00:00 2001 From: lain Date: Thu, 2 Jul 2020 09:57:31 +0200 Subject: [PATCH 492/492] Credo fixes. --- lib/pleroma/web/activity_pub/side_effects.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex index c84af68f4..61feeae4d 100644 --- a/lib/pleroma/web/activity_pub/side_effects.ex +++ b/lib/pleroma/web/activity_pub/side_effects.ex @@ -6,6 +6,7 @@ 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 @@ -13,7 +14,6 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do alias Pleroma.Repo alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub - alias Pleroma.Activity.Ir.Topics alias Pleroma.Web.ActivityPub.Pipeline alias Pleroma.Web.ActivityPub.Utils alias Pleroma.Web.Push