logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

emoji_pack_controller.ex (6933B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.PleromaAPI.EmojiPackController do
  5. use Pleroma.Web, :controller
  6. alias Pleroma.Emoji.Pack
  7. plug(Pleroma.Web.ApiSpec.CastAndValidate, replace_params: false)
  8. plug(
  9. Pleroma.Web.Plugs.OAuthScopesPlug,
  10. %{scopes: ["admin:write"]}
  11. when action in [
  12. :import_from_filesystem,
  13. :remote,
  14. :download,
  15. :create,
  16. :update,
  17. :delete
  18. ]
  19. )
  20. plug(:skip_auth when action in [:index, :archive, :show])
  21. defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaEmojiPackOperation
  22. def remote(%{private: %{open_api_spex: %{params: params}}} = conn, _) do
  23. with {:ok, packs} <-
  24. Pack.list_remote(url: params.url, page_size: params.page_size, page: params.page) do
  25. json(conn, packs)
  26. else
  27. {:error, :not_shareable} ->
  28. conn
  29. |> put_status(:internal_server_error)
  30. |> json(%{error: "The requested instance does not support sharing emoji packs"})
  31. end
  32. end
  33. def index(%{private: %{open_api_spex: %{params: params}}} = conn, _) do
  34. emoji_path =
  35. [:instance, :static_dir]
  36. |> Pleroma.Config.get!()
  37. |> Path.join("emoji")
  38. with {:ok, packs, count} <- Pack.list_local(page: params.page, page_size: params.page_size) do
  39. json(conn, %{packs: packs, count: count})
  40. else
  41. {:error, :create_dir, e} ->
  42. conn
  43. |> put_status(:internal_server_error)
  44. |> json(%{error: "Failed to create the emoji pack directory at #{emoji_path}: #{e}"})
  45. {:error, :ls, e} ->
  46. conn
  47. |> put_status(:internal_server_error)
  48. |> json(%{
  49. error: "Failed to get the contents of the emoji pack directory at #{emoji_path}: #{e}"
  50. })
  51. end
  52. end
  53. def show(
  54. %{private: %{open_api_spex: %{params: %{name: name, page: page, page_size: page_size}}}} =
  55. conn,
  56. _
  57. ) do
  58. name = String.trim(name)
  59. with {:ok, pack} <- Pack.show(name: name, page: page, page_size: page_size) do
  60. json(conn, pack)
  61. else
  62. {:error, :enoent} ->
  63. conn
  64. |> put_status(:not_found)
  65. |> json(%{error: "Pack #{name} does not exist"})
  66. {:error, :empty_values} ->
  67. conn
  68. |> put_status(:bad_request)
  69. |> json(%{error: "pack name cannot be empty"})
  70. {:error, error} ->
  71. error_message =
  72. add_posix_error(
  73. "Failed to get the contents of the `#{name}` pack.",
  74. error
  75. )
  76. conn
  77. |> put_status(:internal_server_error)
  78. |> json(%{error: error_message})
  79. end
  80. end
  81. def archive(%{private: %{open_api_spex: %{params: %{name: name}}}} = conn, _) do
  82. with {:ok, archive} <- Pack.get_archive(name) do
  83. send_download(conn, {:binary, archive}, filename: "#{name}.zip")
  84. else
  85. {:error, :cant_download} ->
  86. conn
  87. |> put_status(:forbidden)
  88. |> json(%{
  89. error:
  90. "Pack #{name} cannot be downloaded from this instance, either pack sharing was disabled for this pack or some files are missing"
  91. })
  92. {:error, :enoent} ->
  93. conn
  94. |> put_status(:not_found)
  95. |> json(%{error: "Pack #{name} does not exist"})
  96. end
  97. end
  98. def download(
  99. %{private: %{open_api_spex: %{body_params: %{url: url, name: name} = params}}} = conn,
  100. _
  101. ) do
  102. with {:ok, _pack} <- Pack.download(name, url, params[:as]) do
  103. json(conn, "ok")
  104. else
  105. {:error, :not_shareable} ->
  106. conn
  107. |> put_status(:internal_server_error)
  108. |> json(%{error: "The requested instance does not support sharing emoji packs"})
  109. {:error, :invalid_checksum} ->
  110. conn
  111. |> put_status(:internal_server_error)
  112. |> json(%{error: "SHA256 for the pack doesn't match the one sent by the server"})
  113. {:error, error} ->
  114. conn
  115. |> put_status(:internal_server_error)
  116. |> json(%{error: error})
  117. end
  118. end
  119. def create(%{private: %{open_api_spex: %{params: %{name: name}}}} = conn, _) do
  120. name = String.trim(name)
  121. with {:ok, _pack} <- Pack.create(name) do
  122. json(conn, "ok")
  123. else
  124. {:error, :eexist} ->
  125. conn
  126. |> put_status(:conflict)
  127. |> json(%{error: "A pack named \"#{name}\" already exists"})
  128. {:error, :empty_values} ->
  129. conn
  130. |> put_status(:bad_request)
  131. |> json(%{error: "pack name cannot be empty"})
  132. {:error, error} ->
  133. error_message =
  134. add_posix_error(
  135. "Unexpected error occurred while creating pack.",
  136. error
  137. )
  138. conn
  139. |> put_status(:internal_server_error)
  140. |> json(%{error: error_message})
  141. end
  142. end
  143. def delete(%{private: %{open_api_spex: %{params: %{name: name}}}} = conn, _) do
  144. name = String.trim(name)
  145. with {:ok, deleted} when deleted != [] <- Pack.delete(name) do
  146. json(conn, "ok")
  147. else
  148. {:ok, []} ->
  149. conn
  150. |> put_status(:not_found)
  151. |> json(%{error: "Pack #{name} does not exist"})
  152. {:error, :empty_values} ->
  153. conn
  154. |> put_status(:bad_request)
  155. |> json(%{error: "pack name cannot be empty"})
  156. {:error, error, _} ->
  157. error_message = add_posix_error("Couldn't delete the `#{name}` pack", error)
  158. conn
  159. |> put_status(:internal_server_error)
  160. |> json(%{error: error_message})
  161. end
  162. end
  163. def update(
  164. %{private: %{open_api_spex: %{body_params: %{metadata: metadata}, params: %{name: name}}}} =
  165. conn,
  166. _
  167. ) do
  168. with {:ok, pack} <- Pack.update_metadata(name, metadata) do
  169. json(conn, pack.pack)
  170. else
  171. {:error, :incomplete} ->
  172. conn
  173. |> put_status(:bad_request)
  174. |> json(%{error: "The fallback archive does not have all files specified in pack.json"})
  175. {:error, error} ->
  176. error_message =
  177. add_posix_error(
  178. "Unexpected error occurred while updating pack metadata.",
  179. error
  180. )
  181. conn
  182. |> put_status(:internal_server_error)
  183. |> json(%{error: error_message})
  184. end
  185. end
  186. def import_from_filesystem(conn, _params) do
  187. with {:ok, names} <- Pack.import_from_filesystem() do
  188. json(conn, names)
  189. else
  190. {:error, :no_read_write} ->
  191. conn
  192. |> put_status(:internal_server_error)
  193. |> json(%{error: "Error: emoji pack directory must be writable"})
  194. {:error, _} ->
  195. conn
  196. |> put_status(:internal_server_error)
  197. |> json(%{error: "Error accessing emoji pack directory"})
  198. end
  199. end
  200. defp add_posix_error(msg, error) do
  201. [msg, Pleroma.Utils.posix_error_message(error)]
  202. |> Enum.join(" ")
  203. |> String.trim()
  204. end
  205. end