Merge remote-tracking branch 'origin/develop' into sixohsix/pleroma-post_expiration
authorlain <lain@soykaf.club>
Sat, 24 Aug 2019 13:48:33 +0000 (15:48 +0200)
committerlain <lain@soykaf.club>
Sat, 24 Aug 2019 13:48:33 +0000 (15:48 +0200)
13 files changed:
1  2 
CHANGELOG.md
config/config.exs
config/test.exs
docs/api/differences_in_mastoapi_responses.md
docs/config.md
lib/pleroma/activity.ex
lib/pleroma/application.ex
lib/pleroma/web/common_api/common_api.ex
lib/pleroma/web/mastodon_api/views/status_view.ex
test/support/factory.ex
test/web/common_api/common_api_test.exs
test/web/mastodon_api/mastodon_api_controller_test.exs
test/web/mastodon_api/status_view_test.exs

diff --cc CHANGELOG.md
index f645066372df4bd679ae7bd7d22badd53bd32e1e,880fba58acf87c2c4a58f41efdbf12d9d14344b7..9495778424ce1e571cc607ad889a98140d1490aa
@@@ -32,8 -38,21 +38,25 @@@ The format is based on [Keep a Changelo
  - Rich Media: Parser failing when no TTL can be found by image TTL setters
  - Rich Media: The crawled URL is now spliced into the rich media data.
  - ActivityPub S2S: sharedInbox usage has been mostly aligned with the rules in the AP specification.
+ - ActivityPub S2S: remote user deletions now work the same as local user deletions.
+ - ActivityPub S2S: POST requests are now signed with `(request-target)` pseudo-header.
+ - Not being able to access the Mastodon FE login page on private instances
+ - Invalid SemVer version generation, when the current branch does not have commits ahead of tag/checked out on a tag
+ - Pleroma.Upload base_url was not automatically whitelisted by MediaProxy. Now your custom CDN or file hosting will be accessed directly as expected.
+ - Report email not being sent to admins when the reporter is a remote user
+ - MRF: ensure that subdomain_match calls are case-insensitive
+ - Reverse Proxy limiting `max_body_length` was incorrectly defined and only checked `Content-Length` headers which may not be sufficient in some circumstances
+ - MRF: fix use of unserializable keyword lists in describe() implementations
+ - ActivityPub: Deactivated user deletion
  
  ### Added
++- Expiring/ephemeral activites. All activities can have expires_on value set, which controls when they should be deleted automatically.
++- Mastodon API: in post_status, the expires_in parameter lets you set the number of minutes until an activity expires. It must be at least one hour.
++- Mastodon API: all status JSON responses contain a `pleroma.expires_on` item which states when an activity will expire. The value is only shown to the user who created the activity. To everyone else it's empty.
++- Configuration: `ActivityExpiration.enabled` controls whether expired activites will get deleted at the appropriate time. Enabled by default.
+ - Conversations: Add Pleroma-specific conversation endpoints and status posting extensions. Run the `bump_all_conversations` task again to create the necessary data.
+ - **Breaking:** MRF describe API, which adds support for exposing configuration information about MRF policies to NodeInfo.
+   Custom modules will need to be updated by adding, at the very least, `def describe, do: {:ok, %{}}` to the MRF policy modules.
  - MRF: Support for priming the mediaproxy cache (`Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy`)
  - MRF: Support for excluding specific domains from Transparency.
  - MRF: Support for filtering posts based on who they mention (`Pleroma.Web.ActivityPub.MRF.MentionPolicy`)
index 2887353fbf045e77ded80be8324c363b26782c73,118f697b3d978a3821a53f30406c6bb48a7ca489..e58454d683f260c6c1d4c295f9a7afb076b35c26
@@@ -535,10 -562,10 +563,12 @@@ config :pleroma, :rate_limit
    relation_id_action: {60_000, 2},
    statuses_actions: {10_000, 15},
    status_id_action: {60_000, 3},
-   password_reset: {1_800_000, 5}
+   password_reset: {1_800_000, 5},
+   account_confirmation_resend: {8_640_000, 5},
+   ap_routes: {60_000, 15}
  
 +config :pleroma, Pleroma.ActivityExpiration, enabled: true
 +
  # 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 --cc config/test.exs
index 3f606aa8181adec810c6d74cc8668e0fe1aeb255,30a51f734e69e2fbe61b6f001c2b3e1250efa0ed..567780987d253f3b41b548871a6f22e6e83fb206
@@@ -80,12 -82,15 +82,14 @@@ rum_enabled = System.get_env("RUM_ENABL
  config :pleroma, :database, rum_enabled: rum_enabled
  IO.puts("RUM enabled: #{rum_enabled}")
  
+ config :joken, default_signer: "yU8uHKq+yyAkZ11Hx//jcdacWc8yQ1bxAAGrplzB0Zwwjkp35v0RK9SO8WTPr6QZ"
  config :pleroma, Pleroma.ReverseProxy.Client, Pleroma.ReverseProxy.ClientMock
  
 -try do
 +if File.exists?("./config/test.secret.exs") do
    import_config "test.secret.exs"
 -rescue
 -  _ ->
 -    IO.puts(
 -      "You may want to create test.secret.exs to declare custom database connection parameters."
 -    )
 +else
 +  IO.puts(
 +    "You may want to create test.secret.exs to declare custom database connection parameters."
 +  )
  end
index 168a13f4e485733511f2aa55fede5e2664685ada,79ca531b8af0ab57c968841438c2cfff90b3b704..197c465d8a582c86e8bfe21bf5193f9e380bc2d1
@@@ -80,7 -86,7 +87,8 @@@ Additional parameters can be added to t
  - `content_type`: string, contain the MIME type of the status, it is transformed into HTML by the backend. You can get the list of the supported MIME types with the nodeinfo endpoint.
  - `to`: A list of nicknames (like `lain@soykaf.club` or `lain` on the local server) that will be used to determine who is going to be addressed by this post. Using this will disable the implicit addressing by mentioned names in the `status` body, only the people in the `to` list will be addressed. The normal rules for for post visibility are not affected by this and will still apply.
  - `visibility`: string, besides standard MastoAPI values (`direct`, `private`, `unlisted` or `public`) it can be used to address a List by setting it to `list:LIST_ID`.
 +- `expires_on`: datetime (iso8601), sets when the posted activity should expire. When a posted activity expires it will be deleted from the server, and a delete request for it will be federated.
+ - `in_reply_to_conversation_id`: Will reply to a given conversation, addressing only the people who are part of the recipient set of that conversation. Sets the visibility to `direct`.
  
  ## PATCH `/api/v1/update_credentials`
  
diff --cc docs/config.md
Simple merge
Simple merge
index 42e4a1dfa4c13b8e964dc1b1983badf3d9e5fb38,25e56b9e2b2820c1d60254e4dac10e16f520faa4..1e4de272cda5a0d5147ef8514735afd5d814d780
@@@ -29,112 -30,18 +30,19 @@@ defmodule Pleroma.Application d
      # Define workers and child supervisors to be supervised
      children =
        [
-         # Start the Ecto repository
-         %{id: Pleroma.Repo, start: {Pleroma.Repo, :start_link, []}, type: :supervisor},
-         %{id: Pleroma.Config.TransferTask, start: {Pleroma.Config.TransferTask, :start_link, []}},
-         %{id: Pleroma.Emoji, start: {Pleroma.Emoji, :start_link, []}},
-         %{id: Pleroma.Captcha, start: {Pleroma.Captcha, :start_link, []}},
-         %{
-           id: :cachex_used_captcha_cache,
-           start:
-             {Cachex, :start_link,
-              [
-                :used_captcha_cache,
-                [
-                  ttl_interval:
-                    :timer.seconds(Pleroma.Config.get!([Pleroma.Captcha, :seconds_valid]))
-                ]
-              ]}
-         },
-         %{
-           id: :cachex_user,
-           start:
-             {Cachex, :start_link,
-              [
-                :user_cache,
-                [
-                  default_ttl: 25_000,
-                  ttl_interval: 1000,
-                  limit: 2500
-                ]
-              ]}
-         },
-         %{
-           id: :cachex_object,
-           start:
-             {Cachex, :start_link,
-              [
-                :object_cache,
-                [
-                  default_ttl: 25_000,
-                  ttl_interval: 1000,
-                  limit: 2500
-                ]
-              ]}
-         },
-         %{
-           id: :cachex_rich_media,
-           start:
-             {Cachex, :start_link,
-              [
-                :rich_media_cache,
-                [
-                  default_ttl: :timer.minutes(120),
-                  limit: 5000
-                ]
-              ]}
-         },
-         %{
-           id: :cachex_scrubber,
-           start:
-             {Cachex, :start_link,
-              [
-                :scrubber_cache,
-                [
-                  limit: 2500
-                ]
-              ]}
-         },
-         %{
-           id: :cachex_idem,
-           start:
-             {Cachex, :start_link,
-              [
-                :idempotency_cache,
-                [
-                  expiration:
-                    expiration(
-                      default: :timer.seconds(6 * 60 * 60),
-                      interval: :timer.seconds(60)
-                    ),
-                  limit: 2500
-                ]
-              ]}
-         },
-         %{id: Pleroma.FlakeId, start: {Pleroma.FlakeId, :start_link, []}},
-         %{
-           id: Pleroma.ScheduledActivityWorker,
-           start: {Pleroma.ScheduledActivityWorker, :start_link, []}
-         },
-         %{
-           id: Pleroma.ActivityExpirationWorker,
-           start: {Pleroma.ActivityExpirationWorker, :start_link, []}
-         }
+         Pleroma.Repo,
+         Pleroma.Config.TransferTask,
+         Pleroma.Emoji,
+         Pleroma.Captcha,
+         Pleroma.FlakeId,
 -        Pleroma.ScheduledActivityWorker
++        Pleroma.ScheduledActivityWorker,
++        Pleroma.ActiviyExpirationWorker
        ] ++
+         cachex_children() ++
          hackney_pool_children() ++
          [
-           %{
-             id: Pleroma.Web.Federator.RetryQueue,
-             start: {Pleroma.Web.Federator.RetryQueue, :start_link, []}
-           },
-           %{
-             id: Pleroma.Web.OAuth.Token.CleanWorker,
-             start: {Pleroma.Web.OAuth.Token.CleanWorker, :start_link, []}
-           },
-           %{
-             id: Pleroma.Stats,
-             start: {Pleroma.Stats, :start_link, []}
-           },
+           Pleroma.Web.Federator.RetryQueue,
+           Pleroma.Stats,
            %{
              id: :web_push_init,
              start: {Task, :start_link, [&Pleroma.Web.Push.init/0]},
index 261d603923eda31239fbbc87ece9c3ca49e256cd,72da46263f6f16f8f453d3b4cc0ddbcb8d7e6329..69120cc19338548bf6f9fd59b51e6a70826f3d7f
@@@ -4,7 -4,7 +4,8 @@@
  
  defmodule Pleroma.Web.CommonAPI do
    alias Pleroma.Activity
 +  alias Pleroma.ActivityExpiration
+   alias Pleroma.Conversation.Participation
    alias Pleroma.Formatter
    alias Pleroma.Object
    alias Pleroma.ThreadMute
           mentioned_users <- for({_, mentioned_user} <- mentions, do: mentioned_user.ap_id),
           addressed_users <- get_addressed_users(mentioned_users, data["to"]),
           {poll, poll_emoji} <- make_poll_data(data),
-          {to, cc} <- get_to_and_cc(user, addressed_users, in_reply_to, visibility),
-          context <- make_context(in_reply_to),
+          {to, cc} <-
+            get_to_and_cc(user, addressed_users, in_reply_to, visibility, in_reply_to_conversation),
+          context <- make_context(in_reply_to, in_reply_to_conversation),
           cw <- data["spoiler_text"] || "",
           sensitive <- data["sensitive"] || Enum.member?(tags, {"#nsfw", "nsfw"}),
 +         {:ok, expires_at} <- check_expiry_date(data["expires_at"]),
           full_payload <- String.trim(status <> cw),
           :ok <- validate_character_limit(full_payload, attachments, limit),
           object <-
index 7264dcafb59c3a1f51277021a0e900561cfe33de,42fbdf51b4f645af0e20f36761840201549022b2..a4ee0b5ddc9bb0e2d67ac139a6727138187b2c8f
@@@ -5,8 -5,11 +5,12 @@@
  defmodule Pleroma.Web.MastodonAPI.StatusView do
    use Pleroma.Web, :view
  
+   require Pleroma.Constants
    alias Pleroma.Activity
 +  alias Pleroma.ActivityExpiration
+   alias Pleroma.Conversation
+   alias Pleroma.Conversation.Participation
    alias Pleroma.HTML
    alias Pleroma.Object
    alias Pleroma.Repo
          in_reply_to_account_acct: reply_to_user && reply_to_user.nickname,
          content: %{"text/plain" => content_plaintext},
          spoiler_text: %{"text/plain" => summary_plaintext},
-         expires_at: expires_at
++        expires_at: expires_at,
+         direct_conversation_id: direct_conversation_id
        }
      }
    end
Simple merge
index 210314a4a3dea44d4a37e2972f93356fa93234d5,bcbaad6658f49dc5045f5e17eefd0e9dc33339d0..5fda91438a7c514119132ee3122f2f6936b19530
@@@ -157,26 -203,7 +203,24 @@@ defmodule Pleroma.Web.CommonAPITest d
  
        assert {:error, "The status is over the character limit"} =
                 CommonAPI.post(user, %{"status" => "foobar"})
-       Pleroma.Config.put([:instance, :limit], limit)
      end
 +
 +    test "it can handle activities that expire" do
 +      user = insert(:user)
 +
 +      expires_at =
 +        NaiveDateTime.utc_now()
 +        |> NaiveDateTime.truncate(:second)
 +        |> NaiveDateTime.add(1_000_000, :second)
 +
 +      expires_at_iso8601 = expires_at |> NaiveDateTime.to_iso8601()
 +
 +      assert {:ok, activity} =
 +               CommonAPI.post(user, %{"status" => "chai", "expires_at" => expires_at_iso8601})
 +
 +      assert expiration = Pleroma.ActivityExpiration.get_by_activity_id(activity.id)
 +      assert expiration.scheduled_at == expires_at
 +    end
    end
  
    describe "reactions" do
index fbe0ab375909c93eaa1f8a43bb288bc27db76cc2,77430e9c9b4e8af54fac695054dd346c7e78060f..c05c39db6df72d4dc3988d29230c0c43ec179d4a
@@@ -7,7 -7,7 +7,8 @@@ defmodule Pleroma.Web.MastodonAPI.Masto
  
    alias Ecto.Changeset
    alias Pleroma.Activity
 +  alias Pleroma.ActivityExpiration
+   alias Pleroma.Config
    alias Pleroma.Notification
    alias Pleroma.Object
    alias Pleroma.Repo
index 073c696597f35d0c8d46a3d29b609abdf1861937,c983b494ffe42f6c73d252cfca4218c8645f8945..1b6beb6d29437d2354ceccdf734f6c5f54f4d195
@@@ -134,7 -149,7 +149,8 @@@ defmodule Pleroma.Web.MastodonAPI.Statu
          in_reply_to_account_acct: nil,
          content: %{"text/plain" => HtmlSanitizeEx.strip_tags(object_data["content"])},
          spoiler_text: %{"text/plain" => HtmlSanitizeEx.strip_tags(object_data["summary"])},
-         expires_at: nil
++        expires_at: nil,
+         direct_conversation_id: nil
        }
      }