d5710793929343ec05fe592a61e97396aded0d18
[akkoma] / lib / pleroma / web / rich_media / parsers / ttl / aws_signed_url.ex
1 defmodule Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl do
2 def run(data, url) do
3 image = Map.get(data, :image)
4
5 if is_aws_signed_url(image) do
6 image
7 |> parse_query_params()
8 |> format_query_params()
9 |> get_expiration_timestamp()
10 |> set_ttl(url)
11 end
12 end
13
14 defp is_aws_signed_url(""), do: nil
15 defp is_aws_signed_url(nil), do: nil
16
17 defp is_aws_signed_url(image) when is_binary(image) do
18 %URI{host: host, query: query} = URI.parse(image)
19
20 if String.contains?(host, "amazonaws.com") and
21 String.contains?(query, "X-Amz-Expires") do
22 image
23 else
24 nil
25 end
26 end
27
28 defp is_aws_signed_url(_), do: nil
29
30 defp parse_query_params(image) do
31 %URI{query: query} = URI.parse(image)
32 query
33 end
34
35 defp format_query_params(query) do
36 query
37 |> String.split(~r/&|=/)
38 |> Enum.chunk_every(2)
39 |> Map.new(fn [k, v] -> {k, v} end)
40 end
41
42 defp get_expiration_timestamp(params) when is_map(params) do
43 {:ok, date} =
44 params
45 |> Map.get("X-Amz-Date")
46 |> Timex.parse("{ISO:Basic:Z}")
47
48 Timex.to_unix(date) + String.to_integer(Map.get(params, "X-Amz-Expires"))
49 end
50
51 defp set_ttl(ttl, url) do
52 Cachex.expire_at(:rich_media_cache, url, ttl * 1000)
53 end
54 end