Merge branch 'develop' of https://git.pleroma.social/pleroma/pleroma into develop
authorsadposter <hannah+pleroma@coffee-and-dreams.uk>
Sat, 23 Jan 2021 22:38:07 +0000 (22:38 +0000)
committersadposter <hannah+pleroma@coffee-and-dreams.uk>
Sat, 23 Jan 2021 22:38:07 +0000 (22:38 +0000)
1  2 
.gitignore
config/config.exs
lib/mix/tasks/pleroma/user.ex
lib/pleroma/web/endpoint.ex
lib/pleroma/web/nodeinfo/nodeinfo_controller.ex

diff --combined .gitignore
index d1d7977f11d2ed0dc22f0748aed8f069a543915f,4dea75e9333aa49659c5676174e64a4ea4949962..6f1e495de0527a09820dc3b9c48ca6aa3e8e0b0a
@@@ -1,5 -1,4 +1,5 @@@
  # App artifacts
 +secret
  /_build
  /db
  /deps
@@@ -33,7 -32,7 +33,7 @@@ erl_crash.dum
  
  
  # Database setup file, some may forget to delete it
- /config/setup_db.psql
+ /config/setup_db*.psql
  
  .DS_Store
  .env
diff --combined config/config.exs
index 0656b7afd00afdd32948e5db9a25d7c0f924046c,c4a69079925df1a4de625c8e9c43d9926b358e39..635dd4ae25ba3917ad8688812ee41c5bdf1517f7
@@@ -63,23 -63,24 +63,24 @@@ config :pleroma, Pleroma.Upload
    filters: [Pleroma.Upload.Filter.Dedupe],
    link_name: false,
    proxy_remote: false,
-   proxy_opts: [
-     redirect_on_failure: false,
-     max_body_length: 25 * 1_048_576,
-     http: [
-       follow_redirect: true,
-       pool: :upload
-     ]
-   ],
    filename_display_max_length: 30,
-   default_description: nil
+   default_description: nil,
+   base_url: nil
  
  config :pleroma, Pleroma.Uploaders.Local, uploads: "uploads"
  
  config :pleroma, Pleroma.Uploaders.S3,
    bucket: nil,
-   streaming_enabled: true,
-   public_endpoint: "https://s3.amazonaws.com"
+   bucket_namespace: nil,
+   truncated_namespace: nil,
+   streaming_enabled: true
+ config :ex_aws, :s3,
+   # host: "s3.wasabisys.com", # required if not Amazon AWS
+   access_key_id: nil,
+   secret_access_key: nil,
+   # region: "us-east-1", # may be required for Amazon AWS
+   scheme: "https://"
  
  config :pleroma, :emoji,
    shortcode_globs: ["/emoji/custom/**/*.png"],
@@@ -221,9 -222,6 +222,9 @@@ config :pleroma, :instance
      "text/markdown",
      "text/bbcode"
    ],
 +  mrf_transparency: true,
 +  mrf_transparency_exclusions: [],
 +  staff_transparency: [],
    autofollowed_nicknames: [],
    autofollowing_nicknames: [],
    max_pinned_statuses: 1,
@@@ -553,7 -551,7 +554,7 @@@ config :pleroma, Oban
      scheduled_activities: 10,
      background: 5,
      remote_fetcher: 2,
-     attachments_cleanup: 5,
+     attachments_cleanup: 1,
      new_users_digest: 1,
      mute_expire: 5
    ],
@@@ -834,6 -832,11 +835,11 @@@ config :pleroma, Pleroma.User.Backup
    limit_days: 7,
    dir: nil
  
+ config :pleroma, ConcurrentLimiter, [
+   {Pleroma.Web.RichMedia.Helpers, [max_running: 5, max_waiting: 5]},
+   {Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy, [max_running: 5, max_waiting: 5]}
+ ]
  # 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"
index 09f9356d34998078a251870ca8e7b6630eb62ccd,e87f1c271d157e0051be05dd98d75e970694dfba..d4cca09614929581aab93aa35990fc2988ded88e
@@@ -1,5 -1,5 +1,5 @@@
  # Pleroma: A lightweight social networking server
- # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+ # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
  # SPDX-License-Identifier: AGPL-3.0-only
  
  defmodule Mix.Tasks.Pleroma.User do
@@@ -74,7 -74,7 +74,7 @@@
          bio: bio
        }
  
-       changeset = User.register_changeset(%User{}, params, need_confirmation: false)
+       changeset = User.register_changeset(%User{}, params, is_confirmed: true)
        {:ok, _user} = User.register(changeset)
  
        shell_info("User #{nickname} created")
        user =
          case Keyword.get(options, :confirmed) do
            nil -> user
