aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/user.ex11
-rw-r--r--lib/pleroma/web/activity_pub/activity_pub.ex66
-rw-r--r--lib/pleroma/web/activity_pub/transmogrifier.ex24
-rw-r--r--lib/pleroma/web/web_finger/web_finger.ex6
4 files changed, 74 insertions, 33 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 8c1c524ff..2ae01c2cc 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -99,7 +99,7 @@ defmodule Pleroma.User do
|> cast(params, [:bio, :name])
|> unique_constraint(:nickname)
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
- |> validate_length(:bio, min: 1, max: 1000)
+ |> validate_length(:bio, min: 1, max: 5000)
|> validate_length(:name, min: 1, max: 100)
end
@@ -108,8 +108,8 @@ defmodule Pleroma.User do
|> cast(params, [:bio, :name, :info, :follower_address, :avatar])
|> unique_constraint(:nickname)
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
- |> validate_length(:bio, min: 1, max: 1000)
- |> validate_length(:name, min: 1, max: 100)
+ |> validate_length(:bio, max: 5000)
+ |> validate_length(:name, max: 100)
end
def password_update_changeset(struct, params) do
@@ -218,6 +218,11 @@ defmodule Pleroma.User do
end
end
+ def invalidate_cache(user) do
+ Cachex.del(:user_cache, "ap_id:#{user.ap_id}")
+ Cachex.del(:user_cache, "nickname:#{user.nickname}")
+ end
+
def get_cached_by_ap_id(ap_id) do
key = "ap_id:#{ap_id}"
Cachex.get!(:user_cache, key, fallback: fn(_) -> get_by_ap_id(ap_id) end)
diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index a2f8ada9c..87ad45249 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -62,6 +62,16 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
end
end
+ def update(%{to: to, cc: cc, actor: actor, object: object} = params) do
+ local = !(params[:local] == false) # only accept false as false value
+
+ with data <- %{"to" => to, "cc" => cc, "type" => "Update", "actor" => actor, "object" => object},
+ {:ok, activity} <- insert(data, local),
+ :ok <- maybe_federate(activity) do
+ {:ok, activity}
+ end
+ end
+
# TODO: This is weird, maybe we shouldn't check here if we can make the activity.
def like(%User{ap_id: ap_id} = user, %Object{data: %{"id" => _}} = object, activity_id \\ nil, local \\ true) do
with nil <- get_existing_like(ap_id, object),
@@ -260,34 +270,38 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
Repo.insert(%Object{data: data})
end
+ def user_data_from_user_object(data) do
+ avatar = data["icon"]["url"] && %{
+ "type" => "Image",
+ "url" => [%{"href" => data["icon"]["url"]}]
+ }
+
+ banner = data["image"]["url"] && %{
+ "type" => "Image",
+ "url" => [%{"href" => data["image"]["url"]}]
+ }
+
+ user_data = %{
+ ap_id: data["id"],
+ info: %{
+ "ap_enabled" => true,
+ "source_data" => data,
+ "banner" => banner
+ },
+ avatar: avatar,
+ nickname: "#{data["preferredUsername"]}@#{URI.parse(data["id"]).host}",
+ name: data["name"],
+ follower_address: data["followers"],
+ bio: data["summary"]
+ }
+
+ {:ok, user_data}
+ end
+
def fetch_and_prepare_user_from_ap_id(ap_id) do
with {:ok, %{status_code: 200, body: body}} <- @httpoison.get(ap_id, ["Accept": "application/activity+json"]),
- {:ok, data} <- Poison.decode(body)
- do
- avatar = %{
- "type" => "Image",
- "url" => [%{"href" => data["icon"]["url"]}]
- }
-
- banner = %{
- "type" => "Image",
- "url" => [%{"href" => data["image"]["url"]}]
- }
-
- user_data = %{
- ap_id: data["id"],
- info: %{
- "ap_enabled" => true,
- "source_data" => data,
- "banner" => banner
- },
- avatar: avatar,
- nickname: "#{data["preferredUsername"]}@#{URI.parse(ap_id).host}",
- name: data["name"],
- follower_address: data["followers"],
- }
-
- {:ok, user_data}
+ {:ok, data} <- Poison.decode(body) do
+ user_data_from_user_object(data)
else
e -> Logger.error("Could not user at fetch #{ap_id}, #{inspect(e)}")
end
diff --git a/lib/pleroma/web/activity_pub/transmogrifier.ex b/lib/pleroma/web/activity_pub/transmogrifier.ex
index 6714319fb..0d73ddc5d 100644
--- a/lib/pleroma/web/activity_pub/transmogrifier.ex
+++ b/lib/pleroma/web/activity_pub/transmogrifier.ex
@@ -24,7 +24,7 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
def fix_in_reply_to(%{"inReplyTo" => in_reply_to_id} = object) when not is_nil(in_reply_to_id) do
- case ActivityPub.fetch_object_from_id(object["inReplyToAtomUri"] || in_reply_to_id) do
+ case ActivityPub.fetch_object_from_id(in_reply_to_id) do
{:ok, replied_object} ->
activity = Activity.get_create_activity_by_object_ap_id(replied_object.data["id"])
object
@@ -117,6 +117,28 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
end
end
+ def handle_incoming(%{"type" => "Update", "object" => %{"type" => "Person"} = object, "actor" => actor_id} = data) do
+ with %User{ap_id: ^actor_id} = actor <- User.get_by_ap_id(object["id"]) do
+ {:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)
+
+ banner = new_user_data[:info]["banner"]
+ update_data = new_user_data
+ |> Map.take([:name, :bio, :avatar])
+ |> Map.put(:info, Map.merge(actor.info, %{"banner" => banner}))
+
+ actor
+ |> User.upgrade_changeset(update_data)
+ |> Repo.update
+
+ User.invalidate_cache(actor)
+ ActivityPub.update(%{local: false, to: data["to"] || [], cc: data["cc"] || [], object: object, actor: actor_id})
+ else
+ e ->
+ Logger.error(e)
+ :error
+ end
+ end
+
# TODO
# Accept
# Undo
diff --git a/lib/pleroma/web/web_finger/web_finger.ex b/lib/pleroma/web/web_finger/web_finger.ex
index 3cd849de4..7576ea28a 100644
--- a/lib/pleroma/web/web_finger/web_finger.ex
+++ b/lib/pleroma/web/web_finger/web_finger.ex
@@ -60,9 +60,9 @@ defmodule Pleroma.Web.WebFinger do
else
{:ok, pem} = Salmon.generate_rsa_pem
info = Map.put(info, "keys", pem)
- Cachex.del(:user_cache, "ap_id:#{user.ap_id}")
- Cachex.del(:user_cache, "nickname:#{user.nickname}")
- Repo.update(Ecto.Changeset.change(user, info: info))
+ res = Repo.update(Ecto.Changeset.change(user, info: info))
+ User.invalidate_cache(user)
+ res
end
end