Pleroma/lib/pleroma/uploaders/s3.ex

67 lines
1.6 KiB
Elixir
Raw Normal View History

# Pleroma: A lightweight social networking server
2018-12-31 16:41:47 +01:00
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
2018-08-28 03:20:54 +02:00
defmodule Pleroma.Uploaders.S3 do
@behaviour Pleroma.Uploaders.Uploader
2018-11-23 17:40:45 +01:00
require Logger
alias Pleroma.Config
# The file name is re-encoded with S3's constraints here to comply with previous
# links with less strict filenames
2018-11-23 17:40:45 +01:00
def get_file(file) do
config = Config.get([__MODULE__])
2019-01-21 14:42:16 +01:00
bucket = Keyword.fetch!(config, :bucket)
bucket_with_namespace =
cond do
truncated_namespace = Keyword.get(config, :truncated_namespace) ->
truncated_namespace
namespace = Keyword.get(config, :bucket_namespace) ->
namespace <> ":" <> bucket
true ->
bucket
2019-01-21 14:42:16 +01:00
end
2018-11-23 17:40:45 +01:00
{:ok,
{:url,
Path.join([
Keyword.fetch!(config, :public_endpoint),
2019-01-21 14:42:16 +01:00
bucket_with_namespace,
2018-11-23 17:40:45 +01:00
strict_encode(URI.decode(file))
])}}
end
2018-08-28 03:20:54 +02:00
2019-02-06 20:19:39 +01:00
def put_file(%Pleroma.Upload{} = upload) do
config = Config.get([__MODULE__])
2018-11-23 17:40:45 +01:00
bucket = Keyword.get(config, :bucket)
2018-08-28 03:20:54 +02:00
2018-11-29 21:11:45 +01:00
s3_name = strict_encode(upload.path)
2018-08-28 03:20:54 +02:00
2018-11-23 17:40:45 +01:00
op =
upload.tempfile
|> ExAws.S3.Upload.stream_file()
|> ExAws.S3.upload(bucket, s3_name, [
2018-08-28 03:20:54 +02:00
{:acl, :public_read},
2018-11-29 21:11:45 +01:00
{:content_type, upload.content_type}
2018-08-28 03:20:54 +02:00
])
2018-11-23 17:40:45 +01:00
case ExAws.request(op) do
{:ok, _} ->
{:ok, {:file, s3_name}}
2018-11-23 17:40:45 +01:00
error ->
Logger.error("#{__MODULE__}: #{inspect(error)}")
{:error, "S3 Upload failed"}
end
2018-08-28 03:20:54 +02:00
end
2018-11-23 17:40:45 +01:00
@regex Regex.compile!("[^0-9a-zA-Z!.*/'()_-]")
def strict_encode(name) do
String.replace(name, @regex, "-")
end
2018-08-28 03:20:54 +02:00
end