forked from AkkomaGang/akkoma
Merge branch 'feature/788-separate-email-addresses' into 'develop'
Feature/788 separate email addresses Closes #788 See merge request pleroma/pleroma!1040
This commit is contained in:
commit
73df3046e0
12 changed files with 133 additions and 17 deletions
|
@ -201,6 +201,7 @@
|
||||||
config :pleroma, :instance,
|
config :pleroma, :instance,
|
||||||
name: "Pleroma",
|
name: "Pleroma",
|
||||||
email: "example@example.com",
|
email: "example@example.com",
|
||||||
|
notify_email: "noreply@example.com",
|
||||||
description: "A Pleroma instance, an alternative fediverse server",
|
description: "A Pleroma instance, an alternative fediverse server",
|
||||||
limit: 5_000,
|
limit: 5_000,
|
||||||
remote_limit: 100_000,
|
remote_limit: 100_000,
|
||||||
|
|
|
@ -23,6 +23,10 @@
|
||||||
|
|
||||||
config :pleroma, Pleroma.Emails.Mailer, adapter: Swoosh.Adapters.Test
|
config :pleroma, Pleroma.Emails.Mailer, adapter: Swoosh.Adapters.Test
|
||||||
|
|
||||||
|
config :pleroma, :instance,
|
||||||
|
email: "admin@example.com",
|
||||||
|
notify_email: "noreply@example.com"
|
||||||
|
|
||||||
# Configure your database
|
# Configure your database
|
||||||
config :pleroma, Pleroma.Repo,
|
config :pleroma, Pleroma.Repo,
|
||||||
adapter: Ecto.Adapters.Postgres,
|
adapter: Ecto.Adapters.Postgres,
|
||||||
|
|
|
@ -63,6 +63,7 @@ config :pleroma, Pleroma.Emails.Mailer,
|
||||||
## :instance
|
## :instance
|
||||||
* `name`: The instance’s name
|
* `name`: The instance’s name
|
||||||
* `email`: Email used to reach an Administrator/Moderator of the instance
|
* `email`: Email used to reach an Administrator/Moderator of the instance
|
||||||
|
* `notify_email`: Email used for notifications.
|
||||||
* `description`: The instance’s description, can be seen in nodeinfo and ``/api/v1/instance``
|
* `description`: The instance’s description, can be seen in nodeinfo and ``/api/v1/instance``
|
||||||
* `limit`: Posts character limit (CW/Subject included in the counter)
|
* `limit`: Posts character limit (CW/Subject included in the counter)
|
||||||
* `remote_limit`: Hard character limit beyond which remote posts will be dropped.
|
* `remote_limit`: Hard character limit beyond which remote posts will be dropped.
|
||||||
|
@ -429,7 +430,7 @@ Pleroma account will be created with the same name as the LDAP user name.
|
||||||
|
|
||||||
Authentication / authorization settings.
|
Authentication / authorization settings.
|
||||||
|
|
||||||
* `auth_template`: authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.eex`.
|
* `auth_template`: authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.eex`.
|
||||||
* `oauth_consumer_template`: OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`.
|
* `oauth_consumer_template`: OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`.
|
||||||
* `oauth_consumer_strategies`: the list of enabled OAuth consumer strategies; by default it's set by OAUTH_CONSUMER_STRATEGIES environment variable.
|
* `oauth_consumer_strategies`: the list of enabled OAuth consumer strategies; by default it's set by OAUTH_CONSUMER_STRATEGIES environment variable.
|
||||||
|
|
||||||
|
@ -442,7 +443,7 @@ Note: each strategy is shipped as a separate dependency; in order to get the str
|
||||||
e.g. `OAUTH_CONSUMER_STRATEGIES="twitter facebook google microsoft" mix deps.get`.
|
e.g. `OAUTH_CONSUMER_STRATEGIES="twitter facebook google microsoft" mix deps.get`.
|
||||||
The server should also be started with `OAUTH_CONSUMER_STRATEGIES="..." mix phx.server` in case you enable any strategies.
|
The server should also be started with `OAUTH_CONSUMER_STRATEGIES="..." mix phx.server` in case you enable any strategies.
|
||||||
|
|
||||||
Note: each strategy requires separate setup (on external provider side and Pleroma side). Below are the guidelines on setting up most popular strategies.
|
Note: each strategy requires separate setup (on external provider side and Pleroma side). Below are the guidelines on setting up most popular strategies.
|
||||||
|
|
||||||
Note: make sure that `"SameSite=Lax"` is set in `extra_cookie_attrs` when you have this feature enabled. OAuth consumer mode will not work with `"SameSite=Strict"`
|
Note: make sure that `"SameSite=Lax"` is set in `extra_cookie_attrs` when you have this feature enabled. OAuth consumer mode will not work with `"SameSite=Strict"`
|
||||||
|
|
||||||
|
@ -479,7 +480,7 @@ config :ueberauth, Ueberauth.Strategy.Google.OAuth,
|
||||||
config :ueberauth, Ueberauth.Strategy.Microsoft.OAuth,
|
config :ueberauth, Ueberauth.Strategy.Microsoft.OAuth,
|
||||||
client_id: System.get_env("MICROSOFT_CLIENT_ID"),
|
client_id: System.get_env("MICROSOFT_CLIENT_ID"),
|
||||||
client_secret: System.get_env("MICROSOFT_CLIENT_SECRET")
|
client_secret: System.get_env("MICROSOFT_CLIENT_SECRET")
|
||||||
|
|
||||||
config :ueberauth, Ueberauth,
|
config :ueberauth, Ueberauth,
|
||||||
providers: [
|
providers: [
|
||||||
microsoft: {Ueberauth.Strategy.Microsoft, [callback_params: []]}
|
microsoft: {Ueberauth.Strategy.Microsoft, [callback_params: []]}
|
||||||
|
|
|
@ -24,10 +24,12 @@ defmodule Mix.Tasks.Pleroma.Instance do
|
||||||
- `--domain DOMAIN` - the domain of your instance
|
- `--domain DOMAIN` - the domain of your instance
|
||||||
- `--instance-name INSTANCE_NAME` - the name of your instance
|
- `--instance-name INSTANCE_NAME` - the name of your instance
|
||||||
- `--admin-email ADMIN_EMAIL` - the email address of the instance admin
|
- `--admin-email ADMIN_EMAIL` - the email address of the instance admin
|
||||||
|
- `--notify-email NOTIFY_EMAIL` - email address for notifications
|
||||||
- `--dbhost HOSTNAME` - the hostname of the PostgreSQL database to use
|
- `--dbhost HOSTNAME` - the hostname of the PostgreSQL database to use
|
||||||
- `--dbname DBNAME` - the name of the database to use
|
- `--dbname DBNAME` - the name of the database to use
|
||||||
- `--dbuser DBUSER` - the user (aka role) to use for the database connection
|
- `--dbuser DBUSER` - the user (aka role) to use for the database connection
|
||||||
- `--dbpass DBPASS` - the password to use for the database connection
|
- `--dbpass DBPASS` - the password to use for the database connection
|
||||||
|
- `--indexable Y/N` - Allow/disallow indexing site by search engines
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def run(["gen" | rest]) do
|
def run(["gen" | rest]) do
|
||||||
|
@ -41,10 +43,12 @@ def run(["gen" | rest]) do
|
||||||
domain: :string,
|
domain: :string,
|
||||||
instance_name: :string,
|
instance_name: :string,
|
||||||
admin_email: :string,
|
admin_email: :string,
|
||||||
|
notify_email: :string,
|
||||||
dbhost: :string,
|
dbhost: :string,
|
||||||
dbname: :string,
|
dbname: :string,
|
||||||
dbuser: :string,
|
dbuser: :string,
|
||||||
dbpass: :string
|
dbpass: :string,
|
||||||
|
indexable: :string
|
||||||
],
|
],
|
||||||
aliases: [
|
aliases: [
|
||||||
o: :output,
|
o: :output,
|
||||||
|
@ -61,7 +65,7 @@ def run(["gen" | rest]) do
|
||||||
will_overwrite = Enum.filter(paths, &File.exists?/1)
|
will_overwrite = Enum.filter(paths, &File.exists?/1)
|
||||||
proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false)
|
proceed? = Enum.empty?(will_overwrite) or Keyword.get(options, :force, false)
|
||||||
|
|
||||||
unless not proceed? do
|
if proceed? do
|
||||||
[domain, port | _] =
|
[domain, port | _] =
|
||||||
String.split(
|
String.split(
|
||||||
Common.get_option(
|
Common.get_option(
|
||||||
|
@ -81,6 +85,14 @@ def run(["gen" | rest]) do
|
||||||
|
|
||||||
email = Common.get_option(options, :admin_email, "What is your admin email address?")
|
email = Common.get_option(options, :admin_email, "What is your admin email address?")
|
||||||
|
|
||||||
|
notify_email =
|
||||||
|
Common.get_option(
|
||||||
|
options,
|
||||||
|
:notify_email,
|
||||||
|
"What email address do you want to use for sending email notifications?",
|
||||||
|
email
|
||||||
|
)
|
||||||
|
|
||||||
indexable =
|
indexable =
|
||||||
Common.get_option(
|
Common.get_option(
|
||||||
options,
|
options,
|
||||||
|
@ -122,6 +134,7 @@ def run(["gen" | rest]) do
|
||||||
domain: domain,
|
domain: domain,
|
||||||
port: port,
|
port: port,
|
||||||
email: email,
|
email: email,
|
||||||
|
notify_email: notify_email,
|
||||||
name: name,
|
name: name,
|
||||||
dbhost: dbhost,
|
dbhost: dbhost,
|
||||||
dbname: dbname,
|
dbname: dbname,
|
||||||
|
|
|
@ -13,6 +13,7 @@ config :pleroma, Pleroma.Web.Endpoint,
|
||||||
config :pleroma, :instance,
|
config :pleroma, :instance,
|
||||||
name: "<%= name %>",
|
name: "<%= name %>",
|
||||||
email: "<%= email %>",
|
email: "<%= email %>",
|
||||||
|
notify_email: "<%= notify_email %>",
|
||||||
limit: 5000,
|
limit: 5000,
|
||||||
registrations_open: true,
|
registrations_open: true,
|
||||||
dedupe_media: false
|
dedupe_media: false
|
||||||
|
@ -75,4 +76,3 @@ config :web_push_encryption, :vapid_details,
|
||||||
# storage_url: "https://swift-endpoint.prodider.com/v1/AUTH_<tenant>/<container>",
|
# storage_url: "https://swift-endpoint.prodider.com/v1/AUTH_<tenant>/<container>",
|
||||||
# object_url: "https://cdn-endpoint.provider.com/<container>"
|
# object_url: "https://cdn-endpoint.provider.com/<container>"
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,10 @@ defmodule Pleroma.Emails.AdminEmail do
|
||||||
|
|
||||||
defp instance_config, do: Pleroma.Config.get(:instance)
|
defp instance_config, do: Pleroma.Config.get(:instance)
|
||||||
defp instance_name, do: instance_config()[:name]
|
defp instance_name, do: instance_config()[:name]
|
||||||
defp instance_email, do: instance_config()[:email]
|
|
||||||
|
defp instance_notify_email do
|
||||||
|
Keyword.get(instance_config(), :notify_email, instance_config()[:email])
|
||||||
|
end
|
||||||
|
|
||||||
defp user_url(user) do
|
defp user_url(user) do
|
||||||
Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, user.nickname)
|
Helpers.o_status_url(Pleroma.Web.Endpoint, :feed_redirect, user.nickname)
|
||||||
|
@ -59,7 +62,7 @@ def report(to, reporter, account, statuses, comment) do
|
||||||
|
|
||||||
new()
|
new()
|
||||||
|> to({to.name, to.email})
|
|> to({to.name, to.email})
|
||||||
|> from({instance_name(), instance_email()})
|
|> from({instance_name(), instance_notify_email()})
|
||||||
|> reply_to({reporter.name, reporter.email})
|
|> reply_to({reporter.name, reporter.email})
|
||||||
|> subject("#{instance_name()} Report")
|
|> subject("#{instance_name()} Report")
|
||||||
|> html_body(html_body)
|
|> html_body(html_body)
|
||||||
|
|
|
@ -15,7 +15,8 @@ defp instance_config, do: Pleroma.Config.get(:instance)
|
||||||
defp instance_name, do: instance_config()[:name]
|
defp instance_name, do: instance_config()[:name]
|
||||||
|
|
||||||
defp sender do
|
defp sender do
|
||||||
{instance_name(), instance_config()[:email]}
|
email = Keyword.get(instance_config(), :notify_email, instance_config()[:email])
|
||||||
|
{instance_name(), email}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp recipient(email, nil), do: email
|
defp recipient(email, nil), do: email
|
||||||
|
|
62
test/tasks/instance.exs
Normal file
62
test/tasks/instance.exs
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
defmodule Pleroma.InstanceTest do
|
||||||
|
use ExUnit.Case, async: true
|
||||||
|
|
||||||
|
setup do
|
||||||
|
File.mkdir_p!(tmp_path())
|
||||||
|
on_exit(fn -> File.rm_rf(tmp_path()) end)
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
defp tmp_path do
|
||||||
|
"/tmp/generated_files/"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "running gen" do
|
||||||
|
mix_task = fn ->
|
||||||
|
Mix.Tasks.Pleroma.Instance.run([
|
||||||
|
"gen",
|
||||||
|
"--output",
|
||||||
|
tmp_path() <> "generated_config.exs",
|
||||||
|
"--output-psql",
|
||||||
|
tmp_path() <> "setup.psql",
|
||||||
|
"--domain",
|
||||||
|
"test.pleroma.social",
|
||||||
|
"--instance-name",
|
||||||
|
"Pleroma",
|
||||||
|
"--admin-email",
|
||||||
|
"admin@example.com",
|
||||||
|
"--notify-email",
|
||||||
|
"notify@example.com",
|
||||||
|
"--dbhost",
|
||||||
|
"dbhost",
|
||||||
|
"--dbname",
|
||||||
|
"dbname",
|
||||||
|
"--dbuser",
|
||||||
|
"dbuser",
|
||||||
|
"--dbpass",
|
||||||
|
"dbpass",
|
||||||
|
"--indexable",
|
||||||
|
"y"
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
ExUnit.CaptureIO.capture_io(fn ->
|
||||||
|
mix_task.()
|
||||||
|
end)
|
||||||
|
|
||||||
|
generated_config = File.read!(tmp_path() <> "generated_config.exs")
|
||||||
|
assert generated_config =~ "host: \"test.pleroma.social\""
|
||||||
|
assert generated_config =~ "name: \"Pleroma\""
|
||||||
|
assert generated_config =~ "email: \"admin@example.com\""
|
||||||
|
assert generated_config =~ "notify_email: \"notify@example.com\""
|
||||||
|
assert generated_config =~ "hostname: \"dbhost\""
|
||||||
|
assert generated_config =~ "database: \"dbname\""
|
||||||
|
assert generated_config =~ "username: \"dbuser\""
|
||||||
|
assert generated_config =~ "password: \"dbpass\""
|
||||||
|
assert File.read!(tmp_path() <> "setup.psql") == generated_setup_psql()
|
||||||
|
end
|
||||||
|
|
||||||
|
defp generated_setup_psql do
|
||||||
|
~s(CREATE USER dbuser WITH ENCRYPTED PASSWORD 'dbpass';\nCREATE DATABASE dbname OWNER dbuser;\n\\c dbname;\n--Extensions made by ecto.migrate that need superuser access\nCREATE EXTENSION IF NOT EXISTS citext;\nCREATE EXTENSION IF NOT EXISTS pg_trgm;\nCREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";\n)
|
||||||
|
end
|
||||||
|
end
|
|
@ -317,13 +317,21 @@ test "sends invitation and returns 204", %{conn: conn, user: user} do
|
||||||
assert token_record
|
assert token_record
|
||||||
refute token_record.used
|
refute token_record.used
|
||||||
|
|
||||||
Swoosh.TestAssertions.assert_email_sent(
|
notify_email = Pleroma.Config.get([:instance, :notify_email])
|
||||||
|
instance_name = Pleroma.Config.get([:instance, :name])
|
||||||
|
|
||||||
|
email =
|
||||||
Pleroma.Emails.UserEmail.user_invitation_email(
|
Pleroma.Emails.UserEmail.user_invitation_email(
|
||||||
user,
|
user,
|
||||||
token_record,
|
token_record,
|
||||||
recipient_email,
|
recipient_email,
|
||||||
recipient_name
|
recipient_name
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Swoosh.TestAssertions.assert_email_sent(
|
||||||
|
from: {instance_name, notify_email},
|
||||||
|
to: {recipient_name, recipient_email},
|
||||||
|
html_body: email.html_body
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -2048,13 +2048,14 @@ test "get instance information", %{conn: conn} do
|
||||||
conn = get(conn, "/api/v1/instance")
|
conn = get(conn, "/api/v1/instance")
|
||||||
assert result = json_response(conn, 200)
|
assert result = json_response(conn, 200)
|
||||||
|
|
||||||
|
email = Pleroma.Config.get([:instance, :email])
|
||||||
# Note: not checking for "max_toot_chars" since it's optional
|
# Note: not checking for "max_toot_chars" since it's optional
|
||||||
assert %{
|
assert %{
|
||||||
"uri" => _,
|
"uri" => _,
|
||||||
"title" => _,
|
"title" => _,
|
||||||
"description" => _,
|
"description" => _,
|
||||||
"version" => _,
|
"version" => _,
|
||||||
"email" => _,
|
"email" => from_config_email,
|
||||||
"urls" => %{
|
"urls" => %{
|
||||||
"streaming_api" => _
|
"streaming_api" => _
|
||||||
},
|
},
|
||||||
|
@ -2063,6 +2064,8 @@ test "get instance information", %{conn: conn} do
|
||||||
"languages" => _,
|
"languages" => _,
|
||||||
"registrations" => _
|
"registrations" => _
|
||||||
} = result
|
} = result
|
||||||
|
|
||||||
|
assert email == from_config_email
|
||||||
end
|
end
|
||||||
|
|
||||||
test "get instance stats", %{conn: conn} do
|
test "get instance stats", %{conn: conn} do
|
||||||
|
|
|
@ -22,8 +22,9 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
|
||||||
alias Pleroma.Web.TwitterAPI.TwitterAPI
|
alias Pleroma.Web.TwitterAPI.TwitterAPI
|
||||||
alias Pleroma.Web.TwitterAPI.UserView
|
alias Pleroma.Web.TwitterAPI.UserView
|
||||||
|
|
||||||
import Pleroma.Factory
|
|
||||||
import Mock
|
import Mock
|
||||||
|
import Pleroma.Factory
|
||||||
|
import Swoosh.TestAssertions
|
||||||
|
|
||||||
@banner "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7"
|
@banner "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7"
|
||||||
|
|
||||||
|
@ -1063,8 +1064,14 @@ test "it creates a PasswordResetToken record for user", %{user: user} do
|
||||||
test "it sends an email to user", %{user: user} do
|
test "it sends an email to user", %{user: user} do
|
||||||
token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
|
token_record = Repo.get_by(Pleroma.PasswordResetToken, user_id: user.id)
|
||||||
|
|
||||||
Swoosh.TestAssertions.assert_email_sent(
|
email = Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token)
|
||||||
Pleroma.Emails.UserEmail.password_reset_email(user, token_record.token)
|
notify_email = Pleroma.Config.get([:instance, :notify_email])
|
||||||
|
instance_name = Pleroma.Config.get([:instance, :name])
|
||||||
|
|
||||||
|
assert_email_sent(
|
||||||
|
from: {instance_name, notify_email},
|
||||||
|
to: {user.name, user.email},
|
||||||
|
html_body: email.html_body
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1163,8 +1170,14 @@ test "it sends confirmation email", %{conn: conn, user: user} do
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|> post("/api/account/resend_confirmation_email?email=#{user.email}")
|
|> post("/api/account/resend_confirmation_email?email=#{user.email}")
|
||||||
|
|
||||||
Swoosh.TestAssertions.assert_email_sent(
|
email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
|
||||||
Pleroma.Emails.UserEmail.account_confirmation_email(user)
|
notify_email = Pleroma.Config.get([:instance, :notify_email])
|
||||||
|
instance_name = Pleroma.Config.get([:instance, :name])
|
||||||
|
|
||||||
|
assert_email_sent(
|
||||||
|
from: {instance_name, notify_email},
|
||||||
|
to: {user.name, user.email},
|
||||||
|
html_body: email.html_body
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -325,8 +325,15 @@ test "it sends confirmation email if :account_activation_required is specified i
|
||||||
|
|
||||||
assert user.info.confirmation_pending
|
assert user.info.confirmation_pending
|
||||||
|
|
||||||
|
email = Pleroma.Emails.UserEmail.account_confirmation_email(user)
|
||||||
|
|
||||||
|
notify_email = Pleroma.Config.get([:instance, :notify_email])
|
||||||
|
instance_name = Pleroma.Config.get([:instance, :name])
|
||||||
|
|
||||||
Swoosh.TestAssertions.assert_email_sent(
|
Swoosh.TestAssertions.assert_email_sent(
|
||||||
Pleroma.Emails.UserEmail.account_confirmation_email(user)
|
from: {instance_name, notify_email},
|
||||||
|
to: {user.name, user.email},
|
||||||
|
html_body: email.html_body
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue