aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgor Kislitsyn <egor@kislitsyn.com>2019-12-05 20:18:25 +0700
committerEgor Kislitsyn <egor@kislitsyn.com>2019-12-05 20:18:25 +0700
commit48ae3c4347f68e20db7e3e67da32be2e70599fb3 (patch)
tree1179b632f65d1488825e0321d205ce43f90ad226
parent7722e5a67a46304f3ae0e37f674a44ca9268be5e (diff)
downloadpleroma-48ae3c4347f68e20db7e3e67da32be2e70599fb3.tar.gz
Add support for custom modules
-rw-r--r--CHANGELOG.md1
-rw-r--r--config/config.exs1
-rw-r--r--docs/configuration/cheatsheet.md2
-rw-r--r--lib/pleroma/application.ex24
4 files changed, 28 insertions, 0 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a06ea211e..6564cf40a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -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>
diff --git a/config/config.exs b/config/config.exs
index b60ffef7d..e1358eda0 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -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",
diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md
index dc2f55229..f73d368c1 100644
--- a/docs/configuration/cheatsheet.md
+++ b/docs/configuration/cheatsheet.md
@@ -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
diff --git a/lib/pleroma/application.ex b/lib/pleroma/application.ex
index 9dbd1e26b..5b6e233a6 100644
--- a/lib/pleroma/application.ex
+++ b/lib/pleroma/application.ex
@@ -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