From 658edb166fc91e77399ff6022a48076db5404fb1 Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 7 Dec 2018 15:55:28 +0700 Subject: [PATCH 01/12] fix and improve web push; add configuration docs --- config/config.md | 8 ++++++ lib/pleroma/plugs/oauth_plug.ex | 28 +++++++++---------- .../views/push_subscription_view.ex | 7 ++++- lib/pleroma/web/push/push.ex | 8 +++--- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/config/config.md b/config/config.md index 165f5d9f8..2401e9aed 100644 --- a/config/config.md +++ b/config/config.md @@ -154,3 +154,11 @@ An example: config :pleroma, :mrf_user_allowlist, "example.org": ["https://example.org/users/admin"] ``` + +## :web_push_encryption + +Web Push Notifications configuration. You could use a mix task `mix web_push.gen.keypair` to generate it. + +* ``subject``: a mailto link for the administrative contact. It’s best if this email is not a personal email address, but rather a group email so that if a person leaves an organization, is unavailable for an extended period, or otherwise can’t respond, someone else on the list can. +* ``public_key``: VAPID public key +* ``private_key``: VAPID private key diff --git a/lib/pleroma/plugs/oauth_plug.ex b/lib/pleroma/plugs/oauth_plug.ex index 8b99a74d1..13c914c1b 100644 --- a/lib/pleroma/plugs/oauth_plug.ex +++ b/lib/pleroma/plugs/oauth_plug.ex @@ -15,10 +15,10 @@ def init(options), do: options def call(%{assigns: %{user: %User{}}} = conn, _), do: conn def call(conn, _) do - with {:ok, token} <- fetch_token(conn), - {:ok, user} <- fetch_user(token) do + with {:ok, token_str} <- fetch_token_str(conn), + {:ok, user, token_record} <- fetch_user_and_token(token_str) do conn - |> assign(:token, token) + |> assign(:token, token_record) |> assign(:user, user) else _ -> conn @@ -27,12 +27,12 @@ def call(conn, _) do # Gets user by token # - @spec fetch_user(String.t()) :: {:ok, User.t()} | nil - defp fetch_user(token) do + @spec fetch_user_and_token(String.t()) :: {:ok, User.t(), Token.t()} | nil + defp fetch_user_and_token(token) do query = from(q in Token, where: q.token == ^token, preload: [:user]) - with %Token{user: %{info: %{deactivated: false} = _} = user} <- Repo.one(query) do - {:ok, user} + with %Token{user: %{info: %{deactivated: false} = _} = user} = token_record <- Repo.one(query) do + {:ok, user, token_record} end end @@ -48,23 +48,23 @@ defp fetch_token_from_session(conn) do # Gets token from headers # - @spec fetch_token(Plug.Conn.t()) :: :no_token_found | {:ok, String.t()} - defp fetch_token(%Plug.Conn{} = conn) do + @spec fetch_token_str(Plug.Conn.t()) :: :no_token_found | {:ok, String.t()} + defp fetch_token_str(%Plug.Conn{} = conn) do headers = get_req_header(conn, "authorization") - with :no_token_found <- fetch_token(headers), + with :no_token_found <- fetch_token_str(headers), do: fetch_token_from_session(conn) end - @spec fetch_token(Keyword.t()) :: :no_token_found | {:ok, String.t()} - defp fetch_token([]), do: :no_token_found + @spec fetch_token_str(Keyword.t()) :: :no_token_found | {:ok, String.t()} + defp fetch_token_str([]), do: :no_token_found - defp fetch_token([token | tail]) do + defp fetch_token_str([token | tail]) do trimmed_token = String.trim(token) case Regex.run(@realm_reg, trimmed_token) do [_, match] -> {:ok, String.trim(match)} - _ -> fetch_token(tail) + _ -> fetch_token_str(tail) end end end diff --git a/lib/pleroma/web/mastodon_api/views/push_subscription_view.ex b/lib/pleroma/web/mastodon_api/views/push_subscription_view.ex index c8b95d14c..67e86294e 100644 --- a/lib/pleroma/web/mastodon_api/views/push_subscription_view.ex +++ b/lib/pleroma/web/mastodon_api/views/push_subscription_view.ex @@ -5,7 +5,12 @@ def render("push_subscription.json", %{subscription: subscription}) do %{ id: to_string(subscription.id), endpoint: subscription.endpoint, - alerts: Map.get(subscription.data, "alerts") + alerts: Map.get(subscription.data, "alerts"), + server_key: server_key() } end + + defp server_key do + Keyword.get(Application.get_env(:web_push_encryption, :vapid_details), :public_key) + end end diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index 5a873ec19..fb6605f30 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -100,16 +100,16 @@ def format(%{activity: %{data: %{"type" => "Follow"}}}, actor) do def format(%{activity: %{data: %{"type" => "Announce"}}}, actor) do %{ - title: "New Announce", - body: "@#{actor.nickname} has announced your post", + title: "New Repeat", + body: "@#{actor.nickname} has repeated your post", icon: User.avatar_url(actor) } end def format(%{activity: %{data: %{"type" => "Like"}}}, actor) do %{ - title: "New Like", - body: "@#{actor.nickname} has liked your post", + title: "New Favorite", + body: "@#{actor.nickname} has favorited your post", icon: User.avatar_url(actor) } end From 3b65f316069a7c754d29515ad33b852661fff5ef Mon Sep 17 00:00:00 2001 From: lambda Date: Fri, 7 Dec 2018 09:32:59 +0000 Subject: [PATCH 02/12] Update config.md --- config/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.md b/config/config.md index 2401e9aed..25e0b5012 100644 --- a/config/config.md +++ b/config/config.md @@ -157,7 +157,7 @@ config :pleroma, :mrf_user_allowlist, ## :web_push_encryption -Web Push Notifications configuration. You could use a mix task `mix web_push.gen.keypair` to generate it. +Web Push Notifications configuration. You can use the mix task `mix web_push.gen.keypair` to generate it. * ``subject``: a mailto link for the administrative contact. It’s best if this email is not a personal email address, but rather a group email so that if a person leaves an organization, is unavailable for an extended period, or otherwise can’t respond, someone else on the list can. * ``public_key``: VAPID public key From 324933a0ac8db810669375315d43fc9250a93a7b Mon Sep 17 00:00:00 2001 From: Egor Kislitsyn Date: Fri, 7 Dec 2018 21:08:42 +0700 Subject: [PATCH 03/12] improve push message format (compatibility with mastodon) --- lib/pleroma/web/push/push.ex | 54 +++++++++++++++++------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index fb6605f30..4af3e159a 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -41,10 +41,10 @@ def handle_cast( ) when type in @types do actor = User.get_cached_by_ap_id(notification.activity.data["actor"]) - body = notification |> format(actor) |> Jason.encode!() Subscription |> where(user_id: ^user_id) + |> preload(:token) |> Repo.all() |> Enum.each(fn record -> subscription = %{ @@ -55,6 +55,16 @@ def handle_cast( endpoint: record.endpoint } + body = + Jason.encode!(%{ + title: format_title(notification), + body: format_body(notification, actor), + notification_id: notification.id, + icon: User.avatar_url(actor), + preferred_locale: "en", + access_token: record.token.token + }) + case WebPushEncryption.send_web_push(body, subscription, @gcm_api_key) do {:ok, %{status_code: code}} when 400 <= code and code < 500 -> Logger.debug("Removing subscription record") @@ -82,35 +92,21 @@ def handle_cast({:send, _}, state) do {:noreply, state} end - def format(%{activity: %{data: %{"type" => "Create"}}}, actor) do - %{ - title: "New Mention", - body: "@#{actor.nickname} has mentiond you", - icon: User.avatar_url(actor) - } + defp format_title(%{activity: %{data: %{"type" => type}}}) do + case type do + "Create" -> "New Mention" + "Follow" -> "New Follower" + "Announce" -> "New Repeat" + "Like" -> "New Favorite" + end end - def format(%{activity: %{data: %{"type" => "Follow"}}}, actor) do - %{ - title: "New Follower", - body: "@#{actor.nickname} has followed you", - icon: User.avatar_url(actor) - } - end - - def format(%{activity: %{data: %{"type" => "Announce"}}}, actor) do - %{ - title: "New Repeat", - body: "@#{actor.nickname} has repeated your post", - icon: User.avatar_url(actor) - } - end - - def format(%{activity: %{data: %{"type" => "Like"}}}, actor) do - %{ - title: "New Favorite", - body: "@#{actor.nickname} has favorited your post", - icon: User.avatar_url(actor) - } + defp format_body(%{activity: %{data: %{"type" => type}}}, actor) do + case type do + "Create" -> "@#{actor.nickname} has mentiond you" + "Follow" -> "@#{actor.nickname} has followed you" + "Announce" -> "@#{actor.nickname} has repeated your post" + "Like" -> "@#{actor.nickname} has favorited your post" + end end end From 7facbb2b8d68abc608d6d36f21207d5c0f131029 Mon Sep 17 00:00:00 2001 From: href Date: Sat, 8 Dec 2018 17:32:58 +0100 Subject: [PATCH 04/12] Push.Subscription: convert base64 to base64 urlsafe --- lib/pleroma/web/push/subscription.ex | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/push/subscription.ex b/lib/pleroma/web/push/subscription.ex index cfab7a98e..1ad405daf 100644 --- a/lib/pleroma/web/push/subscription.ex +++ b/lib/pleroma/web/push/subscription.ex @@ -37,8 +37,8 @@ def create( user_id: user.id, token_id: token.id, endpoint: endpoint, - key_auth: key_auth, - key_p256dh: key_p256dh, + key_auth: ensure_base64_urlsafe(key_auth), + key_p256dh: ensure_base64_urlsafe(key_p256dh), data: alerts(params) }) end @@ -63,4 +63,14 @@ def delete_if_exists(user, token) do sub -> Repo.delete(sub) end end + + # Some webpush clients (e.g. iOS Toot!) use an non urlsafe base64 as an encoding for the key. + # However, the web push rfs specify to use base64 urlsafe, and the `web_push_encryption` library we use + # requires the key to be properly encoded. So we just convert base64 to urlsafe base64. + defp ensure_base64_urlsafe(string) do + string + |> String.replace("+", "-") + |> String.replace("/", "_") + |> String.replace("=", "") + end end From d8984b7bf83e1ee076a73aab682db0f2673e3735 Mon Sep 17 00:00:00 2001 From: href Date: Sat, 8 Dec 2018 17:34:13 +0100 Subject: [PATCH 05/12] Push: add missing notification_type field --- lib/pleroma/web/push/push.ex | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index 4af3e159a..8b59e54cb 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -58,14 +58,15 @@ def handle_cast( body = Jason.encode!(%{ title: format_title(notification), + access_token: record.token.token, body: format_body(notification, actor), notification_id: notification.id, + notification_type: format_type(notification), icon: User.avatar_url(actor), - preferred_locale: "en", - access_token: record.token.token + preferred_locale: "en" }) - case WebPushEncryption.send_web_push(body, subscription, @gcm_api_key) do + case WebPushEncryption.send_web_push(body, subscription) do {:ok, %{status_code: code}} when 400 <= code and code < 500 -> Logger.debug("Removing subscription record") Repo.delete!(record) @@ -92,6 +93,16 @@ def handle_cast({:send, _}, state) do {:noreply, state} end + # https://github.com/tootsuite/mastodon/blob/master/app/models/notification.rb#L19 + defp format_type(%{activity: %{data: %{"type" => type}}}) do + case type do + "Create" -> "mention" + "Follow" -> "follow" + "Announce" -> "reblog" + "Favorite" -> "favourite" + end + end + defp format_title(%{activity: %{data: %{"type" => type}}}) do case type do "Create" -> "New Mention" From b1bcd97a0f47832d5a87fdfa814f5e2ef54d605f Mon Sep 17 00:00:00 2001 From: href Date: Sat, 8 Dec 2018 18:07:10 +0100 Subject: [PATCH 06/12] Push: respect alerts settings --- lib/pleroma/web/push/push.ex | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index 8b59e54cb..d9c3410fe 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -42,45 +42,50 @@ def handle_cast( when type in @types do actor = User.get_cached_by_ap_id(notification.activity.data["actor"]) + type = format_type(notification) + Subscription |> where(user_id: ^user_id) |> preload(:token) |> Repo.all() - |> Enum.each(fn record -> - subscription = %{ + |> Enum.filter(fn subscription -> + get_in(subscription.data, ["alerts", type]) || false + end) + |> Enum.each(fn subscription -> + sub = %{ keys: %{ - p256dh: record.key_p256dh, - auth: record.key_auth + p256dh: subscription.key_p256dh, + auth: subscription.key_auth }, - endpoint: record.endpoint + endpoint: subscription.endpoint } body = Jason.encode!(%{ title: format_title(notification), - access_token: record.token.token, + access_token: subscription.token.token, body: format_body(notification, actor), notification_id: notification.id, - notification_type: format_type(notification), + notification_type: type, icon: User.avatar_url(actor), preferred_locale: "en" }) - case WebPushEncryption.send_web_push(body, subscription) do + case WebPushEncryption.send_web_push(body, sub) do {:ok, %{status_code: code}} when 400 <= code and code < 500 -> Logger.debug("Removing subscription record") - Repo.delete!(record) + Repo.delete!(subscription) :ok {:ok, %{status_code: code}} when 200 <= code and code < 300 -> :ok {:ok, %{status_code: code}} -> - Logger.error("Web Push Nonification failed with code: #{code}") + Logger.error("Web Push Notification failed with code: #{code}") :error _ -> - Logger.error("Web Push Nonification failed with unknown error") + Logger.error("Web Push Notification failed with unknown error") :error end end) From 68229161832fd98ee59679fb19aafc3baceea2ae Mon Sep 17 00:00:00 2001 From: href Date: Sat, 8 Dec 2018 20:02:59 +0100 Subject: [PATCH 07/12] Typos --- lib/pleroma/web/push/push.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index d9c3410fe..291e04a6e 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -104,7 +104,7 @@ defp format_type(%{activity: %{data: %{"type" => type}}}) do "Create" -> "mention" "Follow" -> "follow" "Announce" -> "reblog" - "Favorite" -> "favourite" + "Like" -> "favourite" end end @@ -119,7 +119,7 @@ defp format_title(%{activity: %{data: %{"type" => type}}}) do defp format_body(%{activity: %{data: %{"type" => type}}}, actor) do case type do - "Create" -> "@#{actor.nickname} has mentiond you" + "Create" -> "@#{actor.nickname} has mentioned you" "Follow" -> "@#{actor.nickname} has followed you" "Announce" -> "@#{actor.nickname} has repeated your post" "Like" -> "@#{actor.nickname} has favorited your post" From 331396cbcdabe9dbfe0b84ec299a642385093605 Mon Sep 17 00:00:00 2001 From: href Date: Sun, 9 Dec 2018 13:45:21 +0100 Subject: [PATCH 08/12] Properly disable Web Push if no VAPID key is set --- .../mastodon_api/mastodon_api_controller.ex | 4 ++ lib/pleroma/web/push/push.ex | 44 +++++++++++++------ .../controllers/util_controller.ex | 3 +- 3 files changed, 35 insertions(+), 16 deletions(-) diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 5c8602322..e105a1e15 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1167,6 +1167,7 @@ def delete_filter(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do end def create_push_subscription(%{assigns: %{user: user, token: token}} = conn, params) do + true = Pleroma.Web.Push.enabled() Pleroma.Web.Push.Subscription.delete_if_exists(user, token) {:ok, subscription} = Pleroma.Web.Push.Subscription.create(user, token, params) view = PushSubscriptionView.render("push_subscription.json", subscription: subscription) @@ -1174,6 +1175,7 @@ def create_push_subscription(%{assigns: %{user: user, token: token}} = conn, par end def get_push_subscription(%{assigns: %{user: user, token: token}} = conn, _params) do + true = Pleroma.Web.Push.enabled() subscription = Pleroma.Web.Push.Subscription.get(user, token) view = PushSubscriptionView.render("push_subscription.json", subscription: subscription) json(conn, view) @@ -1183,12 +1185,14 @@ def update_push_subscription( %{assigns: %{user: user, token: token}} = conn, params ) do + true = Pleroma.Web.Push.enabled() {:ok, subscription} = Pleroma.Web.Push.Subscription.update(user, token, params) view = PushSubscriptionView.render("push_subscription.json", subscription: subscription) json(conn, view) end def delete_push_subscription(%{assigns: %{user: user, token: token}} = conn, _params) do + true = Pleroma.Web.Push.enabled() {:ok, _response} = Pleroma.Web.Push.Subscription.delete(user, token) json(conn, %{}) end diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index 291e04a6e..35e14c243 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -9,32 +9,44 @@ defmodule Pleroma.Web.Push do @types ["Create", "Follow", "Announce", "Like"] - @gcm_api_key nil - def start_link() do GenServer.start_link(__MODULE__, :ok, name: __MODULE__) end - def init(:ok) do - case Application.get_env(:web_push_encryption, :vapid_details) do - nil -> - Logger.warn( - "VAPID key pair is not found. Please, add VAPID configuration to config. Run `mix web_push.gen.keypair` mix task to create a key pair" - ) + def vapid_config() do + Application.get_env(:web_push_encryption, :vapid_details, []) + end - :ignore - - _ -> - {:ok, %{}} + def enabled() do + case vapid_config() do + [] -> false + list when is_list(list) -> true + _ -> false end end def send(notification) do - if Application.get_env(:web_push_encryption, :vapid_details) do + if enabled() do GenServer.cast(Pleroma.Web.Push, {:send, notification}) end end + def init(:ok) do + if enabled() do + Logger.warn(""" + VAPID key pair is not found. If you wish to enabled web push, please run + + mix web_push.gen.keypair + + and add the resulting output to your configuration file. + """) + + :ignore + else + {:ok, nil} + end + end + def handle_cast( {:send, %{activity: %{data: %{"type" => type}}, user_id: user_id} = notification}, state @@ -71,7 +83,11 @@ def handle_cast( preferred_locale: "en" }) - case WebPushEncryption.send_web_push(body, sub) do + case WebPushEncryption.send_web_push( + body, + sub, + Application.get_env(:web_push_encryption, :gcm_api_key) + ) do {:ok, %{status_code: code}} when 400 <= code and code < 500 -> Logger.debug("Removing subscription record") Repo.delete!(subscription) diff --git a/lib/pleroma/web/twitter_api/controllers/util_controller.ex b/lib/pleroma/web/twitter_api/controllers/util_controller.ex index b1e4c77e8..29edca9fe 100644 --- a/lib/pleroma/web/twitter_api/controllers/util_controller.ex +++ b/lib/pleroma/web/twitter_api/controllers/util_controller.ex @@ -156,8 +156,7 @@ def config(conn, _params) do |> send_resp(200, response) _ -> - vapid_public_key = - Keyword.get(Application.get_env(:web_push_encryption, :vapid_details), :public_key) + vapid_public_key = Keyword.get(Pleroma.Web.Push.vapid_config(), :public_key) data = %{ name: Keyword.get(instance, :name), From ec0e613ecaa8dc411e0c821c4c9b2ca893b45f67 Mon Sep 17 00:00:00 2001 From: href Date: Mon, 10 Dec 2018 15:50:10 +0100 Subject: [PATCH 09/12] Pleroma.Activity.mastodon_notification_type/1 --- lib/pleroma/activity.ex | 15 +++++ .../mastodon_api/mastodon_api_controller.ex | 65 +++++++------------ lib/pleroma/web/push/push.ex | 12 +--- 3 files changed, 41 insertions(+), 51 deletions(-) diff --git a/lib/pleroma/activity.ex b/lib/pleroma/activity.ex index c065f3b6c..200addd6e 100644 --- a/lib/pleroma/activity.ex +++ b/lib/pleroma/activity.ex @@ -3,6 +3,14 @@ defmodule Pleroma.Activity do alias Pleroma.{Repo, Activity, Notification} import Ecto.Query + # https://github.com/tootsuite/mastodon/blob/master/app/models/notification.rb#L19 + @mastodon_notification_types %{ + "Create" => "mention", + "Follow" => "follow", + "Announce" => "reblog", + "Like" => "favourite" + } + schema "activities" do field(:data, :map) field(:local, :boolean, default: true) @@ -88,4 +96,11 @@ def get_in_reply_to_activity(%Activity{data: %{"object" => %{"inReplyTo" => ap_i end def get_in_reply_to_activity(_), do: nil + + for {ap_type, type} <- @mastodon_notification_types do + def mastodon_notification_type(%Activity{data: %{"type" => unquote(ap_type)}}), + do: unquote(type) + end + + def mastodon_notification_type(%Activity{}), do: nil end diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index e105a1e15..4db7cd60f 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1055,52 +1055,37 @@ def empty_object(conn, _) do def render_notification(user, %{id: id, activity: activity, inserted_at: created_at} = _params) do actor = User.get_cached_by_ap_id(activity.data["actor"]) + parent_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"]) + mastodon_type = Activity.mastodon_notification_type(activity) - created_at = - NaiveDateTime.to_iso8601(created_at) - |> String.replace(~r/(\.\d+)?$/, ".000Z", global: false) + response = %{ + id: to_string(id), + type: mastodon_type, + created_at: CommonAPI.Utils.to_masto_date(activity.inserted_at), + account: AccountView.render("account.json", %{user: actor, for: user}) + } - id = id |> to_string - - case activity.data["type"] do - "Create" -> - %{ - id: id, - type: "mention", - created_at: created_at, - account: AccountView.render("account.json", %{user: actor, for: user}), + case mastodon_type do + "mention" -> + response + |> Map.merge(%{ status: StatusView.render("status.json", %{activity: activity, for: user}) - } + }) - "Like" -> - liked_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"]) + "favourite" -> + response + |> Map.merge(%{ + status: StatusView.render("status.json", %{activity: parent_activity, for: user}) + }) - %{ - id: id, - type: "favourite", - created_at: created_at, - account: AccountView.render("account.json", %{user: actor, for: user}), - status: StatusView.render("status.json", %{activity: liked_activity, for: user}) - } + "reblog" -> + response + |> Map.merge(%{ + status: StatusView.render("status.json", %{activity: parent_activity, for: user}) + }) - "Announce" -> - announced_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"]) - - %{ - id: id, - type: "reblog", - created_at: created_at, - account: AccountView.render("account.json", %{user: actor, for: user}), - status: StatusView.render("status.json", %{activity: announced_activity, for: user}) - } - - "Follow" -> - %{ - id: id, - type: "follow", - created_at: created_at, - account: AccountView.render("account.json", %{user: actor, for: user}) - } + "follow" -> + response _ -> nil diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index 35e14c243..8fa28ee8e 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -54,7 +54,7 @@ def handle_cast( when type in @types do actor = User.get_cached_by_ap_id(notification.activity.data["actor"]) - type = format_type(notification) + type = Pleroma.Activity.mastodon_notification_type(notification.activity) Subscription |> where(user_id: ^user_id) @@ -114,16 +114,6 @@ def handle_cast({:send, _}, state) do {:noreply, state} end - # https://github.com/tootsuite/mastodon/blob/master/app/models/notification.rb#L19 - defp format_type(%{activity: %{data: %{"type" => type}}}) do - case type do - "Create" -> "mention" - "Follow" -> "follow" - "Announce" -> "reblog" - "Like" -> "favourite" - end - end - defp format_title(%{activity: %{data: %{"type" => type}}}) do case type do "Create" -> "New Mention" From 0b4c61e8d5a8a24be44aa6bf48c404b47289d0a8 Mon Sep 17 00:00:00 2001 From: href Date: Fri, 14 Dec 2018 13:56:42 +0100 Subject: [PATCH 10/12] Fix warning --- lib/pleroma/web/mastodon_api/mastodon_api_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex index 4db7cd60f..0414d73d8 100644 --- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex +++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex @@ -1061,7 +1061,7 @@ def render_notification(user, %{id: id, activity: activity, inserted_at: created response = %{ id: to_string(id), type: mastodon_type, - created_at: CommonAPI.Utils.to_masto_date(activity.inserted_at), + created_at: CommonAPI.Utils.to_masto_date(created_at), account: AccountView.render("account.json", %{user: actor, for: user}) } From ef10e08efe11d6b796a47a41994caf4cb418ca01 Mon Sep 17 00:00:00 2001 From: Haelwenn Date: Fri, 14 Dec 2018 15:06:04 +0000 Subject: [PATCH 11/12] Update config.md --- config/config.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/config.md b/config/config.md index 25e0b5012..d4dad77b1 100644 --- a/config/config.md +++ b/config/config.md @@ -155,7 +155,7 @@ config :pleroma, :mrf_user_allowlist, "example.org": ["https://example.org/users/admin"] ``` -## :web_push_encryption +## :web_push_encryption, :vapid_details Web Push Notifications configuration. You can use the mix task `mix web_push.gen.keypair` to generate it. From 412df2cd3845802daf80c6d45db13f23f1e1b78b Mon Sep 17 00:00:00 2001 From: href Date: Fri, 14 Dec 2018 16:17:27 +0100 Subject: [PATCH 12/12] Warn if push is disabled.. --- lib/pleroma/web/push/push.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pleroma/web/push/push.ex b/lib/pleroma/web/push/push.ex index 8fa28ee8e..477943450 100644 --- a/lib/pleroma/web/push/push.ex +++ b/lib/pleroma/web/push/push.ex @@ -32,7 +32,7 @@ def send(notification) do end def init(:ok) do - if enabled() do + if !enabled() do Logger.warn(""" VAPID key pair is not found. If you wish to enabled web push, please run