diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 11 | ||||
-rw-r--r-- | lib/pleroma/web/activity_pub/activity_pub.ex | 66 | ||||
-rw-r--r-- | lib/pleroma/web/activity_pub/transmogrifier.ex | 24 | ||||
-rw-r--r-- | lib/pleroma/web/web_finger/web_finger.ex | 6 |
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 |