diff --git a/CHANGELOG.md b/CHANGELOG.md index 22644b03c..d6dd4dd4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +### Added +- extended runtime module support, see config cheatsheet + ### Fixed - Updated mastoFE path, for the newer version @@ -18,7 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - `/api/v1/notifications/dismiss` - `/api/v1/search` - `/api/v1/statuses/{id}/card` -- LDAP authenticator +- LDAP authenticator (use the akkoma-contrib-authenticator-ldap runtime module) - Chats, they were half-baked. Just use PMs. - Prometheus, it causes massive slowdown diff --git a/docs/docs/configuration/cheatsheet.md b/docs/docs/configuration/cheatsheet.md index fdbfb1a3e..7b0934fcf 100644 --- a/docs/docs/configuration/cheatsheet.md +++ b/docs/docs/configuration/cheatsheet.md @@ -1012,7 +1012,22 @@ config :pleroma, Pleroma.Formatter, ## Custom Runtime Modules (`:modules`) -* `runtime_dir`: A path to custom Elixir modules (such as MRF policies). +* `runtime_dir`: A path to custom Elixir modules, such as MRF policies or + custom authenticators. These modules will be loaded on boot, and can be + contained in subdirectories. It is advised to use version-controlled + subdirectories to make management of them a bit easier. Note that only + files with the extension `.ex` will be loaded. + +```elixir +config :pleroma, :modules, runtime_dir: "instance/modules" +``` + +### Adding a module + +```bash +cd instance/modules/ +git clone +``` ## :configurable_from_database diff --git a/lib/pleroma/utils.ex b/lib/pleroma/utils.ex index a446d3ae6..bd9939c9f 100644 --- a/lib/pleroma/utils.ex +++ b/lib/pleroma/utils.ex @@ -14,10 +14,23 @@ defmodule Pleroma.Utils do @repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000) def compile_dir(dir) when is_binary(dir) do + dir + |> elixir_files() + |> Kernel.ParallelCompiler.compile() + end + + defp elixir_files(dir) when is_binary(dir) do dir |> File.ls!() |> Enum.map(&Path.join(dir, &1)) - |> Kernel.ParallelCompiler.compile() + |> Enum.flat_map(fn path -> + if File.dir?(path) do + elixir_files(path) + else + [path] + end + end) + |> Enum.filter(fn path -> String.ends_with?(path, ".ex") end) end @doc """ diff --git a/test/fixtures/runtime_modules/first.ex b/test/fixtures/runtime_modules/first.ex new file mode 100644 index 000000000..2b663a1b0 --- /dev/null +++ b/test/fixtures/runtime_modules/first.ex @@ -0,0 +1,2 @@ +defmodule DynamicModule.First do +end diff --git a/test/fixtures/runtime_modules/nope.exs b/test/fixtures/runtime_modules/nope.exs new file mode 100644 index 000000000..8fe676af6 --- /dev/null +++ b/test/fixtures/runtime_modules/nope.exs @@ -0,0 +1 @@ +def thisisnotloaded diff --git a/test/fixtures/runtime_modules/subdir/second.ex b/test/fixtures/runtime_modules/subdir/second.ex new file mode 100644 index 000000000..22dc046c6 --- /dev/null +++ b/test/fixtures/runtime_modules/subdir/second.ex @@ -0,0 +1,2 @@ +defmodule DynamicModule.Second do +end diff --git a/test/pleroma/utils_test.exs b/test/pleroma/utils_test.exs index c593a9490..e21573679 100644 --- a/test/pleroma/utils_test.exs +++ b/test/pleroma/utils_test.exs @@ -12,4 +12,11 @@ test "returns unique temporary directory" do File.rm_rf(path) end end + + describe "compile_dir/1" do + test "recursively compiles directories" do + {:ok, [DynamicModule.First, DynamicModule.Second], []} = + Pleroma.Utils.compile_dir("test/fixtures/runtime_modules") + end + end end