Merge branch 'develop' of https://git.pleroma.social/pleroma/pleroma into develop
commit
c2737d13df
@ -0,0 +1,33 @@
|
|||||||
|
# How to set rich media cache ttl based on image ttl
|
||||||
|
## Explanation
|
||||||
|
|
||||||
|
Richmedia are cached without the ttl but the rich media may have image which can expire, like aws signed url.
|
||||||
|
In such cases the old image url (expired) is returned from the media cache.
|
||||||
|
|
||||||
|
So to avoid such situation we can define a module that will set ttl based on image.
|
||||||
|
The module must adopt behaviour `Pleroma.Web.RichMedia.Parser.TTL`
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
```exs
|
||||||
|
defmodule MyModule do
|
||||||
|
@behaviour Pleroma.Web.RichMedia.Parser.TTL
|
||||||
|
|
||||||
|
@impl Pleroma.Web.RichMedia.Parser.TTL
|
||||||
|
def ttl(data, url) do
|
||||||
|
image_url = Map.get(data, :image)
|
||||||
|
# do some parsing in the url and get the ttl of the image
|
||||||
|
# return ttl is unix time
|
||||||
|
parse_ttl_from_url(image_url)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
And update the config
|
||||||
|
|
||||||
|
```exs
|
||||||
|
config :pleroma, :rich_media,
|
||||||
|
ttl_setters: [Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl, MyModule]
|
||||||
|
```
|
||||||
|
|
||||||
|
> For reference there is a parser for AWS signed URL `Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl`, it's enabled by default.
|
@ -0,0 +1,70 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.Plugs.MappedSignatureToIdentityPlug do
|
||||||
|
alias Pleroma.Signature
|
||||||
|
alias Pleroma.User
|
||||||
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
|
|
||||||
|
import Plug.Conn
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
def init(options), do: options
|
||||||
|
|
||||||
|
defp key_id_from_conn(conn) do
|
||||||
|
with %{"keyId" => key_id} <- HTTPSignatures.signature_for_conn(conn) do
|
||||||
|
Signature.key_id_to_actor_id(key_id)
|
||||||
|
else
|
||||||
|
_ ->
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp user_from_key_id(conn) do
|
||||||
|
with key_actor_id when is_binary(key_actor_id) <- key_id_from_conn(conn),
|
||||||
|
{:ok, %User{} = user} <- User.get_or_fetch_by_ap_id(key_actor_id) do
|
||||||
|
user
|
||||||
|
else
|
||||||
|
_ ->
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(%{assigns: %{user: _}} = conn, _opts), do: conn
|
||||||
|
|
||||||
|
# if this has payload make sure it is signed by the same actor that made it
|
||||||
|
def call(%{assigns: %{valid_signature: true}, params: %{"actor" => actor}} = conn, _opts) do
|
||||||
|
with actor_id <- Utils.get_ap_id(actor),
|
||||||
|
{:user, %User{} = user} <- {:user, user_from_key_id(conn)},
|
||||||
|
{:user_match, true} <- {:user_match, user.ap_id == actor_id} do
|
||||||
|
assign(conn, :user, user)
|
||||||
|
else
|
||||||
|
{:user_match, false} ->
|
||||||
|
Logger.debug("Failed to map identity from signature (payload actor mismatch)")
|
||||||
|
Logger.debug("key_id=#{key_id_from_conn(conn)}, actor=#{actor}")
|
||||||
|
assign(conn, :valid_signature, false)
|
||||||
|
|
||||||
|
# remove me once testsuite uses mapped capabilities instead of what we do now
|
||||||
|
{:user, nil} ->
|
||||||
|
Logger.debug("Failed to map identity from signature (lookup failure)")
|
||||||
|
Logger.debug("key_id=#{key_id_from_conn(conn)}, actor=#{actor}")
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# no payload, probably a signed fetch
|
||||||
|
def call(%{assigns: %{valid_signature: true}} = conn, _opts) do
|
||||||
|
with %User{} = user <- user_from_key_id(conn) do
|
||||||
|
assign(conn, :user, user)
|
||||||
|
else
|
||||||
|
_ ->
|
||||||
|
Logger.debug("Failed to map identity from signature (no payload actor mismatch)")
|
||||||
|
Logger.debug("key_id=#{key_id_from_conn(conn)}")
|
||||||
|
assign(conn, :valid_signature, false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# no signature at all
|
||||||
|
def call(conn, _opts), do: conn
|
||||||
|
end
|
@ -0,0 +1,20 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.ActivityPub.InternalFetchActor do
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
|
def init do
|
||||||
|
# Wait for everything to settle.
|
||||||
|
Process.sleep(1000 * 5)
|
||||||
|
get_actor()
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_actor do
|
||||||
|
"#{Pleroma.Web.Endpoint.url()}/internal/fetch"
|
||||||
|
|> User.get_or_create_service_actor_by_ap_id("internal.fetch")
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,24 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicy do
|
||||||
|
@moduledoc "Block messages which mention a user"
|
||||||
|
|
||||||
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def filter(%{"type" => "Create"} = message) do
|
||||||
|
reject_actors = Pleroma.Config.get([:mrf_mention, :actors], [])
|
||||||
|
recipients = (message["to"] || []) ++ (message["cc"] || [])
|
||||||
|
|
||||||
|
if Enum.any?(recipients, fn recipient -> Enum.member?(reject_actors, recipient) end) do
|
||||||
|
{:reject, nil}
|
||||||
|
else
|
||||||
|
{:ok, message}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def filter(message), do: {:ok, message}
|
||||||
|
end
|
@ -0,0 +1,52 @@
|
|||||||
|
defmodule Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl do
|
||||||
|
@behaviour Pleroma.Web.RichMedia.Parser.TTL
|
||||||
|
|
||||||
|
@impl Pleroma.Web.RichMedia.Parser.TTL
|
||||||
|
def ttl(data, _url) do
|
||||||
|
image = Map.get(data, :image)
|
||||||
|
|
||||||
|
if is_aws_signed_url(image) do
|
||||||
|
image
|
||||||
|
|> parse_query_params()
|
||||||
|
|> format_query_params()
|
||||||
|
|> get_expiration_timestamp()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp is_aws_signed_url(""), do: nil
|
||||||
|
defp is_aws_signed_url(nil), do: nil
|
||||||
|
|
||||||
|
defp is_aws_signed_url(image) when is_binary(image) do
|
||||||
|
%URI{host: host, query: query} = URI.parse(image)
|
||||||
|
|
||||||
|
if String.contains?(host, "amazonaws.com") and
|
||||||
|
String.contains?(query, "X-Amz-Expires") do
|
||||||
|
image
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp is_aws_signed_url(_), do: nil
|
||||||
|
|
||||||
|
defp parse_query_params(image) do
|
||||||
|
%URI{query: query} = URI.parse(image)
|
||||||
|
query
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_query_params(query) do
|
||||||
|
query
|
||||||
|
|> String.split(~r/&|=/)
|
||||||
|
|> Enum.chunk_every(2)
|
||||||
|
|> Map.new(fn [k, v] -> {k, v} end)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_expiration_timestamp(params) when is_map(params) do
|
||||||
|
{:ok, date} =
|
||||||
|
params
|
||||||
|
|> Map.get("X-Amz-Date")
|
||||||
|
|> Timex.parse("{ISO:Basic:Z}")
|
||||||
|
|
||||||
|
Timex.to_unix(date) + String.to_integer(Map.get(params, "X-Amz-Expires"))
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,3 @@
|
|||||||
|
defmodule Pleroma.Web.RichMedia.Parser.TTL do
|
||||||
|
@callback ttl(Map.t(), String.t()) :: {:ok, Integer.t()} | {:error, String.t()}
|
||||||
|
end
|
@ -0,0 +1,5 @@
|
|||||||
|
<meta name="twitter:card" content="summary" />
|
||||||
|
<meta name="twitter:site" content="@flickr" />
|
||||||
|
<meta name="twitter:title" content="Small Island Developing States Photo Submission" />
|
||||||
|
<meta name="twitter:description" content="View the album on Flickr." />
|
||||||
|
<meta name="twitter:image" content="https://pleroma.s3.ap-southeast-1.amazonaws.com/sachin%20%281%29%20_a%20-%25%2Aasdasd%20BNN%20bnnn%20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIBLWWK6RGDQXDLJQ%2F20190716%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=20190716T175105Z&X-Amz-Expires=300000&X-Amz-Signature=04ffd6b98634f4b1bbabc62e0fac4879093cd54a6eed24fe8eb38e8369526bbf&X-Amz-SignedHeaders=host" />
|
@ -0,0 +1,59 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.Plugs.MappedSignatureToIdentityPlugTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
alias Pleroma.Web.Plugs.MappedSignatureToIdentityPlug
|
||||||
|
|
||||||
|
import Tesla.Mock
|
||||||
|
import Plug.Conn
|
||||||
|
|
||||||
|
setup do
|
||||||
|
mock(fn env -> apply(HttpRequestMock, :request, [env]) end)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
defp set_signature(conn, key_id) do
|
||||||
|
conn
|
||||||
|
|> put_req_header("signature", "keyId=\"#{key_id}\"")
|
||||||
|
|> assign(:valid_signature, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it successfully maps a valid identity with a valid signature" do
|
||||||
|
conn =
|
||||||
|
build_conn(:get, "/doesntmattter")
|
||||||
|
|> set_signature("http://mastodon.example.org/users/admin")
|
||||||
|
|> MappedSignatureToIdentityPlug.call(%{})
|
||||||
|
|
||||||
|
refute is_nil(conn.assigns.user)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it successfully maps a valid identity with a valid signature with payload" do
|
||||||
|
conn =
|
||||||
|
build_conn(:post, "/doesntmattter", %{"actor" => "http://mastodon.example.org/users/admin"})
|
||||||
|
|> set_signature("http://mastodon.example.org/users/admin")
|
||||||
|
|> MappedSignatureToIdentityPlug.call(%{})
|
||||||
|
|
||||||
|
refute is_nil(conn.assigns.user)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it considers a mapped identity to be invalid when it mismatches a payload" do
|
||||||
|
conn =
|
||||||
|
build_conn(:post, "/doesntmattter", %{"actor" => "http://mastodon.example.org/users/admin"})
|
||||||
|
|> set_signature("https://niu.moe/users/rye")
|
||||||
|
|> MappedSignatureToIdentityPlug.call(%{})
|
||||||
|
|
||||||
|
assert %{valid_signature: false} == conn.assigns
|
||||||
|
end
|
||||||
|
|
||||||
|
@tag skip: "known breakage; the testsuite presently depends on it"
|
||||||
|
test "it considers a mapped identity to be invalid when the identity cannot be found" do
|
||||||
|
conn =
|
||||||
|
build_conn(:post, "/doesntmattter", %{"actor" => "http://mastodon.example.org/users/admin"})
|
||||||
|
|> set_signature("http://niu.moe/users/rye")
|
||||||
|
|> MappedSignatureToIdentityPlug.call(%{})
|
||||||
|
|
||||||
|
assert %{valid_signature: false} == conn.assigns
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,31 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Upload.Filter.DedupeTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
alias Pleroma.Upload
|
||||||
|
alias Pleroma.Upload.Filter.Dedupe
|
||||||
|
|
||||||
|
@shasum "e30397b58d226d6583ab5b8b3c5defb0c682bda5c31ef07a9f57c1c4986e3781"
|
||||||
|
|
||||||
|
test "adds shasum" do
|
||||||
|
File.cp!(
|
||||||
|
"test/fixtures/image.jpg",
|
||||||
|
"test/fixtures/image_tmp.jpg"
|
||||||
|
)
|
||||||
|
|
||||||
|
upload = %Upload{
|
||||||
|
name: "an… image.jpg",
|
||||||
|
content_type: "image/jpg",
|
||||||
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
|
tempfile: Path.absname("test/fixtures/image_tmp.jpg")
|
||||||
|
}
|
||||||
|
|
||||||
|
assert {
|
||||||
|
:ok,
|
||||||
|
%Pleroma.Upload{id: @shasum, path: "#{@shasum}.jpg"}
|
||||||
|
} = Dedupe.filter(upload)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,44 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Upload.Filter.MogrifunTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
import Mock
|
||||||
|
|
||||||
|
alias Pleroma.Upload
|
||||||
|
alias Pleroma.Upload.Filter
|
||||||
|
|
||||||
|
test "apply mogrify filter" do
|
||||||
|
File.cp!(
|
||||||
|
"test/fixtures/image.jpg",
|
||||||
|
"test/fixtures/image_tmp.jpg"
|
||||||
|
)
|
||||||
|
|
||||||
|
upload = %Upload{
|
||||||
|
name: "an… image.jpg",
|
||||||
|
content_type: "image/jpg",
|
||||||
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
|
tempfile: Path.absname("test/fixtures/image_tmp.jpg")
|
||||||
|
}
|
||||||
|
|
||||||
|
task =
|
||||||
|
Task.async(fn ->
|
||||||
|
assert_receive {:apply_filter, {}}, 4_000
|
||||||
|
end)
|
||||||
|
|
||||||
|
with_mocks([
|
||||||
|
{Mogrify, [],
|
||||||
|
[
|
||||||
|
open: fn _f -> %Mogrify.Image{} end,
|
||||||
|
custom: fn _m, _a -> send(task.pid, {:apply_filter, {}}) end,
|
||||||
|
custom: fn _m, _a, _o -> send(task.pid, {:apply_filter, {}}) end,
|
||||||
|
save: fn _f, _o -> :ok end
|
||||||
|
]}
|
||||||
|
]) do
|
||||||
|
assert Filter.Mogrifun.filter(upload) == :ok
|
||||||
|
end
|
||||||
|
|
||||||
|
Task.await(task)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,51 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Upload.Filter.MogrifyTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
import Mock
|
||||||
|
|
||||||
|
alias Pleroma.Config
|
||||||
|
alias Pleroma.Upload
|
||||||
|
alias Pleroma.Upload.Filter
|
||||||
|
|
||||||
|
setup do
|
||||||
|
filter = Config.get([Filter.Mogrify, :args])
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Config.put([Filter.Mogrify, :args], filter)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "apply mogrify filter" do
|
||||||
|
Config.put([Filter.Mogrify, :args], [{"tint", "40"}])
|
||||||
|
|
||||||
|
File.cp!(
|
||||||
|
"test/fixtures/image.jpg",
|
||||||
|
"test/fixtures/image_tmp.jpg"
|
||||||
|
)
|
||||||
|
|
||||||
|
upload = %Upload{
|
||||||
|
name: "an… image.jpg",
|
||||||
|
content_type: "image/jpg",
|
||||||
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
|
tempfile: Path.absname("test/fixtures/image_tmp.jpg")
|
||||||
|
}
|
||||||
|
|
||||||
|
task =
|
||||||
|
Task.async(fn ->
|
||||||
|
assert_receive {:apply_filter, {_, "tint", "40"}}, 4_000
|
||||||
|
end)
|
||||||
|
|
||||||
|
with_mock Mogrify,
|
||||||
|
open: fn _f -> %Mogrify.Image{} end,
|
||||||
|
custom: fn _m, _a -> :ok end,
|
||||||
|
custom: fn m, a, o -> send(task.pid, {:apply_filter, {m, a, o}}) end,
|
||||||
|
save: fn _f, _o -> :ok end do
|
||||||
|
assert Filter.Mogrify.filter(upload) == :ok
|
||||||
|
end
|
||||||
|
|
||||||
|
Task.await(task)
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,39 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Upload.FilterTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
alias Pleroma.Config
|
||||||
|
alias Pleroma.Upload.Filter
|
||||||
|
|
||||||
|
setup do
|
||||||
|
custom_filename = Config.get([Pleroma.Upload.Filter.AnonymizeFilename, :text])
|
||||||
|
|
||||||
|
on_exit(fn ->
|
||||||
|
Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], custom_filename)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "applies filters" do
|
||||||
|
Config.put([Pleroma.Upload.Filter.AnonymizeFilename, :text], "custom-file.png")
|
||||||
|
|
||||||
|
File.cp!(
|
||||||
|
"test/fixtures/image.jpg",
|
||||||
|
"test/fixtures/image_tmp.jpg"
|
||||||
|
)
|
||||||
|
|
||||||
|
upload = %Pleroma.Upload{
|
||||||
|
name: "an… image.jpg",
|
||||||
|
content_type: "image/jpg",
|
||||||
|
path: Path.absname("test/fixtures/image_tmp.jpg"),
|
||||||
|
tempfile: Path.absname("test/fixtures/image_tmp.jpg")
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Filter.filter([], upload) == {:ok, upload}
|
||||||
|
|
||||||
|
assert {:ok, upload} = Filter.filter([Pleroma.Upload.Filter.AnonymizeFilename], upload)
|
||||||
|
assert upload.name == "custom-file.png"
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,92 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.ActivityPub.MRF.MentionPolicyTest do
|
||||||
|
use Pleroma.DataCase
|
||||||
|
|
||||||
|
alias Pleroma.Web.ActivityPub.MRF.MentionPolicy
|
||||||
|
|
||||||
|
test "pass filter if allow list is empty" do
|
||||||
|
Pleroma.Config.delete([:mrf_mention])
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"type" => "Create",
|
||||||
|
"to" => ["https://example.com/ok"],
|
||||||
|
"cc" => ["https://example.com/blocked"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert MentionPolicy.filter(message) == {:ok, message}
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "allow" do
|
||||||
|
test "empty" do
|
||||||
|
Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"type" => "Create"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert MentionPolicy.filter(message) == {:ok, message}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "to" do
|
||||||
|
Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"type" => "Create",
|
||||||
|
"to" => ["https://example.com/ok"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert MentionPolicy.filter(message) == {:ok, message}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "cc" do
|
||||||
|
Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"type" => "Create",
|
||||||
|
"cc" => ["https://example.com/ok"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert MentionPolicy.filter(message) == {:ok, message}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "both" do
|
||||||
|
Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"type" => "Create",
|
||||||
|
"to" => ["https://example.com/ok"],
|
||||||
|
"cc" => ["https://example.com/ok2"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert MentionPolicy.filter(message) == {:ok, message}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "deny" do
|
||||||
|
test "to" do
|
||||||
|
Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"type" => "Create",
|
||||||
|
"to" => ["https://example.com/blocked"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert MentionPolicy.filter(message) == {:reject, nil}
|
||||||
|
end
|
||||||
|
|
||||||
|
test "cc" do
|
||||||
|
Pleroma.Config.put([:mrf_mention], %{actors: ["https://example.com/blocked"]})
|
||||||
|
|
||||||
|
message = %{
|
||||||
|
"type" => "Create",
|
||||||
|
"to" => ["https://example.com/ok"],
|
||||||
|
"cc" => ["https://example.com/blocked"]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert MentionPolicy.filter(message) == {:reject, nil}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,81 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.RichMedia.TTL.AwsSignedUrlTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
test "s3 signed url is parsed correct for expiration time" do
|
||||||
|
url = "https://pleroma.social/amz"
|
||||||
|
|
||||||
|
{:ok, timestamp} =
|
||||||
|
Timex.now()
|
||||||
|
|> DateTime.truncate(:second)
|
||||||
|
|> Timex.format("{ISO:Basic:Z}")
|
||||||
|
|
||||||
|
# in seconds
|
||||||
|
valid_till = 30
|
||||||
|
|
||||||
|
metadata = construct_metadata(timestamp, valid_till, url)
|
||||||
|
|
||||||
|
expire_time =
|
||||||
|
Timex.parse!(timestamp, "{ISO:Basic:Z}") |> Timex.to_unix() |> Kernel.+(valid_till)
|
||||||
|
|
||||||
|
assert expire_time == Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl.ttl(metadata, url)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "s3 signed url is parsed and correct ttl is set for rich media" do
|
||||||
|
url = "https://pleroma.social/amz"
|
||||||
|
|
||||||
|
{:ok, timestamp} =
|
||||||
|
Timex.now()
|
||||||
|
|> DateTime.truncate(:second)
|
||||||
|
|> Timex.format("{ISO:Basic:Z}")
|
||||||
|
|
||||||
|
# in seconds
|
||||||
|
valid_till = 30
|
||||||
|
|
||||||
|
metadata = construct_metadata(timestamp, valid_till, url)
|
||||||
|
|
||||||
|
body = """
|
||||||
|
<meta name="twitter:card" content="Pleroma" />
|
||||||
|
<meta name="twitter:site" content="Pleroma" />
|
||||||
|
<meta name="twitter:title" content="Pleroma" />
|
||||||
|
<meta name="twitter:description" content="Pleroma" />
|
||||||
|
<meta name="twitter:image" content="#{Map.get(metadata, :image)}" />
|
||||||
|
"""
|
||||||
|
|
||||||
|
Tesla.Mock.mock(fn
|
||||||
|
%{
|
||||||
|
method: :get,
|
||||||
|
url: "https://pleroma.social/amz"
|
||||||
|
} ->
|
||||||
|
%Tesla.Env{status: 200, body: body}
|
||||||
|
end)
|
||||||
|
|
||||||
|
Cachex.put(:rich_media_cache, url, metadata)
|
||||||
|
|
||||||
|
Pleroma.Web.RichMedia.Parser.set_ttl_based_on_image({:ok, metadata}, url)
|
||||||
|
|
||||||
|
{:ok, cache_ttl} = Cachex.ttl(:rich_media_cache, url)
|
||||||
|
|
||||||
|
# as there is delay in setting and pulling the data from cache we ignore 1 second
|
||||||
|
assert_in_delta(valid_till * 1000, cache_ttl, 1000)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp construct_s3_url(timestamp, valid_till) do
|
||||||
|
"https://pleroma.s3.ap-southeast-1.amazonaws.com/sachin%20%281%29%20_a%20-%25%2Aasdasd%20BNN%20bnnn%20.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIBLWWK6RGDQXDLJQ%2F20190716%2Fap-southeast-1%2Fs3%2Faws4_request&X-Amz-Date=#{
|
||||||
|
timestamp
|
||||||
|
}&X-Amz-Expires=#{valid_till}&X-Amz-Signature=04ffd6b98634f4b1bbabc62e0fac4879093cd54a6eed24fe8eb38e8369526bbf&X-Amz-SignedHeaders=host"
|
||||||
|
end
|
||||||
|
|
||||||
|
defp construct_metadata(timestamp, valid_till, url) do
|
||||||
|
%{
|
||||||
|
image: construct_s3_url(timestamp, valid_till),
|
||||||
|
site: "Pleroma",
|
||||||
|
title: "Pleroma",
|
||||||
|
description: "Pleroma",
|
||||||
|
url: url
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
@ -0,0 +1,43 @@
|
|||||||
|
# Pleroma: A lightweight social networking server
|
||||||
|
# Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
|
||||||
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
|
defmodule Pleroma.Web.UploaderControllerTest do
|
||||||
|
use Pleroma.Web.ConnCase
|
||||||
|
alias Pleroma.Uploaders.Uploader
|
||||||
|
|
||||||
|
describe "callback/2" do
|
||||||
|
test "it returns 400 response when process callback isn't alive", %{conn: conn} do
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> post(uploader_path(conn, :callback, "test-path"))
|
||||||
|
|
||||||
|
assert res.status == 400
|
||||||
|
assert res.resp_body == "{\"error\":\"bad request\"}"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "it returns success result", %{conn: conn} do
|
||||||
|
task =
|
||||||
|
Task.async(fn ->
|
||||||
|
receive do
|
||||||
|
{Uploader, pid, conn, _params} ->
|
||||||
|
conn =
|
||||||
|
conn
|
||||||
|
|> put_status(:ok)
|
||||||
|
|> Phoenix.Controller.json(%{upload_path: "test-path"})
|
||||||
|
|
||||||
|
send(pid, {Uploader, conn})
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
:global.register_name({Uploader, "test-path"}, task.pid)
|
||||||
|
|
||||||
|
res =
|
||||||
|
conn
|
||||||
|
|> post(uploader_path(conn, :callback, "test-path"))
|
||||||
|
|> json_response(200)
|
||||||
|
|
||||||
|
assert res == %{"upload_path" => "test-path"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in new issue