1 defmodule Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl do
2 @behaviour Pleroma.Web.RichMedia.Parser.TTL
4 @impl Pleroma.Web.RichMedia.Parser.TTL
6 image = Map.get(data, :image)
8 if is_aws_signed_url(image) do
10 |> parse_query_params()
11 |> format_query_params()
12 |> get_expiration_timestamp()
16 defp is_aws_signed_url(""), do: nil
17 defp is_aws_signed_url(nil), do: nil
19 defp is_aws_signed_url(image) when is_binary(image) do
20 %URI{host: host, query: query} = URI.parse(image)
22 if String.contains?(host, "amazonaws.com") and String.contains?(query, "X-Amz-Expires") do
29 defp is_aws_signed_url(_), do: nil
31 defp parse_query_params(image) do
32 %URI{query: query} = URI.parse(image)
36 defp format_query_params(query) do
38 |> String.split(~r/&|=/)
39 |> Enum.chunk_every(2)
40 |> Map.new(fn [k, v] -> {k, v} end)
43 defp get_expiration_timestamp(params) when is_map(params) do
46 |> Map.get("X-Amz-Date")
47 |> Timex.parse("{ISO:Basic:Z}")
49 Timex.to_unix(date) + String.to_integer(Map.get(params, "X-Amz-Expires"))