aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorlambda <pleromagit@rogerbraun.net>2017-11-03 08:56:44 +0000
committerlambda <pleromagit@rogerbraun.net>2017-11-03 08:56:44 +0000
commitfa1f11e8e9c31b0ed2857ca3c3feb78552ed54d0 (patch)
tree558115d281c48d6546376652a110d08ee1e4ff8b /lib
parent8a1a7191fd9348fb35fc1aa322dd90869c7dfceb (diff)
parentc6b9b777dacef2fce51e43a25e3af9c9fac9a87e (diff)
downloadpleroma-fa1f11e8e9c31b0ed2857ca3c3feb78552ed54d0.tar.gz
Merge branch 'feature/blocks' into 'develop'
Feature/blocks See merge request pleroma/pleroma!5
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/notification.ex8
-rw-r--r--lib/pleroma/user.ex24
-rw-r--r--lib/pleroma/web/activity_pub/activity_pub.ex11
-rw-r--r--lib/pleroma/web/mastodon_api/mastodon_api_controller.ex39
-rw-r--r--lib/pleroma/web/mastodon_api/views/account_view.ex2
-rw-r--r--lib/pleroma/web/router.ex7
-rw-r--r--lib/pleroma/web/twitter_api/twitter_api.ex5
7 files changed, 86 insertions, 10 deletions
diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex
index 35f817d1d..00a382f31 100644
--- a/lib/pleroma/notification.ex
+++ b/lib/pleroma/notification.ex
@@ -46,9 +46,11 @@ defmodule Pleroma.Notification do
# TODO move to sql, too.
def create_notification(%Activity{} = activity, %User{} = user) do
- notification = %Notification{user_id: user.id, activity_id: activity.id}
- {:ok, notification} = Repo.insert(notification)
- notification
+ unless User.blocks?(user, %{ap_id: activity.data["actor"]}) do
+ notification = %Notification{user_id: user.id, activity_id: activity.id}
+ {:ok, notification} = Repo.insert(notification)
+ notification
+ end
end
end
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 5f1750035..771c54e81 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -293,4 +293,28 @@ defmodule Pleroma.User do
limit: 20
Repo.all(q)
end
+
+ def block(user, %{ap_id: ap_id}) do
+ blocks = user.info["blocks"] || []
+ new_blocks = Enum.uniq([ap_id | blocks])
+ new_info = Map.put(user.info, "blocks", new_blocks)
+
+ cs = User.info_changeset(user, %{info: new_info})
+ Repo.update(cs)
+ end
+
+ def unblock(user, %{ap_id: ap_id}) do
+ blocks = user.info["blocks"] || []
+ new_blocks = List.delete(blocks, ap_id)
+ new_info = Map.put(user.info, "blocks", new_blocks)
+
+ cs = User.info_changeset(user, %{info: new_info})
+ Repo.update(cs)
+ end
+
+ def blocks?(user, %{ap_id: ap_id}) do
+ blocks = user.info["blocks"] || []
+ Enum.member?(blocks, ap_id)
+ end
+
end
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 71e52cb46..a62be2511 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -93,10 +93,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
end
end
- def fetch_activities_for_context(context) do
+ def fetch_activities_for_context(context, opts \\ %{}) do
query = from activity in Activity,
where: fragment("?->>'type' = ? and ?->>'context' = ?", activity.data, "Create", activity.data, ^context),
order_by: [desc: :id]
+ query = restrict_blocked(query, opts)
Repo.all(query)
end
@@ -163,6 +164,13 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
where: activity.id > ^since
end
+ defp restrict_blocked(query, %{"blocking_user" => %User{info: info}}) do
+ blocks = info["blocks"] || []
+ from activity in query,
+ where: fragment("not (?->>'actor' = ANY(?))", activity.data, ^blocks)
+ end
+ defp restrict_blocked(query, _), do: query
+
def fetch_activities(recipients, opts \\ %{}) do
base_query = from activity in Activity,
limit: 20,
@@ -178,6 +186,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|> restrict_type(opts)
|> restrict_favorited_by(opts)
|> restrict_recent(opts)
+ |> restrict_blocked(opts)
|> Repo.all
|> Enum.reverse
end
diff --git a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
index 19e0be3a1..b1a54a4f1 100644
--- a/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
+++ b/lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
@@ -79,6 +79,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def home_timeline(%{assigns: %{user: user}} = conn, params) do
params = params
|> Map.put("type", ["Create", "Announce"])
+ |> Map.put("blocking_user", user)
activities = ActivityPub.fetch_activities([user.ap_id | user.following], params)
|> Enum.reverse
@@ -92,6 +93,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
params = params
|> Map.put("type", ["Create", "Announce"])
|> Map.put("local_only", !!params["local"])
+ |> Map.put("blocking_user", user)
activities = ActivityPub.fetch_public_activities(params)
|> Enum.reverse
@@ -123,7 +125,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
def get_context(%{assigns: %{user: user}} = conn, %{"id" => id}) do
with %Activity{} = activity <- Repo.get(Activity, id),
- activities <- ActivityPub.fetch_activities_for_context(activity.data["object"]["context"]),
+ activities <- ActivityPub.fetch_activities_for_context(activity.data["object"]["context"], %{"blocking_user" => user}),
activities <- activities |> Enum.filter(fn (%{id: aid}) -> to_string(aid) != to_string(id) end),
grouped_activities <- Enum.group_by(activities, fn (%{id: id}) -> id < activity.id end) do
result = %{
@@ -246,6 +248,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
params = params
|> Map.put("type", "Create")
|> Map.put("local_only", !!params["local"])
+ |> Map.put("blocking_user", user)
activities = ActivityPub.fetch_public_activities(params)
|> Enum.reverse
@@ -308,6 +311,39 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
end
end
+ def block(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
+ with %User{} = blocked <- Repo.get(User, id),
+ {:ok, blocker} <- User.block(blocker, blocked) do
+ render conn, AccountView, "relationship.json", %{user: blocker, target: blocked}
+ else
+ {:error, message} = err ->
+ conn
+ |> put_resp_content_type("application/json")
+ |> send_resp(403, Poison.encode!(%{"error" => message}))
+ end
+ end
+
+ def unblock(%{assigns: %{user: blocker}} = conn, %{"id" => id}) do
+ with %User{} = blocked <- Repo.get(User, id),
+ {:ok, blocker} <- User.unblock(blocker, blocked) do
+ render conn, AccountView, "relationship.json", %{user: blocker, target: blocked}
+ else
+ {:error, message} = err ->
+ conn
+ |> put_resp_content_type("application/json")
+ |> send_resp(403, Poison.encode!(%{"error" => message}))
+ end
+ end
+
+ # TODO: Use proper query
+ def blocks(%{assigns: %{user: user}} = conn, _) do
+ with blocked_users <- user.info["blocks"] || [],
+ accounts <- Enum.map(blocked_users, fn (ap_id) -> User.get_cached_by_ap_id(ap_id) end) do
+ res = AccountView.render("accounts.json", users: accounts, for: user, as: :user)
+ json(conn, res)
+ end
+ end
+
def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
accounts = User.search(query, params["resolve"] == "true")
@@ -338,6 +374,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
params = conn
|> Map.put("type", "Create")
|> Map.put("favorited_by", user.ap_id)
+ |> Map.put("blocking_user", user)
activities = ActivityPub.fetch_activities([], params)
|> Enum.reverse
diff --git a/lib/pleroma/web/mastodon_api/views/account_view.ex b/lib/pleroma/web/mastodon_api/views/account_view.ex
index ff02587d6..cf97ab746 100644
--- a/lib/pleroma/web/mastodon_api/views/account_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/account_view.ex
@@ -55,7 +55,7 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
id: target.id,
following: User.following?(user, target),
followed_by: User.following?(target, user),
- blocking: false,
+ blocking: User.blocks?(user, target),
muting: false,
requested: false,
domain_blocking: false
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index 1fb5eadf6..f96ec7213 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -58,14 +58,15 @@ defmodule Pleroma.Web.Router do
get "/accounts/search", MastodonAPIController, :account_search
post "/accounts/:id/follow", MastodonAPIController, :follow
post "/accounts/:id/unfollow", MastodonAPIController, :unfollow
- post "/accounts/:id/block", MastodonAPIController, :relationship_noop
- post "/accounts/:id/unblock", MastodonAPIController, :relationship_noop
+ post "/accounts/:id/block", MastodonAPIController, :block
+ post "/accounts/:id/unblock", MastodonAPIController, :unblock
post "/accounts/:id/mute", MastodonAPIController, :relationship_noop
post "/accounts/:id/unmute", MastodonAPIController, :relationship_noop
post "/follows", MastodonAPIController, :follow
- get "/blocks", MastodonAPIController, :empty_array
+ get "/blocks", MastodonAPIController, :blocks
+
get "/domain_blocks", MastodonAPIController, :empty_array
get "/follow_requests", MastodonAPIController, :empty_array
get "/mutes", MastodonAPIController, :empty_array
diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex
index d5c5cf5cf..912d5e278 100644
--- a/lib/pleroma/web/twitter_api/twitter_api.ex
+++ b/lib/pleroma/web/twitter_api/twitter_api.ex
@@ -14,17 +14,20 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
end
def fetch_friend_statuses(user, opts \\ %{}) do
+ opts = Map.put(opts, "blocking_user", user)
ActivityPub.fetch_activities([user.ap_id | user.following], opts)
|> activities_to_statuses(%{for: user})
end
def fetch_public_statuses(user, opts \\ %{}) do
opts = Map.put(opts, "local_only", true)
+ opts = Map.put(opts, "blocking_user", user)
ActivityPub.fetch_public_activities(opts)
|> activities_to_statuses(%{for: user})
end
def fetch_public_and_external_statuses(user, opts \\ %{}) do
+ opts = Map.put(opts, "blocking_user", user)
ActivityPub.fetch_public_activities(opts)
|> activities_to_statuses(%{for: user})
end
@@ -41,7 +44,7 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
def fetch_conversation(user, id) do
with context when is_binary(context) <- conversation_id_to_context(id),
- activities <- ActivityPub.fetch_activities_for_context(context),
+ activities <- ActivityPub.fetch_activities_for_context(context, %{"blocking_user" => user}),
statuses <- activities |> activities_to_statuses(%{for: user})
do
statuses