-           value -> set_confirmed(user, value)
+           value -> set_confirmation(user, value)
          end
  
        user =
      end
    end
  
 +  def run(["change_email", nickname, email]) do
 +    start_pleroma()
 +
 +    with %User{} = user <- User.get_cached_by_nickname(nickname) do
 +      user
 +      |> User.update_changeset(%{"email" => email})
 +      |> User.update_and_set_cache()
 +
 +      shell_info("#{nickname}'s email updated")
 +    end
 +  end
 +
 +  def run(["show", nickname]) do
 +    start_pleroma()
 +
 +    nickname
 +    |> User.get_cached_by_nickname()
 +    |> IO.inspect()
 +  end
 +
 +  def run(["send_confirmation", nickname]) do
 +    start_pleroma()
 +
 +    with %User{} = user <- User.get_cached_by_nickname(nickname) do
 +      user
 +      |> Pleroma.Emails.UserEmail.account_confirmation_email()
 +      |> IO.inspect()
 +      |> Pleroma.Emails.Mailer.deliver!()
 +
 +      shell_info("#{nickname}'s email sent")
 +    end
 +  end
 +
    def run(["confirm", nickname]) do
      start_pleroma()
  
      with %User{} = user <- User.get_cached_by_nickname(nickname) do
        {:ok, user} = User.confirm(user)
  
-       message = if user.confirmation_pending, do: "needs", else: "doesn't need"
+       message = if !user.is_confirmed, do: "needs", else: "doesn't need"
  
        shell_info("#{nickname} #{message} confirmation.")
      else
      |> Pleroma.Repo.chunk_stream(500, :batches)
      |> Stream.each(fn users ->
        users
-       |> Enum.each(fn user -> User.need_confirmation(user, false) end)
+       |> Enum.each(fn user -> User.set_confirmation(user, true) end)
      end)
      |> Stream.run()
    end
      |> Pleroma.Repo.chunk_stream(500, :batches)
      |> Stream.each(fn users ->
        users
-       |> Enum.each(fn user -> User.need_confirmation(user, true) end)
+       |> Enum.each(fn user -> User.set_confirmation(user, false) end)
      end)
      |> Stream.run()
    end
      user
    end
  
-   defp set_confirmed(user, value) do
-     {:ok, user} = User.need_confirmation(user, !value)
+   defp set_confirmation(user, value) do
+     {:ok, user} = User.set_confirmation(user, value)
  
-     shell_info("Confirmation pending status of #{user.nickname}: #{user.confirmation_pending}")
+     shell_info("Confirmation status of #{user.nickname}: #{user.is_confirmed}")
      user
    end
  end
index f2c377c5631c19a2962a706d2196eaff86ac9b2a,94703cd058417894eb8954667b12d62d142ccc64..0c7f50bd297001a226a5461892b11e241207de2b
@@@ -1,5 -1,5 +1,5 @@@
  # Pleroma: A lightweight social networking server
- # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+ # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
  # SPDX-License-Identifier: AGPL-3.0-only
  
  defmodule Pleroma.Web.Endpoint do
      }
    )
  
 +  plug(Plug.Static.IndexHtml, at: "/pleroma/fedife/")
 +
 +  plug(Pleroma.Web.Plugs.FrontendStatic,
 +    at: "/pleroma/fedife",
 +    frontend_type: :fedife,
 +    gzip: true,
 +    cache_control_for_etags: @static_cache_control,
 +    headers: %{
 +      "cache-control" => @static_cache_control
 +    }
 +  )
 +
 +
    # Serve at "/" the static files from "priv/static" directory.
    #
    # You should set gzip to true if you are running phoenix.digest
index b9c12374cb9e8d4239436ca27a1fd3f648488018,bca94d23644a48de9354b39ad566c35d29004aa6..6ccdf2a53ff2ba243e37b6cdebe26657e19e73c2
@@@ -1,16 -1,12 +1,16 @@@
  # Pleroma: A lightweight social networking server
- # Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+ # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
  # SPDX-License-Identifier: AGPL-3.0-only
  
  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.Nodeinfo.Nodeinfo
 +  alias Pleroma.Web.Federator.Publisher
 +  alias Pleroma.Web.MastodonAPI.InstanceView
  
    def schemas(conn, _params) do
      response = %{
      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)
 +      |> Enum.filter(fn u -> not Enum.member?(Config.get([:instance, :staff_transparency]), u) 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" => version}) do
 -    case Nodeinfo.get_nodeinfo(version) do
 -      {:error, :missing} ->
 -        render_error(conn, :not_found, "Nodeinfo schema version not handled")
 -
 -      node_info ->
 -        conn
 -        |> put_resp_header(
 -          "content-type",
 -          "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8"
 -        )
 -        |> json(node_info)
 -    end
 +  def nodeinfo(conn, %{"version" => "2.0"}) do
 +    conn
 +    |> put_resp_header(
 +      "content-type",
 +      "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.0#; charset=utf-8"
 +    )
 +    |> json(raw_nodeinfo())
 +  end
 +
 +  def nodeinfo(conn, %{"version" => "2.1"}) do
 +    raw_response = raw_nodeinfo()
 +
 +    updated_software =
 +      raw_response
 +      |> Map.get(:software)
 +      |> Map.put(:repository, Pleroma.Application.repository())
 +
 +    response =
 +      raw_response
 +      |> Map.put(:software, updated_software)
 +      |> Map.put(:version, "2.1")
 +
 +    conn
 +    |> put_resp_header(
 +      "content-type",
 +      "application/json; profile=http://nodeinfo.diaspora.software/ns/schema/2.1#; charset=utf-8"
 +    )
 +    |> json(response)
 +  end
 +
 +  def nodeinfo(conn, _) do
 +    render_error(conn, :not_found, "Nodeinfo schema version not handled")
    end
  end