lib/pleroma/uploaders/ipfs.ex:43:no_return
Function put_file/1 has no local return.
________________________________________________________________________________
lib/pleroma/uploaders/ipfs.ex:49:call
The function call will not succeed.
Pleroma.HTTP.post(
binary(),
_mp :: %Tesla.Multipart{
:boundary => binary(),
:content_type_params => [binary()],
:parts => [
%Tesla.Multipart.Part{
:body => binary(),
:dispositions => [any()],
:headers => [any()]
},
...
]
},
[],
[{:params, [{:"cid-version", <<49>>}]}]
)
will never return since the success typing is:
(binary(), binary(), [{binary(), binary()}], Keyword.t()) ::
{:error, _}
| {:ok,
%Tesla.Env{
:__client__ => %Tesla.Client{
:adapter => nil | {_, _} | {_, _, _},
:fun => _,
:post => [any()],
:pre => [any()]
},
:__module__ => atom(),
:body => _,
:headers => [{_, _}],
:method => :delete | :get | :head | :options | :patch | :post | :put | :trace,
:opts => [{_, _}],
:query => [{_, _}],
:status => nil | integer(),
:url => binary()
}}
and the contract is
(Pleroma.HTTP.Request.url(), String.t(), Pleroma.HTTP.Request.headers(), :elixir.keyword()) ::
{:ok, Tesla.Env.t()} | {:error, any()}
72 lines
2 KiB
Elixir
72 lines
2 KiB
Elixir
# Pleroma: A lightweight social networking server
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
defmodule Pleroma.Uploaders.IPFS do
|
|
@behaviour Pleroma.Uploaders.Uploader
|
|
require Logger
|
|
|
|
alias Tesla.Multipart
|
|
|
|
@api_add "/api/v0/add"
|
|
@api_delete "/api/v0/files/rm"
|
|
@config_impl Application.compile_env(:pleroma, [__MODULE__, :config_impl], Pleroma.Config)
|
|
|
|
@placeholder "{CID}"
|
|
def placeholder, do: @placeholder
|
|
|
|
@impl true
|
|
def get_file(file) do
|
|
b_url = Pleroma.Upload.base_url()
|
|
|
|
if String.contains?(b_url, @placeholder) do
|
|
{:ok, {:url, String.replace(b_url, @placeholder, URI.decode(file))}}
|
|
else
|
|
{:error, "IPFS Get URL doesn't contain 'cid' placeholder"}
|
|
end
|
|
end
|
|
|
|
@impl true
|
|
def put_file(%Pleroma.Upload{tempfile: tempfile}) do
|
|
mp =
|
|
Multipart.new()
|
|
|> Multipart.add_content_type_param("charset=utf-8")
|
|
|> Multipart.add_file(tempfile)
|
|
|
|
endpoint = ipfs_endpoint(@api_add)
|
|
|
|
with {:ok, %{body: body}} when is_binary(body) <-
|
|
Pleroma.HTTP.post(endpoint, mp, [], params: ["cid-version": "1"], pool: :upload),
|
|
{_, {:ok, decoded}} <- {:json, Jason.decode(body)},
|
|
{_, true} <- {:hash, Map.has_key?(decoded, "Hash")} do
|
|
{:ok, {:file, decoded["Hash"]}}
|
|
else
|
|
{:hash, false} ->
|
|
{:error, "JSON doesn't contain Hash key"}
|
|
|
|
{:json, error} ->
|
|
Logger.error("#{__MODULE__}: #{inspect(error)}")
|
|
{:error, "JSON decode failed"}
|
|
|
|
error ->
|
|
Logger.error("#{__MODULE__}: #{inspect(error)}")
|
|
{:error, "IPFS Gateway upload failed"}
|
|
end
|
|
end
|
|
|
|
@impl true
|
|
def delete_file(file) do
|
|
endpoint = ipfs_endpoint(@api_delete)
|
|
|
|
case Pleroma.HTTP.post(endpoint, "", [], params: [arg: file]) do
|
|
{:ok, %{status: 204}} -> :ok
|
|
error -> {:error, inspect(error)}
|
|
end
|
|
end
|
|
|
|
defp ipfs_endpoint(path) do
|
|
URI.parse(@config_impl.get([__MODULE__, :post_gateway_url]))
|
|
|> Map.put(:path, path)
|
|
|> URI.to_string()
|
|
end
|
|
end
|