alias Pleroma.Web.ActivityPub.Visibility
alias Pleroma.Web.CommonAPI.ActivityDraft
alias Pleroma.Web.MediaProxy
- alias Pleroma.Web.Plugs.AuthenticationPlug
alias Pleroma.Web.Utils.Params
require Logger
def attachments_from_ids_no_descs(ids) do
Enum.map(ids, fn media_id ->
- case Repo.get(Object, media_id) do
+ case get_attachment(media_id) do
%Object{data: data} -> data
_ -> nil
end
{_, descs} = Jason.decode(descs_str)
Enum.map(ids, fn media_id ->
- with %Object{data: data} <- Repo.get(Object, media_id) do
+ with %Object{data: data} <- get_attachment(media_id) do
Map.put(data, "name", descs[media_id])
end
end)
|> Enum.reject(&is_nil/1)
end
+ defp get_attachment(media_id) do
+ Repo.get(Object, media_id)
+ end
+
@spec get_to_and_cc(ActivityDraft.t()) :: {list(String.t()), list(String.t())}
def get_to_and_cc(%{in_reply_to_conversation: %Participation{} = participation}) do
|> maybe_add_attachments(draft.attachments, attachment_links)
end
- defp get_content_type(content_type) do
+ def get_content_type(content_type) do
if Enum.member?(Config.get([:instance, :allowed_post_formats]), content_type) do
content_type
else
end
end
- def make_context(_, %Participation{} = participation) do
+ def make_context(%{in_reply_to_conversation: %Participation{} = participation}) do
Repo.preload(participation, :conversation).conversation.ap_id
end
- def make_context(%Activity{data: %{"context" => context}}, _), do: context
- def make_context(_, _), do: Utils.generate_context_id()
+ def make_context(%{in_reply_to: %Activity{data: %{"context" => context}}}), do: context
+ def make_context(%{quote: %Activity{data: %{"context" => context}}}), do: context
+ def make_context(_), do: Utils.generate_context_id()
def maybe_add_attachments(parsed, _attachments, false = _no_links), do: parsed
|> Formatter.linkify(options)
end
- def format_input(text, "text/markdown", options) do
+ def format_input(text, "text/x.misskeymarkdown", options) do
text
- |> Formatter.mentions_escape(options)
- |> Formatter.markdown_to_html()
+ |> Formatter.markdown_to_html(%{breaks: true})
+ |> MfmParser.Parser.parse()
+ |> MfmParser.Encoder.to_html()
|> Formatter.linkify(options)
|> Formatter.html_escape("text/html")
end
- def format_input(text, "text/x.misskeymarkdown", options) do
+ def format_input(text, "text/markdown", options) do
text
- |> Formatter.html_escape("text/plain")
+ |> Formatter.mentions_escape(options)
+ |> Formatter.markdown_to_html()
|> Formatter.linkify(options)
- |> (fn {text, mentions, tags} ->
- {String.replace(text, ~r/\r?\n/, "<br>"), mentions, tags}
- end).()
+ |> Formatter.html_escape("text/html")
end
def format_naive_asctime(date) do
end
def to_masto_date(%NaiveDateTime{} = date) do
- date
- |> NaiveDateTime.to_iso8601()
- |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
+ # NOTE: Elixir’s ISO 8601 format is a superset of the real standard
+ # It supports negative years for example.
+ # ISO8601 only supports years before 1583 with mutual agreement
+ if date.year < 1583 do
+ "1970-01-01T00:00:00Z"
+ else
+ date
+ |> NaiveDateTime.to_iso8601()
+ |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
+ end
end
def to_masto_date(date) when is_binary(date) do
with {:ok, date} <- NaiveDateTime.from_iso8601(date) do
to_masto_date(date)
else
- _ -> ""
+ _ -> "1970-01-01T00:00:00Z"
end
end
- def to_masto_date(_), do: ""
+ def to_masto_date(_), do: "1970-01-01T00:00:00Z"
defp shortname(name) do
with max_length when max_length > 0 <-
@spec confirm_current_password(User.t(), String.t()) :: {:ok, User.t()} | {:error, String.t()}
def confirm_current_password(user, password) do
with %User{local: true} = db_user <- User.get_cached_by_id(user.id),
- true <- AuthenticationPlug.checkpw(password, db_user.password_hash) do
+ true <- Pleroma.Password.checkpw(password, db_user.password_hash) do
{:ok, db_user}
else
_ -> {:error, dgettext("errors", "Invalid password.")}
def get_report_statuses(_, _), do: {:ok, nil}
- # DEPRECATED mostly, context objects are now created at insertion time.
- def context_to_conversation_id(context) do
- with %Object{id: id} <- Object.get_cached_by_ap_id(context) do
- id
- else
- _e ->
- changeset = Object.context_mapping(context)
-
- case Repo.insert(changeset) do
- {:ok, %{id: id}} ->
- id
-
- # This should be solved by an upsert, but it seems ecto
- # has problems accessing the constraint inside the jsonb.
- {:error, _} ->
- Object.get_cached_by_ap_id(context).id
- end
- end
- end
-
- def conversation_id_to_context(id) do
- with %Object{data: %{"id" => context}} <- Repo.get(Object, id) do
- context
- else
- _e ->
- {:error, dgettext("errors", "No such conversation")}
- end
- end
-
def validate_character_limit("" = _full_payload, [] = _attachments) do
{:error, dgettext("errors", "Cannot post an empty status without attachments")}
end