Merge branch 'develop' into issue/1936

This commit is contained in:
Maksim Pechnikov 2020-08-13 09:00:25 +03:00
commit 56470647de
9 changed files with 203 additions and 61 deletions

View file

@ -194,7 +194,7 @@
type: [:string, {:list, :string}, {:list, :tuple}], type: [:string, {:list, :string}, {:list, :tuple}],
description: description:
"List of actions for the mogrify command. It's possible to add self-written settings as string. " <> "List of actions for the mogrify command. It's possible to add self-written settings as string. " <>
"For example `[\"auto-orient\", \"strip\", {\"resize\", \"3840x1080>\"}]` string will be parsed into list of the settings.", "For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings.",
suggestions: [ suggestions: [
"strip", "strip",
"auto-orient", "auto-orient",
@ -951,7 +951,7 @@
}, },
%{ %{
key: :instance_thumbnail, key: :instance_thumbnail,
type: :string, type: {:string, :image},
description: description:
"The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance.", "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance.",
suggestions: ["/instance/thumbnail.jpeg"] suggestions: ["/instance/thumbnail.jpeg"]
@ -964,25 +964,25 @@
] ]
}, },
%{ %{
group: :welcome, group: :pleroma,
key: :welcome,
type: :group, type: :group,
description: "Welcome messages settings", description: "Welcome messages settings",
children: [ children: [
%{ %{
group: :direct_message, key: :direct_message,
type: :group, type: :keyword,
descpiption: "Direct message settings", descpiption: "Direct message settings",
children: [ children: [
%{ %{
key: :enabled, key: :enabled,
type: :boolean, type: :boolean,
description: "Enables sends direct message for new user after registration" description: "Enables sending a direct message to newly registered users"
}, },
%{ %{
key: :message, key: :message,
type: :string, type: :string,
description: description: "A message that will be sent to newly registered users",
"A message that will be sent to a newly registered users as a direct message",
suggestions: [ suggestions: [
"Hi, @username! Welcome on board!" "Hi, @username! Welcome on board!"
] ]
@ -990,7 +990,7 @@
%{ %{
key: :sender_nickname, key: :sender_nickname,
type: :string, type: :string,
description: "The nickname of the local user that sends the welcome message", description: "The nickname of the local user that sends a welcome message",
suggestions: [ suggestions: [
"lain" "lain"
] ]
@ -998,20 +998,20 @@
] ]
}, },
%{ %{
group: :chat_message, key: :chat_message,
type: :group, type: :keyword,
descpiption: "Chat message settings", descpiption: "Chat message settings",
children: [ children: [
%{ %{
key: :enabled, key: :enabled,
type: :boolean, type: :boolean,
description: "Enables sends chat message for new user after registration" description: "Enables sending a chat message to newly registered users"
}, },
%{ %{
key: :message, key: :message,
type: :string, type: :string,
description: description:
"A message that will be sent to a newly registered users as a chat message", "A message that will be sent to newly registered users as a chat message",
suggestions: [ suggestions: [
"Hello, welcome on board!" "Hello, welcome on board!"
] ]
@ -1019,7 +1019,7 @@
%{ %{
key: :sender_nickname, key: :sender_nickname,
type: :string, type: :string,
description: "The nickname of the local user that sends the welcome message", description: "The nickname of the local user that sends a welcome chat message",
suggestions: [ suggestions: [
"lain" "lain"
] ]
@ -1027,20 +1027,20 @@
] ]
}, },
%{ %{
group: :email, key: :email,
type: :group, type: :keyword,
descpiption: "Email message settings", descpiption: "Email message settings",
children: [ children: [
%{ %{
key: :enabled, key: :enabled,
type: :boolean, type: :boolean,
description: "Enables sends direct message for new user after registration" description: "Enables sending an email to newly registered users"
}, },
%{ %{
key: :sender, key: :sender,
type: [:string, :tuple], type: [:string, :tuple],
description: description:
"The email address or tuple with `{nickname, email}` that will use as sender to the welcome email.", "Email address and/or nickname that will be used to send the welcome email.",
suggestions: [ suggestions: [
{"Pleroma App", "welcome@pleroma.app"} {"Pleroma App", "welcome@pleroma.app"}
] ]
@ -1049,21 +1049,21 @@
key: :subject, key: :subject,
type: :string, type: :string,
description: description:
"The subject of welcome email. Can be use EEX template with `user` and `instance_name` variables.", "Subject of the welcome email. EEX template with user and instance_name variables can be used.",
suggestions: ["Welcome to <%= instance_name%>"] suggestions: ["Welcome to <%= instance_name%>"]
}, },
%{ %{
key: :html, key: :html,
type: :string, type: :string,
description: description:
"The html content of welcome email. Can be use EEX template with `user` and `instance_name` variables.", "HTML content of the welcome email. EEX template with user and instance_name variables can be used.",
suggestions: ["<h1>Hello <%= user.name%>. Welcome to <%= instance_name%></h1>"] suggestions: ["<h1>Hello <%= user.name%>. Welcome to <%= instance_name%></h1>"]
}, },
%{ %{
key: :text, key: :text,
type: :string, type: :string,
description: description:
"The text content of welcome email. Can be use EEX template with `user` and `instance_name` variables.", "Text content of the welcome email. EEX template with user and instance_name variables can be used.",
suggestions: ["Hello <%= user.name%>. \n Welcome to <%= instance_name%>\n"] suggestions: ["Hello <%= user.name%>. \n Welcome to <%= instance_name%>\n"]
} }
] ]
@ -1236,7 +1236,7 @@
}, },
%{ %{
key: :background, key: :background,
type: :string, type: {:string, :image},
description: description:
"URL of the background, unless viewing a user profile with a background that is set", "URL of the background, unless viewing a user profile with a background that is set",
suggestions: ["/images/city.jpg"] suggestions: ["/images/city.jpg"]
@ -1293,7 +1293,7 @@
}, },
%{ %{
key: :logo, key: :logo,
type: :string, type: {:string, :image},
description: "URL of the logo, defaults to Pleroma's logo", description: "URL of the logo, defaults to Pleroma's logo",
suggestions: ["/static/logo.png"] suggestions: ["/static/logo.png"]
}, },
@ -1325,7 +1325,7 @@
%{ %{
key: :nsfwCensorImage, key: :nsfwCensorImage,
label: "NSFW Censor Image", label: "NSFW Censor Image",
type: :string, type: {:string, :image},
description: description:
"URL of the image to use for hiding NSFW media attachments in the timeline", "URL of the image to use for hiding NSFW media attachments in the timeline",
suggestions: ["/static/img/nsfw.74818f9.png"] suggestions: ["/static/img/nsfw.74818f9.png"]
@ -1451,7 +1451,7 @@
}, },
%{ %{
key: :default_user_avatar, key: :default_user_avatar,
type: :string, type: {:string, :image},
description: "URL of the default user avatar", description: "URL of the default user avatar",
suggestions: ["/images/avi.png"] suggestions: ["/images/avi.png"]
} }
@ -2642,7 +2642,7 @@
children: [ children: [
%{ %{
key: :logo, key: :logo,
type: :string, type: {:string, :image},
description: "A path to a custom logo. Set it to `nil` to use the default Pleroma logo.", description: "A path to a custom logo. Set it to `nil` to use the default Pleroma logo.",
suggestions: ["some/path/logo.png"] suggestions: ["some/path/logo.png"]
}, },
@ -3299,13 +3299,13 @@
group: :pleroma, group: :pleroma,
key: :connections_pool, key: :connections_pool,
type: :group, type: :group,
description: "Advanced settings for `gun` connections pool", description: "Advanced settings for `Gun` connections pool",
children: [ children: [
%{ %{
key: :connection_acquisition_wait, key: :connection_acquisition_wait,
type: :integer, type: :integer,
description: description:
"Timeout to acquire a connection from pool.The total max time is this value multiplied by the number of retries. Default: 250ms.", "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms.",
suggestions: [250] suggestions: [250]
}, },
%{ %{
@ -3340,7 +3340,7 @@
group: :pleroma, group: :pleroma,
key: :pools, key: :pools,
type: :group, type: :group,
description: "Advanced settings for `gun` workers pools", description: "Advanced settings for `Gun` workers pools",
children: children:
Enum.map([:federation, :media, :upload, :default], fn pool_name -> Enum.map([:federation, :media, :upload, :default], fn pool_name ->
%{ %{
@ -3369,7 +3369,7 @@
group: :pleroma, group: :pleroma,
key: :hackney_pools, key: :hackney_pools,
type: :group, type: :group,
description: "Advanced settings for `hackney` connections pools", description: "Advanced settings for `Hackney` connections pools",
children: [ children: [
%{ %{
key: :federation, key: :federation,
@ -3433,6 +3433,7 @@
%{ %{
group: :pleroma, group: :pleroma,
key: :restrict_unauthenticated, key: :restrict_unauthenticated,
label: "Restrict Unauthenticated",
type: :group, type: :group,
description: description:
"Disallow viewing timelines, user profiles and statuses for unauthenticated users.", "Disallow viewing timelines, user profiles and statuses for unauthenticated users.",
@ -3555,13 +3556,17 @@
children: [ children: [
%{ %{
key: "name", key: "name",
label: "Name",
type: :string, type: :string,
description: "Name of the installed primary frontend" description:
"Name of the installed primary frontend. Valid config must include both `Name` and `Reference` values."
}, },
%{ %{
key: "ref", key: "ref",
label: "Reference",
type: :string, type: :string,
description: "reference of the installed primary frontend to be used" description:
"Reference of the installed primary frontend to be used. Valid config must include both `Name` and `Reference` values."
} }
] ]
} }

View file

@ -0,0 +1,17 @@
# Managing robots.txt
{! backend/administration/CLI_tasks/general_cli_task_info.include !}
## Generate a new robots.txt file and add it to the static directory
The `robots.txt` that ships by default is permissive. It allows well-behaved search engines to index all of your instance's URIs.
If you want to generate a restrictive `robots.txt`, you can run the following mix task. The generated `robots.txt` will be written in your instance [static directory](../../../configuration/static_dir/).
```elixir tab="OTP"
./bin/pleroma_ctl robots_txt disallow_all
```
```elixir tab="From Source"
mix pleroma.robots_txt disallow_all
```

View file

@ -1,45 +1,57 @@
# Static Directory # Static Directory
Static frontend files are shipped in `priv/static/` and tracked by version control in this repository. If you want to overwrite or update these without the possibility of merge conflicts, you can write your custom versions to `instance/static/`. Static frontend files are shipped with pleroma. If you want to overwrite or update these without problems during upgrades, you can write your custom versions to the static directory.
You can find the location of the static directory in the [configuration](../cheatsheet/#instance).
```elixir tab="OTP"
config :pleroma, :instance,
static_dir: "/var/lib/pleroma/static/",
``` ```
```elixir tab="From Source"
config :pleroma, :instance, config :pleroma, :instance,
static_dir: "instance/static/", static_dir: "instance/static/",
``` ```
For example, edit `instance/static/instance/panel.html` .
Alternatively, you can overwrite this value in your configuration to use a different static instance directory. Alternatively, you can overwrite this value in your configuration to use a different static instance directory.
This document is written assuming `instance/static/`. This document is written using `$static_dir` as the value of the `config :pleroma, :instance, static_dir` setting.
Or, if you want to manage your custom file in git repository, basically remove the `instance/` entry from `.gitignore`. If you use a From Source installation and want to manage your custom files in the git repository, you can remove the `instance/` entry from `.gitignore`.
## robots.txt ## robots.txt
By default, the `robots.txt` that ships in `priv/static/` is permissive. It allows well-behaved search engines to index all of your instance's URIs. There's a mix tasks to [generate a new robot.txt](../../administration/CLI_tasks/robots_txt/).
If you want to generate a restrictive `robots.txt`, you can run the following mix task. The generated `robots.txt` will be written in your instance static directory. For more complex things, you can write your own robots.txt to `$static_dir/robots.txt`.
E.g. if you want to block all crawlers except for [fediverse.network](https://fediverse.network/about) you can use
``` ```
mix pleroma.robots_txt disallow_all User-Agent: *
Disallow: /
User-Agent: crawler-us-il-1.fediverse.network
Allow: /
User-Agent: makhnovtchina.random.sh
Allow: /
``` ```
## Thumbnail ## Thumbnail
Put on `instance/static/instance/thumbnail.jpeg` with your selfie or other neat picture. It will appear in [Pleroma Instances](http://distsn.org/pleroma-instances.html). Add `$static_dir/instance/thumbnail.jpeg` with your selfie or other neat picture. It will be available on `http://your-domain.tld/instance/thumbnail.jpeg` and can be used by external applications.
## Instance-specific panel ## Instance-specific panel
![instance-specific panel demo](/uploads/296b19ec806b130e0b49b16bfe29ce8a/image.png) Create and Edit your file at `$static_dir/instance/panel.html`.
Create and Edit your file on `instance/static/instance/panel.html`.
## Background ## Background
You can change the background of your Pleroma instance by uploading it to `instance/static/`, and then changing `background` in `config/prod.secret.exs` accordingly. You can change the background of your Pleroma instance by uploading it to `$static_dir/`, and then changing `background` in [your configuration](../cheatsheet/#frontend_configurations) accordingly.
If you put `instance/static/images/background.jpg` E.g. if you put `$static_dir/images/background.jpg`
``` ```
config :pleroma, :frontend_configurations, config :pleroma, :frontend_configurations,
@ -50,12 +62,14 @@ config :pleroma, :frontend_configurations,
## Logo ## Logo
![logo modification demo](/uploads/c70b14de60fa74245e7f0dcfa695ebff/image.png) !!! important
Note the extra `static` folder for the default logo.png location
If you want to give a brand to your instance, You can change the logo of your instance by uploading it to `instance/static/`. If you want to give a brand to your instance, You can change the logo of your instance by uploading it to the static directory `$static_dir/static/logo.png`.
Alternatively, you can specify the path with config. Alternatively, you can specify the path to your logo in [your configuration](../cheatsheet/#frontend_configurations).
If you put `instance/static/static/mylogo-file.png`
E.g. if you put `$static_dir/static/mylogo-file.png`
``` ```
config :pleroma, :frontend_configurations, config :pleroma, :frontend_configurations,
@ -66,4 +80,7 @@ config :pleroma, :frontend_configurations,
## Terms of Service ## Terms of Service
Terms of Service will be shown to all users on the registration page. It's the best place where to write down the rules for your instance. You can modify the rules by changing `instance/static/static/terms-of-service.html`. !!! important
Note the extra `static` folder for the terms-of-service.html
Terms of Service will be shown to all users on the registration page. It's the best place where to write down the rules for your instance. You can modify the rules by adding and changing `$static_dir/static/terms-of-service.html`.

View file

@ -15,8 +15,8 @@ def start_link(_) do
@impl true @impl true
def init(state) do def init(state) do
:telemetry.attach("oban-monitor-failure", [:oban, :failure], &handle_event/4, nil) :telemetry.attach("oban-monitor-failure", [:oban, :job, :exception], &handle_event/4, nil)
:telemetry.attach("oban-monitor-success", [:oban, :success], &handle_event/4, nil) :telemetry.attach("oban-monitor-success", [:oban, :job, :stop], &handle_event/4, nil)
{:ok, state} {:ok, state}
end end
@ -25,8 +25,11 @@ def stats do
GenServer.call(__MODULE__, :stats) GenServer.call(__MODULE__, :stats)
end end
def handle_event([:oban, status], %{duration: duration}, meta, _) do def handle_event([:oban, :job, event], %{duration: duration}, meta, _) do
GenServer.cast(__MODULE__, {:process_event, status, duration, meta}) GenServer.cast(
__MODULE__,
{:process_event, mapping_status(event), duration, meta}
)
end end
@impl true @impl true
@ -75,4 +78,7 @@ defp update_queue(queue, status, _meta, _duration) do
|> Map.update!(:processed_jobs, &(&1 + 1)) |> Map.update!(:processed_jobs, &(&1 + 1))
|> Map.update!(status, &(&1 + 1)) |> Map.update!(status, &(&1 + 1))
end end
defp mapping_status(:stop), do: :success
defp mapping_status(:exception), do: :failure
end end

View file

@ -18,6 +18,12 @@ def falsy_param?(value),
def truthy_param?(value), do: not falsy_param?(value) def truthy_param?(value), do: not falsy_param?(value)
def json_response(conn, status, _) when status in [204, :no_content] do
conn
|> put_resp_header("content-type", "application/json")
|> send_resp(status, "")
end
def json_response(conn, status, json) do def json_response(conn, status, json) do
conn conn
|> put_status(status) |> put_status(status)

View file

@ -0,0 +1,15 @@
defmodule Pleroma.Repo.Migrations.SetDefaultsToUserApprovalPending do
use Ecto.Migration
def up do
execute("UPDATE users SET approval_pending = false WHERE approval_pending IS NULL")
alter table(:users) do
modify(:approval_pending, :boolean, default: false, null: false)
end
end
def down do
:ok
end
end

View file

@ -56,6 +56,13 @@ defp request_content_type(%{conn: conn}) do
[conn: conn] [conn: conn]
end end
defp empty_json_response(conn) do
body = response(conn, 204)
response_content_type(conn, :json)
body
end
defp json_response_and_validate_schema( defp json_response_and_validate_schema(
%{ %{
private: %{ private: %{
@ -79,7 +86,7 @@ defp json_response_and_validate_schema(
end end
schema = lookup[op_id].responses[status].content[content_type].schema schema = lookup[op_id].responses[status].content[content_type].schema
json = json_response(conn, status) json = if status == 204, do: empty_json_response(conn), else: json_response(conn, status)
case OpenApiSpex.cast_value(json, schema, spec) do case OpenApiSpex.cast_value(json, schema, spec) do
{:ok, _data} -> {:ok, _data} ->

View file

@ -439,7 +439,7 @@ test "it appends specified tags to users with specified nicknames", %{
user1: user1, user1: user1,
user2: user2 user2: user2
} do } do
assert json_response(conn, :no_content) assert empty_json_response(conn)
assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"] assert User.get_cached_by_id(user1.id).tags == ["x", "foo", "bar"]
assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"] assert User.get_cached_by_id(user2.id).tags == ["y", "foo", "bar"]
@ -457,7 +457,7 @@ test "it appends specified tags to users with specified nicknames", %{
end end
test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
assert json_response(conn, :no_content) assert empty_json_response(conn)
assert User.get_cached_by_id(user3.id).tags == ["unchanged"] assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
end end
end end
@ -485,7 +485,7 @@ test "it removes specified tags from users with specified nicknames", %{
user1: user1, user1: user1,
user2: user2 user2: user2
} do } do
assert json_response(conn, :no_content) assert empty_json_response(conn)
assert User.get_cached_by_id(user1.id).tags == [] assert User.get_cached_by_id(user1.id).tags == []
assert User.get_cached_by_id(user2.id).tags == ["y"] assert User.get_cached_by_id(user2.id).tags == ["y"]
@ -503,7 +503,7 @@ test "it removes specified tags from users with specified nicknames", %{
end end
test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do test "it does not modify tags of not specified users", %{conn: conn, user3: user3} do
assert json_response(conn, :no_content) assert empty_json_response(conn)
assert User.get_cached_by_id(user3.id).tags == ["unchanged"] assert User.get_cached_by_id(user3.id).tags == ["unchanged"]
end end
end end
@ -1777,7 +1777,7 @@ test "sets password_reset_pending to true", %{conn: conn} do
conn = conn =
patch(conn, "/api/pleroma/admin/users/force_password_reset", %{nicknames: [user.nickname]}) patch(conn, "/api/pleroma/admin/users/force_password_reset", %{nicknames: [user.nickname]})
assert json_response(conn, 204) == "" assert empty_json_response(conn) == ""
ObanHelpers.perform_all() ObanHelpers.perform_all()

View file

@ -1342,6 +1342,75 @@ test "args for Pleroma.Upload.Filter.Mogrify with custom tuples", %{conn: conn}
args: ["auto-orient", "strip", {"implode", "1"}, {"resize", "3840x1080>"}] args: ["auto-orient", "strip", {"implode", "1"}, {"resize", "3840x1080>"}]
] ]
end end
test "enables the welcome messages", %{conn: conn} do
clear_config([:welcome])
params = %{
"group" => ":pleroma",
"key" => ":welcome",
"value" => [
%{
"tuple" => [
":direct_message",
[
%{"tuple" => [":enabled", true]},
%{"tuple" => [":message", "Welcome to Pleroma!"]},
%{"tuple" => [":sender_nickname", "pleroma"]}
]
]
},
%{
"tuple" => [
":chat_message",
[
%{"tuple" => [":enabled", true]},
%{"tuple" => [":message", "Welcome to Pleroma!"]},
%{"tuple" => [":sender_nickname", "pleroma"]}
]
]
},
%{
"tuple" => [
":email",
[
%{"tuple" => [":enabled", true]},
%{"tuple" => [":sender", %{"tuple" => ["pleroma@dev.dev", "Pleroma"]}]},
%{"tuple" => [":subject", "Welcome to <%= instance_name %>!"]},
%{"tuple" => [":html", "Welcome to <%= instance_name %>!"]},
%{"tuple" => [":text", "Welcome to <%= instance_name %>!"]}
]
]
}
]
}
refute Pleroma.User.WelcomeEmail.enabled?()
refute Pleroma.User.WelcomeMessage.enabled?()
refute Pleroma.User.WelcomeChatMessage.enabled?()
res =
assert conn
|> put_req_header("content-type", "application/json")
|> post("/api/pleroma/admin/config", %{"configs" => [params]})
|> json_response_and_validate_schema(200)
assert Pleroma.User.WelcomeEmail.enabled?()
assert Pleroma.User.WelcomeMessage.enabled?()
assert Pleroma.User.WelcomeChatMessage.enabled?()
assert res == %{
"configs" => [
%{
"db" => [":direct_message", ":chat_message", ":email"],
"group" => ":pleroma",
"key" => ":welcome",
"value" => params["value"]
}
],
"need_reboot" => false
}
end
end end
describe "GET /api/pleroma/admin/config/descriptions" do describe "GET /api/pleroma/admin/config/descriptions" do