Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
4 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/pleroma/webhook.ex b/lib/pleroma/webhook.ex
index 83ce344fa..9a1806f71 100644
--- a/lib/pleroma/webhook.ex
+++ b/lib/pleroma/webhook.ex
@@ -1,97 +1,85 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.Webhook do
use Ecto.Schema
import Ecto.Changeset
import Ecto.Query
alias Pleroma.EctoType.ActivityPub.ObjectValidators
alias Pleroma.Repo
@event_types [:"account.created", :"report.created"]
schema "webhooks" do
field(:url, ObjectValidators.Uri)
field(:events, {:array, Ecto.Enum}, values: @event_types, default: [])
field(:secret, :string, default: "")
field(:enabled, :boolean, default: true)
field(:internal, :boolean, default: false)
timestamps()
end
def get(id), do: Repo.get(__MODULE__, id)
def get_by_type(type) do
__MODULE__
|> where([w], ^type in w.events)
|> where([w], w.enabled == true)
|> Repo.all()
end
def changeset(%__MODULE__{} = webhook, params) do
webhook
|> cast(params, [:url, :events, :enabled, :internal])
|> validate_required([:url, :events])
|> unique_constraint(:url)
- |> strip_events()
|> put_secret()
end
def update_changeset(%__MODULE__{} = webhook, params \\ %{}) do
webhook
|> cast(params, [:url, :events, :enabled, :internal])
|> unique_constraint(:url)
- |> strip_events()
end
def create(params) do
%__MODULE__{}
|> changeset(params)
|> Repo.insert()
end
def update(%__MODULE__{} = webhook, params) do
webhook
|> update_changeset(params)
|> Repo.update()
end
def delete(webhook), do: webhook |> Repo.delete()
def rotate_secret(%__MODULE__{} = webhook) do
webhook
|> cast(%{}, [])
|> put_secret()
|> Repo.update()
end
def set_enabled(%__MODULE__{} = webhook, enabled) do
webhook
|> cast(%{enabled: enabled}, [:enabled])
|> Repo.update()
end
- defp strip_events(changeset) do
- case get_change(changeset, :events) do
- nil ->
- changeset
-
- events ->
- put_change(changeset, :events, Enum.filter(events, &(&1 in @event_types)))
- end
- end
-
defp put_secret(changeset) do
changeset
|> put_change(:secret, generate_secret())
end
defp generate_secret do
Base.encode16(:crypto.strong_rand_bytes(20))
|> String.downcase()
end
end
diff --git a/test/pleroma/webhook_test.exs b/test/pleroma/webhook_test.exs
index ea1408708..1f64d350f 100644
--- a/test/pleroma/webhook_test.exs
+++ b/test/pleroma/webhook_test.exs
@@ -1,57 +1,67 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Pleroma.WebhookTest do
use Pleroma.DataCase, async: true
alias Pleroma.Webhook
test "creating a webhook" do
{:ok, %{id: id}} =
Webhook.create(%{url: "https://example.com/webhook", events: [:"report.created"]})
assert %{url: "https://example.com/webhook"} = Webhook.get(id)
end
test "editing a webhook" do
{:ok, %{id: id} = webhook} =
Webhook.create(%{url: "https://example.com/webhook", events: [:"report.created"]})
Webhook.update(webhook, %{events: [:"account.created"]})
assert %{events: [:"account.created"]} = Webhook.get(id)
end
+ test "rejects invalid events" do
+ assert {:error, _changeset} =
+ Webhook.create(%{url: "https://example.com/webhook", events: [:"status.created"]})
+
+ {:ok, webhook} =
+ Webhook.create(%{url: "https://example.com/valid-webhook", events: [:"report.created"]})
+
+ assert {:error, _changeset} = Webhook.update(webhook, %{events: [:"status.created"]})
+ end
+
test "filter webhooks by type" do
{:ok, %{id: id1}} =
Webhook.create(%{url: "https://example.com/webhook1", events: [:"report.created"]})
{:ok, %{id: id2}} =
Webhook.create(%{
url: "https://example.com/webhook2",
events: [:"account.created", :"report.created"]
})
Webhook.create(%{url: "https://example.com/webhook3", events: [:"account.created"]})
assert [%{id: ^id1}, %{id: ^id2}] = Webhook.get_by_type(:"report.created")
end
test "change webhook state" do
{:ok, %{id: id, enabled: true} = webhook} =
Webhook.create(%{url: "https://example.com/webhook", events: [:"report.created"]})
Webhook.set_enabled(webhook, false)
assert %{enabled: false} = Webhook.get(id)
end
test "rotate webhook secrets" do
{:ok, %{id: id, secret: secret} = webhook} =
Webhook.create(%{url: "https://example.com/webhook", events: [:"report.created"]})
Webhook.rotate_secret(webhook)
%{secret: new_secret} = Webhook.get(id)
assert secret != new_secret
end
end

File Metadata

Mime Type
text/x-diff
Expires
Fri, Oct 30, 9:35 PM (15 h, 30 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1800572
Default Alt Text
(4 KB)

Event Timeline