2018-12-23 21:04:54 +01:00
|
|
|
# Pleroma: A lightweight social networking server
|
2018-12-31 16:41:47 +01:00
|
|
|
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
|
2018-12-23 21:04:54 +01:00
|
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
2018-08-28 03:20:54 +02:00
|
|
|
defmodule Pleroma.Uploaders.S3 do
|
2018-08-28 14:57:41 +02:00
|
|
|
@behaviour Pleroma.Uploaders.Uploader
|
2018-11-23 17:40:45 +01:00
|
|
|
require Logger
|
|
|
|
|
2019-08-10 13:27:59 +02:00
|
|
|
alias Pleroma.Config
|
|
|
|
|
2019-03-05 05:37:33 +01:00
|
|
|
# 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
|
2019-08-10 13:27:59 +02:00
|
|
|
config = Config.get([__MODULE__])
|
2019-01-21 14:42:16 +01:00
|
|
|
bucket = Keyword.fetch!(config, :bucket)
|
|
|
|
|
|
|
|
bucket_with_namespace =
|
2019-03-24 19:32:09 +01:00
|
|
|
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
|
2019-08-10 13:27:59 +02:00
|
|
|
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 =
|
2019-08-10 13:27:59 +02:00
|
|
|
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-10-29 19:00:59 +01:00
|
|
|
|
2018-11-23 17:40:45 +01:00
|
|
|
case ExAws.request(op) do
|
|
|
|
{:ok, _} ->
|
|
|
|
{:ok, {:file, s3_name}}
|
2018-10-29 19:00:59 +01:00
|
|
|
|
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-09-24 15:38:32 +02:00
|
|
|
|
2018-11-23 17:40:45 +01:00
|
|
|
@regex Regex.compile!("[^0-9a-zA-Z!.*/'()_-]")
|
|
|
|
def strict_encode(name) do
|
|
|
|
String.replace(name, @regex, "-")
|
2018-09-24 15:38:32 +02:00
|
|
|
end
|
2018-08-28 03:20:54 +02:00
|
|
|
end
|