honkoma/lib/pleroma/uploaders/s3.ex

59 lines
1.5 KiB
Elixir
Raw Normal View History

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