Add support for custom modules
authorEgor Kislitsyn <egor@kislitsyn.com>
Thu, 5 Dec 2019 13:18:25 +0000 (20:18 +0700)
committerEgor Kislitsyn <egor@kislitsyn.com>
Thu, 5 Dec 2019 13:18:25 +0000 (20:18 +0700)
CHANGELOG.md
config/config.exs
docs/configuration/cheatsheet.md
lib/pleroma/application.ex

index a06ea211eb9dcf6b401c799c5357d3b8d04a1093..6564cf40ac799dd8716b236cb239118cd1ea0a94 100644 (file)
@@ -45,6 +45,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Mix task to list all users (`mix pleroma.user list`)
 - Support for `X-Forwarded-For` and similar HTTP headers which used by reverse proxies to pass a real user IP address to the backend. Must not be enabled unless your instance is behind at least one reverse proxy (such as Nginx, Apache HTTPD or Varnish Cache).
 - MRF: New module which handles incoming posts based on their age. By default, all incoming posts that are older than 2 days will be unlisted and not shown to their followers.
+- Support for custom Elixir modules (such as MRF policies)
 <details>
   <summary>API Changes</summary>
 
index b60ffef7dc9c7ad8a3690caf0fd7896d48b75613..e1358eda0184cf76db896d3967fbbe7921de350a 100644 (file)
@@ -249,6 +249,7 @@ config :pleroma, :instance,
   quarantined_instances: [],
   managed_config: true,
   static_dir: "instance/static/",
+  custom_modules_dir: "instance/modules/",
   allowed_post_formats: [
     "text/plain",
     "text/html",
index dc2f5522990d7a27dcab18d4f8d9ea1eaf6e52bf..f73d368c1bc3a869b4b072bae771f0676de16483 100644 (file)
@@ -68,6 +68,8 @@ You shouldn't edit the base config directly to avoid breakages and merge conflic
 * `account_field_name_length`: An account field name maximum length (default: `512`).
 * `account_field_value_length`: An account field value maximum length (default: `2048`).
 * `external_user_synchronization`: Enabling following/followers counters synchronization for external users.
+* `custom_modules_dir`: A path to custom Elixir modules (such as MRF policies).
+
 
 !!! danger
     This is a Work In Progress, not usable just yet
index 9dbd1e26b699130c8b507d794de8191bcef530f7..5b6e233a683be53d139c61ae08611d12ea571603 100644 (file)
@@ -32,6 +32,7 @@ defmodule Pleroma.Application do
   def start(_type, _args) do
     Pleroma.Config.DeprecationWarnings.warn()
     setup_instrumenters()
+    load_custom_modules()
 
     # Define workers and child supervisors to be supervised
     children =
@@ -67,6 +68,29 @@ defmodule Pleroma.Application do
     Supervisor.start_link(children, opts)
   end
 
+  def load_custom_modules() do
+    dir = Pleroma.Config.get([:instance, :custom_modules_dir])
+
+    if dir && File.exists?(dir) do
+      dir
+      |> File.ls!()
+      |> Enum.map(&Path.join(dir, &1))
+      |> Kernel.ParallelCompiler.compile()
+      |> case do
+        {:error, _errors, _warnings} ->
+          raise "Invalid custom modules"
+
+        {:ok, modules, _warnings} ->
+          Enum.each(modules, fn mod ->
+            name = mod |> Atom.to_string() |> String.trim_leading("Elixir.")
+            IO.puts("Custom module loaded: #{name}")
+          end)
+
+          :ok
+      end
+    end
+  end
+
   defp setup_instrumenters do
     require Prometheus.Registry