summaryrefslogtreecommitdiff
path: root/lib/pleroma/web/rich_media/parsers/ttl/aws_signed_url.ex
blob: 0dc1efdaf140a846a027fef46cecddc00706219c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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