[#161] Merge remote-tracking branch 'remotes/upstream/develop' into 161-incoming-replies-depth-limit
# Conflicts: # CHANGELOG.md
This commit is contained in:
commit
a799418573
9 changed files with 86 additions and 8 deletions
|
@ -7,6 +7,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
### Added
|
### Added
|
||||||
- MRF: Support for priming the mediaproxy cache (`Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy`)
|
- MRF: Support for priming the mediaproxy cache (`Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy`)
|
||||||
- Federation: Support for restricting max. reply-to depth on fetching
|
- Federation: Support for restricting max. reply-to depth on fetching
|
||||||
|
- Mastodon API: Support for the [`tagged` filter](https://github.com/tootsuite/mastodon/pull/9755) in [`GET /api/v1/accounts/:id/statuses`](https://docs.joinmastodon.org/api/rest/accounts/#get-api-v1-accounts-id-statuses)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Not being able to pin unlisted posts
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Configuration: Filter.AnonymizeFilename added ability to retain file extension with custom text
|
||||||
|
|
||||||
## [1.0.0] - 2019-06-29
|
## [1.0.0] - 2019-06-29
|
||||||
### Security
|
### Security
|
||||||
|
|
|
@ -36,7 +36,7 @@ No specific configuration.
|
||||||
This filter replaces the filename (not the path) of an upload. For complete obfuscation, add
|
This filter replaces the filename (not the path) of an upload. For complete obfuscation, add
|
||||||
`Pleroma.Upload.Filter.Dedupe` before AnonymizeFilename.
|
`Pleroma.Upload.Filter.Dedupe` before AnonymizeFilename.
|
||||||
|
|
||||||
* `text`: Text to replace filenames in links. If empty, `{random}.extension` will be used.
|
* `text`: Text to replace filenames in links. If empty, `{random}.extension` will be used. You can get the original filename extension by using `{extension}`, for example `custom-file-name.{extension}`.
|
||||||
|
|
||||||
## Pleroma.Emails.Mailer
|
## Pleroma.Emails.Mailer
|
||||||
* `adapter`: one of the mail adapters listed in [Swoosh readme](https://github.com/swoosh/swoosh#adapters), or `Swoosh.Adapters.Local` for in-memory mailbox.
|
* `adapter`: one of the mail adapters listed in [Swoosh readme](https://github.com/swoosh/swoosh#adapters), or `Swoosh.Adapters.Local` for in-memory mailbox.
|
||||||
|
|
|
@ -38,7 +38,7 @@ def put([key], value), do: put(key, value)
|
||||||
|
|
||||||
def put([parent_key | keys], value) do
|
def put([parent_key | keys], value) do
|
||||||
parent =
|
parent =
|
||||||
Application.get_env(:pleroma, parent_key)
|
Application.get_env(:pleroma, parent_key, [])
|
||||||
|> put_in(keys, value)
|
|> put_in(keys, value)
|
||||||
|
|
||||||
Application.put_env(:pleroma, parent_key, parent)
|
Application.put_env(:pleroma, parent_key, parent)
|
||||||
|
|
|
@ -10,10 +10,19 @@ defmodule Pleroma.Upload.Filter.AnonymizeFilename do
|
||||||
"""
|
"""
|
||||||
@behaviour Pleroma.Upload.Filter
|
@behaviour Pleroma.Upload.Filter
|
||||||
|
|
||||||
def filter(upload) do
|
alias Pleroma.Config
|
||||||
extension = List.last(String.split(upload.name, "."))
|
alias Pleroma.Upload
|
||||||
name = Pleroma.Config.get([__MODULE__, :text], random(extension))
|
|
||||||
{:ok, %Pleroma.Upload{upload | name: name}}
|
def filter(%Upload{name: name} = upload) do
|
||||||
|
extension = List.last(String.split(name, "."))
|
||||||
|
name = predefined_name(extension) || random(extension)
|
||||||
|
{:ok, %Upload{upload | name: name}}
|
||||||
|
end
|
||||||
|
|
||||||
|
@spec predefined_name(String.t()) :: String.t() | nil
|
||||||
|
defp predefined_name(extension) do
|
||||||
|
with name when not is_nil(name) <- Config.get([__MODULE__, :text]),
|
||||||
|
do: String.replace(name, "{extension}", extension)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp random(extension) do
|
defp random(extension) do
|
||||||
|
|
|
@ -11,6 +11,7 @@ defmodule Pleroma.Web.CommonAPI do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
alias Pleroma.Web.ActivityPub.Utils
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
|
alias Pleroma.Web.ActivityPub.Visibility
|
||||||
|
|
||||||
import Pleroma.Web.CommonAPI.Utils
|
import Pleroma.Web.CommonAPI.Utils
|
||||||
|
|
||||||
|
@ -284,12 +285,11 @@ def pin(id_or_ap_id, %{ap_id: user_ap_id} = user) do
|
||||||
},
|
},
|
||||||
object: %Object{
|
object: %Object{
|
||||||
data: %{
|
data: %{
|
||||||
"to" => object_to,
|
|
||||||
"type" => "Note"
|
"type" => "Note"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} = activity <- get_by_id_or_ap_id(id_or_ap_id),
|
} = activity <- get_by_id_or_ap_id(id_or_ap_id),
|
||||||
true <- Enum.member?(object_to, "https://www.w3.org/ns/activitystreams#Public"),
|
true <- Visibility.is_public?(activity),
|
||||||
%{valid?: true} = info_changeset <-
|
%{valid?: true} = info_changeset <-
|
||||||
User.Info.add_pinnned_activity(user.info, activity),
|
User.Info.add_pinnned_activity(user.info, activity),
|
||||||
changeset <-
|
changeset <-
|
||||||
|
|
|
@ -356,6 +356,10 @@ def public_timeline(%{assigns: %{user: user}} = conn, params) do
|
||||||
|
|
||||||
def user_statuses(%{assigns: %{user: reading_user}} = conn, params) do
|
def user_statuses(%{assigns: %{user: reading_user}} = conn, params) do
|
||||||
with %User{} = user <- User.get_cached_by_id(params["id"]) do
|
with %User{} = user <- User.get_cached_by_id(params["id"]) do
|
||||||
|
params =
|
||||||
|
params
|
||||||
|
|> Map.put("tag", params["tagged"])
|
||||||
|
|
||||||
activities = ActivityPub.fetch_user_activities(user, reading_user, params)
|
activities = ActivityPub.fetch_user_activities(user, reading_user, params)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
40
test/upload/filter/anonymize_filename_test.exs
Normal file
40
test/upload/filter/anonymize_filename_test.exs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
defmodule Pleroma.Upload.Filter.AnonymizeFilenameTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
alias Pleroma.Config
|
||||||
|
alias Pleroma.Upload
|
||||||
|
|
||||||
|
setup do
|
||||||
|
custom_filename = Config.get([Upload.Filter.AnonymizeFilename, :text])
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Config.put([Upload.Filter.AnonymizeFilename, :text], custom_filename)
|
||||||
|
end)
|
||||||
|
|
||||||
|
upload_file = %Upload{
|
||||||
|
name: "an… image.jpg",
|
||||||
|
content_type: "image/jpg",
|
||||||
|
path: Path.absname("test/fixtures/image_tmp.jpg")
|
||||||
|
}
|
||||||
|
|
||||||
|
%{upload_file: upload_file}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it replaces filename on pre-defined text", %{upload_file: upload_file} do
|
||||||
|
Config.put([Upload.Filter.AnonymizeFilename, :text], "custom-file.png")
|
||||||
|
{:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
|
||||||
|
assert name == "custom-file.png"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it replaces filename on pre-defined text expression", %{upload_file: upload_file} do
|
||||||
|
Config.put([Upload.Filter.AnonymizeFilename, :text], "custom-file.{extension}")
|
||||||
|
{:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
|
||||||
|
assert name == "custom-file.jpg"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it replaces filename on random text", %{upload_file: upload_file} do
|
||||||
|
{:ok, %Upload{name: name}} = Upload.Filter.AnonymizeFilename.filter(upload_file)
|
||||||
|
assert <<_::bytes-size(14)>> <> ".jpg" = name
|
||||||
|
refute name == "an… image.jpg"
|
||||||
|
end
|
||||||
|
end
|
|
@ -188,6 +188,11 @@ test "pin status", %{user: user, activity: activity} do
|
||||||
assert %User{info: %{pinned_activities: [^id]}} = user
|
assert %User{info: %{pinned_activities: [^id]}} = user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "unlisted statuses can be pinned", %{user: user} do
|
||||||
|
{:ok, activity} = CommonAPI.post(user, %{"status" => "HI!!!", "visibility" => "unlisted"})
|
||||||
|
assert {:ok, ^activity} = CommonAPI.pin(activity.id, user)
|
||||||
|
end
|
||||||
|
|
||||||
test "only self-authored can be pinned", %{activity: activity} do
|
test "only self-authored can be pinned", %{activity: activity} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
||||||
|
|
|
@ -1408,6 +1408,19 @@ test "gets a user's statuses without reblogs", %{conn: conn} do
|
||||||
assert [%{"id" => id}] = json_response(conn, 200)
|
assert [%{"id" => id}] = json_response(conn, 200)
|
||||||
assert id == to_string(post.id)
|
assert id == to_string(post.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "filters user's statuses by a hashtag", %{conn: conn} do
|
||||||
|
user = insert(:user)
|
||||||
|
{:ok, post} = CommonAPI.post(user, %{"status" => "#hashtag"})
|
||||||
|
{:ok, _post} = CommonAPI.post(user, %{"status" => "hashtag"})
|
||||||
|
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> get("/api/v1/accounts/#{user.id}/statuses", %{"tagged" => "hashtag"})
|
||||||
|
|
||||||
|
assert [%{"id" => id}] = json_response(conn, 200)
|
||||||
|
assert id == to_string(post.id)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "user relationships" do
|
describe "user relationships" do
|
||||||
|
|
Loading…
Reference in a new issue