logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma

aws_signed_url.ex (1196B)


  1. defmodule Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl do
  2. @behaviour Pleroma.Web.RichMedia.Parser.TTL
  3. @impl Pleroma.Web.RichMedia.Parser.TTL
  4. def ttl(data, _url) do
  5. image = Map.get(data, :image)
  6. if is_aws_signed_url(image) do
  7. image
  8. |> parse_query_params()
  9. |> format_query_params()
  10. |> get_expiration_timestamp()
  11. else
  12. {:error, "Not aws signed url #{inspect(image)}"}
  13. end
  14. end
  15. defp is_aws_signed_url(image) when is_binary(image) and image != "" do
  16. %URI{host: host, query: query} = URI.parse(image)
  17. String.contains?(host, "amazonaws.com") and String.contains?(query, "X-Amz-Expires")
  18. end
  19. defp is_aws_signed_url(_), do: nil
  20. defp parse_query_params(image) do
  21. %URI{query: query} = URI.parse(image)
  22. query
  23. end
  24. defp format_query_params(query) do
  25. query
  26. |> String.split(~r/&|=/)
  27. |> Enum.chunk_every(2)
  28. |> Map.new(fn [k, v] -> {k, v} end)
  29. end
  30. defp get_expiration_timestamp(params) when is_map(params) do
  31. {:ok, date} =
  32. params
  33. |> Map.get("X-Amz-Date")
  34. |> Timex.parse("{ISO:Basic:Z}")
  35. {:ok, Timex.to_unix(date) + String.to_integer(Map.get(params, "X-Amz-Expires"))}
  36. end
  37. end