Merge branch 'update-service-files-of-openrc-and-systemd-to-new-recommended-paths...
[akkoma] / lib / pleroma / uploaders / s3.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Uploaders.S3 do
6 @behaviour Pleroma.Uploaders.Uploader
7 require Logger
8
9 # The file name is re-encoded with S3's constraints here to comply with previous links with less strict filenames
10 def get_file(file) do
11 config = Pleroma.Config.get([__MODULE__])
12 bucket = Keyword.fetch!(config, :bucket)
13
14 bucket_with_namespace =
15 if namespace = Keyword.get(config, :bucket_namespace) do
16 namespace <> ":" <> bucket
17 else
18 bucket
19 end
20
21 {:ok,
22 {:url,
23 Path.join([
24 Keyword.fetch!(config, :public_endpoint),
25 bucket_with_namespace,
26 strict_encode(URI.decode(file))
27 ])}}
28 end
29
30 def put_file(upload = %Pleroma.Upload{}) do
31 config = Pleroma.Config.get([__MODULE__])
32 bucket = Keyword.get(config, :bucket)
33
34 {:ok, file_data} = File.read(upload.tempfile)
35
36 s3_name = strict_encode(upload.path)
37
38 op =
39 ExAws.S3.put_object(bucket, s3_name, file_data, [
40 {:acl, :public_read},
41 {:content_type, upload.content_type}
42 ])
43
44 case ExAws.request(op) do
45 {:ok, _} ->
46 {:ok, {:file, s3_name}}
47
48 error ->
49 Logger.error("#{__MODULE__}: #{inspect(error)}")
50 {:error, "S3 Upload failed"}
51 end
52 end
53
54 @regex Regex.compile!("[^0-9a-zA-Z!.*/'()_-]")
55 def strict_encode(name) do
56 String.replace(name, @regex, "-")
57 end
58 end