Merge branch 'develop' into quote-posts
This commit is contained in:
commit
04a2c38297
|
@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- extended runtime module support, see config cheatsheet
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- Updated mastoFE path, for the newer version
|
- 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/notifications/dismiss`
|
||||||
- `/api/v1/search`
|
- `/api/v1/search`
|
||||||
- `/api/v1/statuses/{id}/card`
|
- `/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.
|
- Chats, they were half-baked. Just use PMs.
|
||||||
- Prometheus, it causes massive slowdown
|
- Prometheus, it causes massive slowdown
|
||||||
|
|
||||||
|
|
|
@ -1012,7 +1012,22 @@ config :pleroma, Pleroma.Formatter,
|
||||||
|
|
||||||
## Custom Runtime Modules (`:modules`)
|
## 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 <MY MODULE>
|
||||||
|
```
|
||||||
|
|
||||||
## :configurable_from_database
|
## :configurable_from_database
|
||||||
|
|
||||||
|
|
|
@ -487,6 +487,38 @@ defmodule Mix.Tasks.Pleroma.User do
|
||||||
|> Stream.run()
|
|> Stream.run()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run(["fix_follow_state", local_user, remote_user]) do
|
||||||
|
start_pleroma()
|
||||||
|
|
||||||
|
with {:local, %User{} = local} <- {:local, User.get_by_nickname(local_user)},
|
||||||
|
{:remote, %User{} = remote} <- {:remote, User.get_by_nickname(remote_user)},
|
||||||
|
{:follow_data, %{data: %{"state" => request_state}}} <-
|
||||||
|
{:follow_data, Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(local, remote)} do
|
||||||
|
calculated_state = User.following?(local, remote)
|
||||||
|
|
||||||
|
shell_info(
|
||||||
|
"Request state is #{request_state}, vs calculated state of following=#{calculated_state}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if calculated_state == false && request_state == "accept" do
|
||||||
|
shell_info("Discrepancy found, fixing")
|
||||||
|
Pleroma.Web.CommonAPI.reject_follow_request(local, remote)
|
||||||
|
shell_info("Relationship fixed")
|
||||||
|
else
|
||||||
|
shell_info("No discrepancy found")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{:local, _} ->
|
||||||
|
shell_error("No local user #{local_user}")
|
||||||
|
|
||||||
|
{:remote, _} ->
|
||||||
|
shell_error("No remote user #{remote_user}")
|
||||||
|
|
||||||
|
{:follow_data, _} ->
|
||||||
|
shell_error("No follow data for #{local_user} and #{remote_user}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp set_moderator(user, value) do
|
defp set_moderator(user, value) do
|
||||||
{:ok, user} =
|
{:ok, user} =
|
||||||
user
|
user
|
||||||
|
|
|
@ -730,12 +730,12 @@ defmodule Pleroma.User do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp put_ap_id(changeset) do
|
def put_ap_id(changeset) do
|
||||||
ap_id = ap_id(%User{nickname: get_field(changeset, :nickname)})
|
ap_id = ap_id(%User{nickname: get_field(changeset, :nickname)})
|
||||||
put_change(changeset, :ap_id, ap_id)
|
put_change(changeset, :ap_id, ap_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp put_following_and_follower_and_featured_address(changeset) do
|
def put_following_and_follower_and_featured_address(changeset) do
|
||||||
user = %User{nickname: get_field(changeset, :nickname)}
|
user = %User{nickname: get_field(changeset, :nickname)}
|
||||||
followers = ap_followers(user)
|
followers = ap_followers(user)
|
||||||
following = ap_following(user)
|
following = ap_following(user)
|
||||||
|
@ -1448,13 +1448,19 @@ defmodule Pleroma.User do
|
||||||
blocker
|
blocker
|
||||||
end
|
end
|
||||||
|
|
||||||
# clear any requested follows as well
|
# clear any requested follows from both sides as well
|
||||||
blocked =
|
blocked =
|
||||||
case CommonAPI.reject_follow_request(blocked, blocker) do
|
case CommonAPI.reject_follow_request(blocked, blocker) do
|
||||||
{:ok, %User{} = updated_blocked} -> updated_blocked
|
{:ok, %User{} = updated_blocked} -> updated_blocked
|
||||||
nil -> blocked
|
nil -> blocked
|
||||||
end
|
end
|
||||||
|
|
||||||
|
blocker =
|
||||||
|
case CommonAPI.reject_follow_request(blocker, blocked) do
|
||||||
|
{:ok, %User{} = updated_blocker} -> updated_blocker
|
||||||
|
nil -> blocker
|
||||||
|
end
|
||||||
|
|
||||||
unsubscribe(blocked, blocker)
|
unsubscribe(blocked, blocker)
|
||||||
|
|
||||||
unfollowing_blocked = Config.get([:activitypub, :unfollow_blocked], true)
|
unfollowing_blocked = Config.get([:activitypub, :unfollow_blocked], true)
|
||||||
|
@ -2035,7 +2041,7 @@ defmodule Pleroma.User do
|
||||||
|> Enum.map(&String.downcase/1)
|
|> Enum.map(&String.downcase/1)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp local_nickname_regex do
|
def local_nickname_regex do
|
||||||
if Config.get([:instance, :extended_nickname_format]) do
|
if Config.get([:instance, :extended_nickname_format]) do
|
||||||
@extended_local_nickname_regex
|
@extended_local_nickname_regex
|
||||||
else
|
else
|
||||||
|
|
|
@ -14,10 +14,23 @@ defmodule Pleroma.Utils do
|
||||||
@repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000)
|
@repo_timeout Pleroma.Config.get([Pleroma.Repo, :timeout], 15_000)
|
||||||
|
|
||||||
def compile_dir(dir) when is_binary(dir) do
|
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
|
dir
|
||||||
|> File.ls!()
|
|> File.ls!()
|
||||||
|> Enum.map(&Path.join(dir, &1))
|
|> 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
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
|
4
mix.exs
4
mix.exs
|
@ -4,7 +4,7 @@ defmodule Pleroma.Mixfile do
|
||||||
def project do
|
def project do
|
||||||
[
|
[
|
||||||
app: :pleroma,
|
app: :pleroma,
|
||||||
version: version("3.0.0"),
|
version: version("3.0.1"),
|
||||||
elixir: "~> 1.9",
|
elixir: "~> 1.9",
|
||||||
elixirc_paths: elixirc_paths(Mix.env()),
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
|
compilers: [:phoenix, :gettext] ++ Mix.compilers(),
|
||||||
|
@ -34,7 +34,7 @@ defmodule Pleroma.Mixfile do
|
||||||
releases: [
|
releases: [
|
||||||
pleroma: [
|
pleroma: [
|
||||||
include_executables_for: [:unix],
|
include_executables_for: [:unix],
|
||||||
applications: [ex_syslogger: :load, syslog: :load],
|
applications: [ex_syslogger: :load, syslog: :load, eldap: :transient],
|
||||||
steps: [:assemble, &put_otp_version/1, ©_files/1, ©_nginx_config/1],
|
steps: [:assemble, &put_otp_version/1, ©_files/1, ©_nginx_config/1],
|
||||||
config_providers: [{Pleroma.Config.ReleaseRuntimeProvider, []}]
|
config_providers: [{Pleroma.Config.ReleaseRuntimeProvider, []}]
|
||||||
]
|
]
|
||||||
|
|
2
test/fixtures/runtime_modules/first.ex
vendored
Normal file
2
test/fixtures/runtime_modules/first.ex
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
defmodule DynamicModule.First do
|
||||||
|
end
|
1
test/fixtures/runtime_modules/nope.exs
vendored
Normal file
1
test/fixtures/runtime_modules/nope.exs
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
def thisisnotloaded
|
2
test/fixtures/runtime_modules/subdir/second.ex
vendored
Normal file
2
test/fixtures/runtime_modules/subdir/second.ex
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
defmodule DynamicModule.Second do
|
||||||
|
end
|
|
@ -12,4 +12,11 @@ defmodule Pleroma.UtilsTest do
|
||||||
File.rm_rf(path)
|
File.rm_rf(path)
|
||||||
end
|
end
|
||||||
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
|
end
|
||||||
|
|
|
@ -61,9 +61,11 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
describe "blocking" do
|
describe "blocking" do
|
||||||
setup do
|
setup do
|
||||||
blocker = insert(:user)
|
blocker = insert(:user)
|
||||||
blocked = insert(:user)
|
blocked = insert(:user, local: false)
|
||||||
User.follow(blocker, blocked)
|
CommonAPI.follow(blocker, blocked)
|
||||||
User.follow(blocked, blocker)
|
CommonAPI.follow(blocked, blocker)
|
||||||
|
CommonAPI.accept_follow_request(blocker, blocked)
|
||||||
|
CommonAPI.accept_follow_request(blocked, blocked)
|
||||||
%{blocker: blocker, blocked: blocked}
|
%{blocker: blocker, blocked: blocked}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -72,6 +74,9 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
|
|
||||||
with_mock Pleroma.Web.Federator,
|
with_mock Pleroma.Web.Federator,
|
||||||
publish: fn _ -> nil end do
|
publish: fn _ -> nil end do
|
||||||
|
assert User.get_follow_state(blocker, blocked) == :follow_accept
|
||||||
|
refute is_nil(Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(blocker, blocked))
|
||||||
|
|
||||||
assert {:ok, block} = CommonAPI.block(blocker, blocked)
|
assert {:ok, block} = CommonAPI.block(blocker, blocked)
|
||||||
|
|
||||||
assert block.local
|
assert block.local
|
||||||
|
@ -79,6 +84,11 @@ defmodule Pleroma.Web.CommonAPITest do
|
||||||
refute User.following?(blocker, blocked)
|
refute User.following?(blocker, blocked)
|
||||||
refute User.following?(blocked, blocker)
|
refute User.following?(blocked, blocker)
|
||||||
|
|
||||||
|
refute User.get_follow_state(blocker, blocked)
|
||||||
|
|
||||||
|
assert %{data: %{"state" => "reject"}} =
|
||||||
|
Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(blocker, blocked)
|
||||||
|
|
||||||
assert called(Pleroma.Web.Federator.publish(block))
|
assert called(Pleroma.Web.Federator.publish(block))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue