logo

pleroma

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

compiler.ex (1859B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2023 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ApiSpec.Scopes.Compiler do
  5. defmacro __before_compile__(_env) do
  6. strings = __MODULE__.extract_all_scopes()
  7. quote do
  8. def placeholder do
  9. unquote do
  10. Enum.map(
  11. strings,
  12. fn string ->
  13. quote do
  14. Pleroma.Web.Gettext.dgettext_noop(
  15. "oauth_scopes",
  16. unquote(string)
  17. )
  18. end
  19. end
  20. )
  21. end
  22. end
  23. end
  24. end
  25. def extract_all_scopes do
  26. extract_all_scopes_from(Pleroma.Web.ApiSpec.spec())
  27. end
  28. def extract_all_scopes_from(specs) do
  29. specs.paths
  30. |> Enum.reduce([], fn
  31. {_path, %{} = path_item}, acc ->
  32. extract_routes(path_item)
  33. |> Enum.flat_map(fn operation -> process_operation(operation) end)
  34. |> Kernel.++(acc)
  35. {_, _}, acc ->
  36. acc
  37. end)
  38. |> Enum.uniq()
  39. end
  40. defp extract_routes(path_item) do
  41. path_item
  42. |> Map.from_struct()
  43. |> Enum.map(fn {_method, path_item} -> path_item end)
  44. |> Enum.filter(fn
  45. %OpenApiSpex.Operation{} = _operation -> true
  46. _ -> false
  47. end)
  48. end
  49. defp process_operation(operation) do
  50. operation.security
  51. |> Kernel.||([])
  52. |> Enum.flat_map(fn
  53. %{"oAuth" => scopes} -> process_scopes(scopes)
  54. _ -> []
  55. end)
  56. end
  57. defp process_scopes(scopes) do
  58. scopes
  59. |> Enum.flat_map(fn scope ->
  60. process_scope(scope)
  61. end)
  62. end
  63. def process_scope(scope) do
  64. hierarchy = String.split(scope, ":")
  65. {_, list} =
  66. Enum.reduce(hierarchy, {"", []}, fn comp, {cur, list} ->
  67. {cur <> comp <> ":", [cur <> comp | list]}
  68. end)
  69. list
  70. end
  71. end